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 中描述)。
我目前正在尝试在我的 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 中描述)。