fftwpp를 사용하여 내 데이터와 회선 커널을 푸리에 공간으로 변환하고 스칼라 곱과 같이 곱한 다음 다시 실제 공간으로 변환합니다. 프로그램을 처음 실행하면 완전히 0으로 채워지는 배열이 만들어집니다. 다시 실행하면 원하는 결과를 얻을 수 있습니다.fftwpp는 컨볼 루션 후에 0으로 채워진 배열을 만듭니다.
실행하는 동안 wisdom3.txt
이 생성됩니다. 삭제하면 프로그램이 0으로 채워진 배열을 다시 만드는 데 많은 시간이 걸립니다.
내 코드가 잘못되었습니다.
// sx, sy and sz are the dimensions of my data
int szp = sz/2 + 1;
size_t align = sizeof(Complex);
// creates arrays to store the data in, the double one is for the real data
// the Complex one for the fourier data
array3<double> f(sx, sy, sz, align);
array3<Complex> g(sx, sy, szp, align);
// copying data into double array
for(int k = 0; k < sz; k++)
for(int j = 0; j < sy; j++)
for(int i = 0; i < sx; i++)
f(i, j, k) = data[i + sx * j + sx * sy * k];
// transforming data into fourier space
rcfft3d Forward3(sz, f, g);
Forward3.fft(f, g);
// generate the kernel
array3<double> kernel(sx, sy, sz);
array3<Complex> kernel2(sx, sy, szp, align);
// more code to create the kernel left out ...
// transform the kernel into the fourier space
rcfft3d ForwardKernel3(sz, kernel, kernel2);
ForwardKernel3.fft(kernel, kernel2);
// multiplying data and kernel in fourier space together
for(int k = 0; k < szp; k++)
for(int j = 0; j < sy; j++)
for(int i = 0; i < sx; i++)
g(i, j, k) = g(i, j, k) * kernel2(i, j, k);
// transform back to normal space
crfft3d Backward3(sz, g, f);
Backward3.fftNormalized(g, f);
// putting everything in the results array and normalize
for(int k = 0; k < sz; k++)
for(int j = 0; j < sy; j++)
for(int i = 0; i < sx; i++)
result[i + sx * j + sx * sy * k] =
(f(i, j, k) >= thresholdValue ? f(i, j, k) : 0);
감사합니다. 배열의 선언 바로 뒤에서 변환의 선언을 옮겼습니다. 이제 첫 번째 실행에서 올바르게 작동합니다. –