我目前正在尝试在我的 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?然后我可以通过告诉 2048 数组 FFT 的长度为 1024 来计算 FFT 的幅度?
有人可以向我解释如何正确解释这些函数以及我应该期望什么长度的 FFT 吗?
最佳答案
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
然后将 ADC_samples
中的 1024 个复数值(2048 个 q15_t
值)减少到 1024 个实数值(1024 个 q15_t
值)。 >q15_t 值),并将结果存储在 MAG_of_fft
中。
作为旁注,如果您实际上正在处理实值信号,那么您可以使用相同的函数并填充ADC_samples<的每个第二个索引(虚部)/code> 缓冲区为零(因此使用的
ADC_samples
缓冲区是实际样本数量的两倍)。或者,您可以使用更高效的 arm_rfft
系列函数(如 this section of the documentation 中所述)。
关于arm - ARM CMSIS DSP fft 函数的正确 FFT 长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32211401/