2015-08-25 55 views
1

我目前正在尝试在我的cortex m3 PSoC 5lp芯片上使用ARM CMSIS DSP库。
我遇到了一些使用某些功能的问题,我对使用函数arm_cfft_q15(或任何arm_cfft_***函数)有疑问。ARM CMSIS DSP fft功能的正确FFT长度

说我有

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

,我跑

arm_cfft_q15(1024pt_fft, ADC_samples, sample_length); 

这样做的变换 '到位'。现在正因为如此,由于FFT返回了实数值和虚数值,实际上它只能返回 长度为fft的512或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点FFT?然后我可以通过告诉它FFT的长度是1024来计算使用该2048阵列的FFT的大小?

有人可以向我解释如何正确解释这些函数和我应该期望什么长度的FFT?

回答

1

arm_cfft功能家族对复数值信号进行操作。换句话说,使用arm_cfft_q15执行的1024点FFT需要1024个复数输入采样,其由2048个值(交织的实部和虚部,如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则减少ADC_samples 1024个复数值(2048 q15_t值)到1024个实际幅度值(1024 q15_t值),并将结果存储在MAG_of_fft中。

由于作为边注,如果你在实际上处理实值信号,则可以使用相同的功能和填充ADC_samples缓冲器的每一个第二索引(虚部)用零(因此使用ADC_samples缓冲区是实际样品实际数量的两倍)。或者,您可以使用更高效的arm_rfft系列功能(在this section of the documentation中描述)。

+0

请注意,我故意避免通过过多地使用'arm_rfft'来避免复杂化,这似乎不是您问题的对象(如果需要,我可以在单独的问题中详细说明)。 – SleuthEye

+0

好的,我认为这清除了我对数组输入函数大小的困惑。我还会研究arm_rfft家族,如果我有任何疑问,我肯定会问他们。谢谢。 – scarlso9