28.2 函数cr4_fft_1024_stm32的使用 cr4_fft_1024_stm32用于实现1024点数据的FFT计算。下面通过在开发板上运行这个函数并计算幅频相应,然后再与Matlab计算的结果做对比。
-
- uint32_t input[1024], output[1024], Mag[1024]; /* 输入,输出和幅值 */
- /*
- *********************************************************************************************************
- * 函 数 名: PowerMag
- * 功能说明: 求模值
- * 形 参:_usFFTPoints FFT点数
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void PowerMag(uint16_t _usFFTPoints)
- {
- int16_t lX,lY;
- uint16_t i;
- float32_t mag;
-
- /* 计算幅值 */
- for (i=0; i < _usFFTPoints; i++)
- {
- lX= (output[i]<<16)>>16; /* 实部*/
- lY= (output[i]>> 16); /* 虚部 */
- mag = __sqrtf(lX*lX+ lY*lY); /* 求模 */
- Mag[i]= mag*2; /* 求模后乘以2才是实际模值,直流分量不需要乘2 */
- }
-
- /* 由于上面多乘了2,所以这里直流分量要除以2 */
- Mag[0] = Mag[0]>>1;
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: DSP_FFT1024
- * 功能说明: 1024点FFT实现
- * 形 参:无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void DSP_FFT1024(void)
- {
- uint16_t i;
-
- /* 获得1024个采样点 */
- for (i = 0; i < 1024; i++)
- {
- input[i] = 0;
- /* 波形是由直流分量,50Hz正弦波和20Hz正弦波组成,波形采样率1KHz */
- input[i] = 1024 + 1024*sin(2*3.1415926f*50*i/1000) + 512*sin(2*3.1415926f*20*i/1000) ;
- }
-
- /* 计算1024点FFT
- output:输出结果,高16位是虚部,低16位是实部。
- input :输入数据,高16位是虚部,低16位是实部。
- 第三个参数必须是1024。
- */
- cr4_fft_1024_stm32(output, input, 1024);
-
- /* 求幅值 */
- PowerMag(1024);
-
- /* 打印输出结果 */
- for (i = 0; i < 1024; i++)
- {
- printf("%drn", Mag[i]);
- }
- }
复制代码
运行函数DSP_FFT1024可以通过串口打印出计算的模值,下面我们就通过Matlab计算的模值跟cr4_fft_1024_stm32计算的模值做对比。 对比前需要先将串口打印出的数据加载到Matlab中,并给这个数组起名sampledata,加载方法在前面的教程中已经讲解过,这里不做赘述了。Matlab中运行的代码如下:
- Fs = 1000; % 采样率
- N = 1024; % 采样点数
- n = 0:N-1; % 采样序列
- t = 0:1/Fs:1-1/Fs; % 时间序列
- f = n * Fs / N; %真实的频率
-
- %波形是由直流分量,50Hz正弦波和20Hz正弦波组成
- x = 1024 + 1024*sin(2*pi*50*t) + 512*sin(2*pi*20*t) ;
- y = fft(x, N); %对原始信号做FFT变换
-
- subplot(2,1,1);
- Mag = abs(y)*2/N; %求FFT转换结果的模值
- plot(f, Mag); %绘制幅频相应曲线
- title('Matlab计算结果');
- xlabel('频率');
- ylabel('幅度');
-
- subplot(2,1,2);
- plot(f, sampledata); %绘制STM32计算的幅频相应
- title('STM32计算结果');
- xlabel('频率');
- ylabel('幅度');
复制代码
运行Matlab后的输出结果如下:
从上面的对比结果中可以看出,Matlb和函数cr4_fft_1024_stm32计算的结果基本是一直的,但是函数cr4_fft_1024_stm32计算的结果频谱泄露稍严重些(具体情况要具体分析)。
|