c ++:如何使用fftw3将数组转换为不同大小的其他数组

时间:2016-06-29 20:53:30

标签: c++ c fft convolution fftw

我需要将具有整数值的数组傅里叶变换到频域(以便稍后将其与另一个相乘)。输出数组的大小必须为44100,但输入数组会有所不同。

我认为fftw3是一个很好的工具。但是,如何为输入和输出创建具有不同数组大小的“计划”?

这是我写的函数:

fftw_complex* fourier( int* samples, int numberOfSamples ){

    fftw_complex* input;
    fftw_complex* output;
    fftw_plan plan;
    input = (fftw_complex*)fftw_malloc( sizeof(fftw_complex)*numberOfSamples );
    output = (fftw_complex*)fftw_malloc( sizeof(fftw_complex)*44100 );                  //cd-quality

    plan = fftw_plan_dft_1d( 44100, input, output, FFTW_FORWARD, FFTW_ESTIMATE );
    // here is the problem because  ^this
    // array has a different size than
    //                                     ^this array

    for( size_t index = 0; index < numberOfSamples; index++ ){
        input[index][0] = (double)(samples[index]);
        input[index][1] = 0;
    }
    fftw_execute(plan);
    fftw_destroy_plan(plan);
    fftw_free(input);
    return output;
}

非常感谢回答

1 个答案:

答案 0 :(得分:3)

离散傅立叶变换将始终产生与其输入具有相同大小的输出,作为算法的基本数学前提,并且这通过仅采用一个尺寸参数反映在FFTW中。这是因为对于时域中的N个离散值阵列,正好有N个可能的独特频率,每单位时间从0到N-1个周期(此单位是您输入的时间长度)。 / p>

您可以通过基本拉伸输入并插入其值以创建符合所需长度的新数组,然后执行傅立叶变换,将输入的大小向上或向下缩放到44100值。我建议您在输入时域而不是在频域上执行此拉伸,以避免不必要的伪像。