ARM CMSIS DSP fft 函数的正确 FFT 长度

proper FFT length for ARM CMSIS DSP fft function

我目前正在尝试在我的 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);

这是 t运行 形式 'in place'。现在正因为如此,由于 FFT return 的实值和虚值,它实际上只能 return 长度为 512 的 fft 还是 1024 个 FFT 样本中的 512 个? 在得到 FFT 之后我做了

    arm_cmplx_mag_q15(ADC_samples, MAG_of_fft, fftlength);

其中 fftlength 是 1024。

This returns MAG_of_fft 当我绘制它时,它确实看起来确实是我期望看到的形状,但我不知道如何解释结果,因为我不知道我的 FFT 到底有多长。我告诉它我正在做一个 1024pt FFT,但它似乎只是 return 一个 512pt FFT,或者只有 1024pt FFT 的一半,一个或另一个。

所以我做对了吗?这意味着 ADC_samples 数组的长度必须是其中数据的两倍才能让我获得 1024 pt FFT?然后我可以通过告诉它 FFT 的长度是 1024 来计算使用 2048 数组的 FFT 的大小?

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

arm_cfft 系列函数对复值信号进行运算。换句话说,使用 arm_cfft_q15 执行的 1024 点 FFT 需要 1024 个复数输入样本,这些样本由 2048 个 q15_t 值表示(交错的实部和虚部,如 CMSIS DSP Software Library documentation 中所述)。在 return 之后,缓冲区包含 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);

with 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 中描述)。