1

我目前正在尝试在我的 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 长度吗?

4

1 回答 1

1

函数族arm_cfft对复值信号进行操作。换句话说,执行 1024 点 FFTarm_cfft_q15需要 1024 个复数输入样本,这些样本由 2048 个q15_t值表示(交错的实部和虚部,如CMSIS DSP 软件库文档中所述)。返回时,缓冲区包含 1024 个复值(2048q15_t个值),对应于复输入信号的频域表示。

因此,根据您的情况调整此示例,您将计算 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=10241024 个复数值(2048 个q15_t值)减少ADC_samples为 1024 个实数幅值(1024 个q15_t值),并将结果存储在MAG_of_fft.

作为旁注,如果您实际上正在处理实值信号,那么您可以使用相同的函数并用零填充缓冲区的每一秒索引(虚部)ADC_samples(因此使用ADC_samples两倍于您的缓冲区)实际样本的实际数量)。或者,您可以使用更高效arm_rfft的函数系列(在文档的本节中描述)。

于 2015-08-29T04:10:43.910 回答