Hi there! I have a few problems when generating a “fHat” matrix of a NFFT (using package NFFT) vs when dealing with the inverse fft of my own (imperfect) adquisition. Let me illustrate.
I’m simulating a regular Gradient Echo Sequence (unspoiled), for MRF applications. I don’t need a perfect-quality image, that’s why the MRF is for, but I do need a consistent, precise reconstruction of each separate spoke. The number of samples of the ADC is 256 for each Echo, and I’m using 15 spokes (for Tiny Golden Angle approximations). For the simulation I’m running on KomaMRI and MRIReco packages. MRIReco (for what I have studied) can’t be used for MRF applications, or at least is quite hard, because of how the information is encoded.
My first (rustic, so to speak) method consisted of taking each vector of samples (of which there are 15), then putting them on a 256x256 matrix horizontally, and then rotating it by the angle they were acquired, and then clipping the results (as the rotated image is generally bigger than the original). The kspace looks like this:
Knowing the kspace could have some problems because of symmetry, I used the NFFT package for doing quite the same. I made a list of the datapoints and the position of each one, then made a plan (NFFT, “image”). But the resulting kspace isn’t quite defined as the previous one. Let me show you both kspaces (first, my own kspace, second, the kspace obtained with NFFT (standard configurations)). The log1p(abs(image)) is shown for demonstration and clarity purposes.
(I was permitted only one picture, this is of the iNFFT of the data)
My question is, is that normal and/or ok? Is the second kspace the nearest to reality? I mean, I don’t think so, but it could be I’m doing the NFFT wrong, so if to anyone this has happened before, please respond. The first kspace looks OK, with black in the sides, and although it presents banding, is not much as the second image because of the horizontal strike it has.
A simple code to test would be something like this:
using NFFT, Plots, LinearAlgebra, ImageView, Images, Random
Random.seed!(1234)
angles = [π * i / 15 for i in 0:14]
radii = range(-0.5, 0.5, 256)
k_points = zeros(2, size(f, 1))
global ind = 1
for i in range(1, 15)
for j in range(1, size(radii, 1))
local r = radii[j]
global ind
k_points[1, ind] = r.*cos(angles[i])
k_points[2, ind] = r.*sin(angles[i])
ind +=1
end
end
k_points = Float64.(k_points)
f = randn(ComplexF64, J)
p = plan_nfft(k_points, (N, N), reltol = 1e-9)
fHat = adjoint(p) * f
ftfHat = fftshift(fft(fHat))
imshow(log1p.(abs.(ftfHat)))
x = k_points[1, :]
y = k_points[2, :]
Plots.scatter(x, y, ratio = 1)
Although this doesn’t generate the banding artifacts;
If anyone needs code or the source files, let me know.
Thanks dearly,
Mati.