适用于ARM CMSIS DSP fft函数的FFT长度

时间:2015-08-25 18:25:43

标签: arm signal-processing fft digital cmsis

我目前正在尝试在我的cortex m3 PSoC 5lp芯片上使用ARM CMSIS DSP库。
我使用一些函数遇到了一些问题,我对使用函数arm_cfft_q15(或任何arm_cfft_***函数)提出了疑问。

说我有

    q15_t ADC_samples[1024];
    q15_t MAG_of_fft[1024];

我跑

    arm_cfft_q15(1024pt_fft, ADC_samples, sample_length);

这就是变换'到位'。因此,由于FFT返回实数和虚数值,它实际上只能返回 一个长度为512的fft,或者是1024个FFT样本中的512个? 获得FFT后我做了

    arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength);

其中fftlength为1024。

这会返回MAG_of_fft,当我绘制它时,它确实看起来确实是我希望看到的形状,但我不知道如何解释结果,因为我不知道我有多长FFT正是如此。我告诉它我正在进行1024pt FFT,但它似乎只返回512pt FFT,或者只返回1024pt FFT的一半,一个或另一个。

所以我做对了吗?这意味着ADC_samples数组必须是其中数据的两倍,以便获得1024 pt FFT?然后我可以通过告诉它FFT的长度为1024来计算使用该2048阵列的FFT的幅度?

有人可以向我解释如何正确解释这些功能以及我应该期望的FFT长度吗?

1 个答案:

答案 0 :(得分:1)

arm_cfft系列函数对复值信号进行操作。换句话说,使用arm_cfft_q15执行的1024点FFT需要1024个复数输入样本,这些样本由2048个q15_t值表示(交错的实部和虚部,如CMSIS DSP Software Library documentation中所述)。返回时,缓冲区包含1024个复数值(2048 q15_t个值),对应于复数输入信号的频域表示。

因此,this example适应您的情况,您可以使用以下方法计算FFT:

q15_t ADC_samples[2048];
arm_cfft_q15(1024pt_fft, ADC_samples, 0, 1);

随后的电话

q15_t MAG_of_fft[1024];
arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength);

fftlength=1024然后将q15_t中的1024个复数值(2048 ADC_samples值)减少到1024个实数值(1024 q15_t个值),并将结果存储在MAG_of_fft

正如附注所示,如果你实际上在处理实值信号,那么你可以使用相同的函数并填充ADC_samples的每个第二个索引(虚部)带零的缓冲区(因此使用的ADC_samples缓冲区是实际样本数的两倍。或者,您可以使用效率更高的arm_rfft函数系列(在this section of the documentation中描述)。