使用ARM DSP库和MatLab计算FFT时产生的结果相互矛盾

时间:2016-04-01 14:30:44

标签: c arm signal-processing fft stm32

我正在尝试使用STM32L4微处理器计算FFT,但结果却很奇怪。 我从SD卡读取.wav文件,删除填充并在数组中存储1024字节的数据。 我已经通过在我的电脑上的十六进制编辑器中打开相同的wav文件来确认此数据是正确的。 当我在MatLab中计算FFT并获取其幅度时,对应于输入正弦波频率的频率仓匹配。在我的C代码中不是这种情况(如我正在使用的Keil调试器中所示)。 ARM DSP库给出的值与MatLab中产生的值之间几乎没有任何关联,对于例如MatLab = 5.2中的bin [0],C = 131246中的bin [0] ......有些事情发生了! (见编辑......) 我已经尝试了两种不同版本的FFT,我将在下面包含它们:

/* Carry out an FFT on the (correctly formatted) input data */
arm_cfft_f32(&arm_cfft_sR_f32_len1024, inputBuffer, IFFTFLAG, BRFLAG);
/* Calculate the complex magnitude of the FFT */
arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFTSIZE);

弃用的代码:

arm_cfft_radix4_instance_f32 S;
arm_cfft_radix4_init_f32(&S, FFTSIZE, IFFTFLAG, BITREVERSEFLAG);
arm_cfft_radix4_f32(&S, inputBuffer);
arm_cmplx_mag_f32(inputBuffer, outputBuffer, FFTSIZE);   

两者都会产生相同(错误)的值。在C中完成的所有预处理都是正确的,我形成一个长度为FFTSIZE * 2的数组,排列如下: Re [0],Im [0],Re [1],Im [1],...,Re [1023],Im [1023]。

任何想法或帮助将不胜感激! :)

编辑: 我已经意识到除了DC bin之外,两个计算之间的值实际上是相关的。 即,对于两个计算,bin 47具有最大值(这是有意义的,因为它是在22.05kHz采样的1kHz正弦波)。 任何想法为什么ARM DSP库如此大规模地扩展箱的输出?

1 个答案:

答案 0 :(得分:0)

arm_cfft_f32需要32位浮点样本数据。而.wav文件通常包含16位little-endian有符号整数样本。

相关问题