gpt4 book ai didi

C++ : how can I fourier transform an array into an other array of different size using fftw3

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:52 25 4
gpt4 key购买 nike

我需要将具有整数值的数组傅里叶变换到频域(以便稍后将其与另一个数组相乘)。输出数组的大小必须为 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;
}

非常感谢您的回答

最佳答案

作为算法的基本数学前提,离散傅里叶变换总是会产生与输入大小相同的输出,而这一点在FFTW中体现为只接受一个大小参数。这是因为对于时域中 N 个离散值的数组,恰好有 N 个可能的唯一频率在起作用,每单位时间从 0 到 N-1 个周期(这个单位是输入的时间长度)。

您可以将输入的大小放大或缩小到 44100 个值,方法是实质上拉伸(stretch)输入并对其值进行插值以创建适合所需长度的新数组,然后执行傅立叶变换。我建议您在输入时域而不是频域上执行此拉伸(stretch),以避免出现不需要的伪像。

关于C++ : how can I fourier transform an array into an other array of different size using fftw3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com