我目前正在尝试使用我的大脑皮层m3 PSoC 5lp芯片上的ARM CMSIS库。
我在使用一些函数时遇到了一些问题,我有一个关于如何使用函数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到底有多长。我告诉它,我正在做一个1024点FFT,但它似乎只返回一个512点FFT,或者只有一半的1024点FFT,一个或另一个。
我说得对吗?这意味着ADC_samples数组的长度必须是数据的两倍,这样我才能得到1024 pt FFT?然后我就可以用那个2048阵列来计算FFT的大小,告诉它FFT的长度是1024?
有人能向我解释如何正确地解释这些函数以及我期望的FFT长度吗?
发布于 2015-08-29 04:10:43
arm_cfft函数族对复值信号进行运算。换句话说,使用arm_cfft_q15执行的1024点快速傅立叶变换需要1024个复杂的输入样本,这些输入样本由2048个q15_t值表示(如CMSIS DSP软件库文档中所描述的,交错的实部和虚部)。在返回时,缓冲器包含与复输入信号的频域表示相对应的1024复值(2048 q15_t值)。
因此,使这个例子适应您的情况,您将使用以下方法计算快速傅立叶变换:
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系列函数(在文件的这一节中描述)。
https://stackoverflow.com/questions/32211401
复制相似问题