我需要将具有整数值的数组傅里叶变换到频域(以便稍后将其与另一个相乘)。输出数组的大小必须为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;
}
非常感谢回答
答案 0 :(得分:3)
离散傅立叶变换将始终产生与其输入具有相同大小的输出,作为算法的基本数学前提,并且这通过仅采用一个尺寸参数反映在FFTW中。这是因为对于时域中的N个离散值阵列,正好有N个可能的独特频率,每单位时间从0到N-1个周期(此单位是您输入的时间长度)。 / p>
您可以通过基本拉伸输入并插入其值以创建符合所需长度的新数组,然后执行傅立叶变换,将输入的大小向上或向下缩放到44100值。我建议您在输入时域而不是在频域上执行此拉伸,以避免不必要的伪像。