1

フォワード FFT と IFFT (結果を正規化) を使用して実際の関数のコードをテストしましたが、これは正常に動作します。

ただし、実関数の二次導関数を取得したいと思います。簡単にするためにsin(2*pi*t)、テストケースとして取り上げます。これが私が使用する関連コードです(ライブラリ内のFFT関数):

int main(void)
{
    int i;
    int nyh = (N/2) + 1;

    double result_array[nyh][2];

    double x_k[nyh][2];
    double x_r[N];

    FILE* psit;
    psit=fopen("psitest.txt","w");  

    init();

    fft(x, result_array);  //function in a library, this has been tested
    psi(result_array, x_k);  
    ifft(x_k, x_r);        //function in a library, this has been tested

    for(i=0;i<N;i++)
    {
        fprintf(psit, "%f\n", x_r[i]);
    }


    fclose(psit);

    return 0;
}

void psi(double array[nyh][2], double out[nyh][2])
{
    int i;

    for ( i = 0; i < N/2; i++ )
    {
        out[i][0] = -4.0*pi*pi*i*i*array[i][0];
        out[i][1] = -4.0*pi*pi*i*i*array[i][1];
    }   
    out[N/2][0]=0.0;
    out[N/2][1]=0.0;
}

void init()
{
    int i;

    for(i=0;i<N;i++) 
    {
        x[i] = sin(2.0*pi*i/N);
    }
}

sin( 2*pi*t*K)問題は次のとおりです。このアルゴリズムは、K が整数である形式の任意の関数に対して完全に機能しますが、関数 をテスト関数として使用するsin(3*pi*t)と、アルゴリズムは失敗します。コーディングの間違いを見つけることができません。

k関数は実数であるため、半分の値を取得するだけでよいことに注意してください。これは問題ではありません。

4

2 に答える 2

1

My guess is that sin(3*pi*t) introduces a discontinuity, since it does not give an integer number of cycles in your sample interval. For most FFT-related applications you would apply a window function to deal with such discontinuities, but obviously this will introduce an error term into your derivative and I'm not sure whether you will be able to correct for this.

于 2011-06-23T10:47:26.337 に答える
0

あなたがこの問題を解決したかどうかわかりません... しかし、主な問題は sin(3 Pi t) が [0,1](sin(0) != sin (3 * Pi)))。

FFTが正常に動作しませんでした...

于 2012-04-03T17:57:39.123 に答える