2011-03-23 69 views
1

我使用fftwpp將我的數據和我的卷積內核轉換爲傅立葉空間,然後像標量乘積一樣將它們相乘,然後將它們轉換回真實空間。當我第一次運行該程序時,它會創建一個完全充滿零的數組。當我再次運行它時,它給了我期望的結果。fftwpp在卷積後創建一個零填充陣列

運行它時,會創建一個wisdom3.txt。如果我刪除它,程序會花費很多時間再次創建一個零填充數組。

我的代碼有什麼問題?

// 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); 

回答

3

FFTW ++是FFTW的封裝。 FFTW需要生成執行計劃以高效地處理數據。一旦生成計劃,it can be reused來處理各種數據集。您看到的文件wisdom3.txt是關於您的程序在第一次運行時生成的計劃的信息。一旦存在,它會在連續運行時加載,並允許程序運行得很快。如果刪除它,FFTW必須重新生成它,使程序再次運行緩慢。

至於你爲什麼在第一次運行時輸出爲零,是因爲這個計劃生成步驟。這在FFTW FAQ解釋。

總之,由於我沒有使用過FFTW ++,我不知道你應該調用確切的方法來確保在執行FT之前生成計劃。但是,在定義輸入/輸出數組之後,並在用數據初始化之前,應立即調用它。如果你需要多次運行你的代碼,你應該保留智慧文件。

+0

謝謝,我只是在聲明數組之後移動了變換的聲明,它現在可以在第一次運行時正常工作。 – 2011-03-24 09:58:06