使用CMSIS的逆FFT是错误的



我正试图对信号执行FFT,并使用生成的数据通过IFFT检索原始样本。我在带有M3的STM32上使用CMSIS DSP库。

我的问题是理解FFT的缩放,以及如何获得正确的IFFT。目前,IFFT会产生与输入类似的波,但点的比例在原始波的120x-140x之间。这仅仅是q15精度误差的结果吗?我是否将IFFT结果缩放了7位?我的代码低于

该文献还提到";对于RIFFT,源缓冲区的长度必须至少为fftLenReal+2。最后两个元素必须等于RFFT将生成的元素:(pSrc[0]-pSrc[1](>gt;1和0";。这是干什么用的?将这些运算分别应用于FFT_SIZE2-2和FFT_SIZE2-1并没有改变IFFT的结果。

//128 point FFT
#define FFT_SIZE 128
arm_rfft_instance_q15 fft_instance;
arm_rfft_instance_q15 ifft_instance;
//time domain signal buffers
float32_t sinetbl_in[FFT_SIZE];
float32_t sinetbl_out[FFT_SIZE];
//a copy for comparison after RFFT since function modifies input buffer
volatile q15_t fft_in_buf_cpy[FFT_SIZE];
q15_t fft_in_buf[FFT_SIZE];
//output for FFT, RFFT provides real and complex data organized as re[0], im[0], re[1], im[1]
q15_t fft_out_buf[FFT_SIZE*2];
q15_t fft_out_buf_mag[FFT_SIZE*2];
//inverse fft buffer result
q15_t ifft_out_buf[FFT_SIZE];
//generate 1kHz sinewave with a sample frequency of 8kHz for 128 samples, amplitude is 1
for(int i = 0; i < FFT_SIZE; ++i){
sinetbl_in[i] = arm_sin_f32(2*3.14*1000 *i/8000);
sinetbl_out[i] = 0;
}
//convert buffer to q15 (not enough flash to use f32 fft functions)
arm_float_to_q15(sinetbl_in, fft_in_buf, FFT_SIZE);
memcpy(fft_in_buf_cpy, fft_in_buf, FFT_SIZE*2);
//perform RFFT
arm_rfft_init_q15(&fft_instance, FFT_SIZE, 0, 1);
arm_rfft_q15(&fft_instance, fft_in_buf, fft_out_buf);
//calculate magnitude, skip 1st real and img numbers as they are DC and both real
arm_cmplx_mag_q15(fft_out_buf + 2, fft_out_buf_mag + 1, FFT_SIZE/2-1);
//weird operations described by documentation, does not change results
//fft_out_buf[FFT_SIZE*2 - 2] = (fft_out_buf[0] - fft_out_buf[1]) >> 1;
//fft_out_buf[FFT_SIZE*2 - 1] = 0;
//perform inverse FFT
arm_rfft_init_q15(&ifft_instance, FFT_SIZE, 1, 1);
arm_rfft_q15(&ifft_instance, fft_out_buf, ifft_out_buf);
//closest approximation to get to original scaling
//arm_shift_q15(ifft_out_buf, 7, ifft_out_buf, FFT_SIZE);
//convert back to float for comparison with input
arm_q15_to_float(ifft_out_buf, sinetbl_out, FFT_SIZE);

我觉得我用准确的评论回答了自己的问题,但我想确定一下。我做FFT的事情对吗?提前感谢

正如Cris所指出的,一些库跳过了规范化过程。CMSIS DSP就是其中一个库,因为它的目的是快速。对于CMSIS,根据FFT大小,您必须将数据左移一定量才能返回到原始范围。在我的情况下,FFT大小为128,还有幅度计算,正如我最初推测的那样,它是7。

最新更新