在FFTW3中采用二阶导数

时间:2011-06-23 09:32:15

标签: c fftw derivative

我使用正向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值。这不是问题。

2 个答案:

答案 0 :(得分:1)

我的猜测是sin(3*pi*t)引入了不连续性,因为它不会在采样间隔中给出整数个周期。对于大多数与FFT相关的应用程序,您可以应用窗口函数来处理这种不连续性,但显然这会在您的派生中引入一个错误项,我不确定您是否能够对此进行更正。

答案 1 :(得分:0)

我不知道你是否解决了这个问题...但我猜主要问题是罪(3 Pi t)在域[0,1]中不是周期性的(sin(0)!= sin (3 * Pi))。

FFT无法正常工作......