簡體   English   中英

使用FFTW_MEASURE時,FFT輸出為空白,但FFTW_ESTIMATE可以正常工作

[英]FFT output is blank when using FFTW_MEASURE, but works fine with FFTW_ESTIMATE

我試圖使用fftw3時遇到以下問題。 出於某種原因,每當我使用FFTW_MEASURE而不是FFTW_ESTIMATE進行FFT時,我得到空白輸出。 最終我正在嘗試實現fft卷積,所以下面的例子包括FFT和逆FFT。

很明顯我錯過了什么......是否有人能夠教育我? 謝謝!

我在Linux(OpenSUSE Leap 42.1)上,使用我的包管理器提供的fftw3版本。

最低工作示例:

#include <iostream>
#include <iomanip>
#include <cmath>
#include <fftw3.h>
using namespace std;


int main(int argc, char ** argv)
{
    int width = 10;    
    int height = 8;

    cout.setf(ios::fixed|ios::showpoint);
    cout << setprecision(2);

    double * inp = (double *) fftw_malloc(sizeof(double) * width * height);
    fftw_complex * cplx = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * height * (width/2 + 1));

    for(int i = 0; i < width * height; i++) inp[i] = sin(i);

    fftw_plan fft = fftw_plan_dft_r2c_2d(height, width, inp, cplx,  FFTW_MEASURE );
    fftw_plan ifft = fftw_plan_dft_c2r_2d(height, width, cplx, inp,  FFTW_MEASURE );

    fftw_execute(fft);

    for(int j = 0; j < height; j++)
    {
        for(int i = 0; i < (width/2 + 1); i++)
        {
            cout << cplx[i+width*j][0] << " ";
        }
        cout << endl;
    }
    cout << endl << endl;

    fftw_execute(ifft);

    for(int j = 0; j < height; j++)
    {
        for(int i = 0; i < width; i++)
        {
            cout << inp[i+width*j] << " ";
        }
        cout << endl;
    }

    fftw_destroy_plan(fft);
    fftw_destroy_plan(ifft);
    fftw_free(cplx);
    fftw_free(inp);

    return 0;
}

只需在FFTW_ESTIMATE和FFTW_MEASURE之間切換。

編譯:

g++ *.cpp -lm -lfftw3 --std=c++11

使用FFTW_ESTIMATE輸出(第一個塊是FT的實部,第二個塊是反FT后):

1.51 2.24 -1.52 -0.05 0.15 0.19 
0.23 0.15 1.77 1.19 0.54 0.41 
1.97 -0.15 -1.32 -2.51 -1.20 -3.38 
4.34 15.21 -24.82 -7.44 -4.16 -2.51 
-0.43 -0.06 1.55 2.93 -2.81 -0.42 
0.00 0.00 0.00 -nan 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 -nan 
0.00 0.00 0.00 0.00 0.00 0.00 


0.00 67.32 72.74 11.29 -60.54 -76.71 -22.35 52.56 79.15 32.97 
-43.52 -80.00 -42.93 33.61 79.25 52.02 -23.03 -76.91 -60.08 11.99 
73.04 66.93 -0.71 -67.70 -72.45 -10.59 61.00 76.51 21.67 -53.09 
-79.04 -32.32 44.11 79.99 42.33 -34.25 -79.34 -51.48 23.71 77.10 
59.61 -12.69 -73.32 -66.54 1.42 68.07 72.14 9.89 -61.46 -76.30 
-20.99 53.62 78.93 31.67 -44.70 -79.98 -41.72 34.89 79.43 50.94 
-24.38 -77.29 -59.13 13.39 73.60 66.15 -2.12 -68.44 -71.83 -9.18 
61.91 76.08 20.31 -54.14 -78.81 -31.02 45.29 79.96 41.12 -35.53

使用FFTW_MEASURE輸出(第一個塊是FT的實部,第二個塊是反FT后):

0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 -nan 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 -nan 
0.00 0.00 0.00 0.00 0.00 0.00 


0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

@Paul_R的評論。 足以解決問題。 可以在調用fftw_plan_dft_r2c_2d()修改輸入數組。 因此,必須在創建fftw計划初始化輸入數組。

FFTW的規划器標志文檔詳細說明了正在發生的事情。 我很確定你已經猜到了FFTW_ESTIMATE保留輸入數組並且FTTW_MEASURE修改它的原因。

重要提示:計划程序在計划期間會覆蓋輸入數組,除非保存的計划(請參閱Wisdom)可用於該問題,因此您應該在創建計划后初始化輸入數據。***唯一的例外是FFTW_ESTIMATE和FFTW_WISDOM_ONLY標志,如下所述。

...

  • FFTW_ESTIMATE指定使用簡單的啟發式算法來代替不同算法的實際測量,以快速選擇(可能是次優的)計划。 使用此標志,在計划期間不會覆蓋輸入/輸出數組。
  • FFTW_MEASURE告訴FFTW通過實際計算幾個FFT並測量它們的執行時間來找到優化的計划。 根據您的機器,這可能需要一些時間(通常是幾秒鍾)。 FFTW_MEASURE是默認計划選項。

...

文檔還告訴我們,標志FFTW_ESTIMATE將保留輸入。 然而,最好的建議是在創建計划后初始化陣列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM