跳转到主要内容
cathy 提交于

<strong>前言</strong>

本文目的是演示如何使用STM32F30x 内部的DSP 进行浮点快速傅立叶变换(FFT),为联系实际应用,使用ADC 对波形发生器进行ADC 采样,然后对ADC 采样结果进行FFT, 与 Matlab 仿真结果进行比较察看最终结果的准确性。会使用到ARMDSP 库文件,以及STM32F30x 的浮点运算单元以及DSP指令等。

<strong>模拟ADC采样数据实现FFT</strong>

使用Matlab生成AM调制波形

波形公式为:AM_50= sin(2<sup>π</sup>fc)*(1+50%*sin(2<sup>π</sup>fm)), 其中fc 为载波频率,fm 为调制波频率,调制比50%。为了使用ADC 采样,将波形进行偏移处理,叠加1.5V 电压,最终波形展开公式如下:

AM_50 = sin(2<sup>π</sup>fc) + 50%*sin(2<sup>π</sup>fm))* sin(2<sup>π</sup>fc) + 1.5

<strong>Matlab 程序如下:</strong>

x =sin(2*pi*fm*t); % modulation wave
figure;
plot(t,x);
y =sin(2*pi*fc*t); % carrier wave
figure;
plot(t,y);
z1 =y.*(1+m1*x) + 1.5; % AM wave with 50% depth
figure; %figure 1
plot(t,z1);
xlabel('Time');
ylabel('Amplitude');
title('AM with50% depth');
Z1 =z1*4096/3.3; % 12-bit ADC Value

<strong>产生波形如下:</strong>

<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26421-s1.jpg&quot; alt=“” width="600"></center><center><i> 图【一】</i></center>

<strong>生成模拟ADC数据,使用STM32F30x进行FFT运算</strong>

生成数据存于AM_50_ADC_Data[]数组中,实数转换为复数,进行CFFT 的运算,调用arm_cfft_f32 库函数,1024 点FFT。

<strong>/* Real data to magnitudedata */</strong>

for(i=0; i<1024; i++)
{
testInput_f32_10khz[i*2+1] =0;
testInput_f32_10khz[i*2] = AM_50_ADC_Data[i];
}

<strong>/* Process the data throughthe CFFT/CIFFT module */</strong>

arm_cfft_f32(&arm_cfft_sR_f32_len1024,testInput_f32_10khz, ifftFlag, doBitReverse);

<strong>/* Process the data throughthe Complex Magnitude Module for
calculating the magnitude ateach bin */</strong>

arm_cmplx_mag_f32(testInput_f32_10khz,testOutput, fftSize);

<strong>结果打印并和Matlab计算结果进行比较</strong>

为方便显示只取整数部分比较:图【二】为Matlab 输出,图【三】为经过STM32F30x计算后的结果.

<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26422-s2.jpg&quot; alt=“” width="600"></center><center><i> 图【二】</i></center>
<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26423-s3.jpg&quot; alt=“” width="600"></center><center><i> 图【三】</i></center>

从数据上看Matlab 仿真以及STM32F30x的FFT 两者非常吻合,数据可以直接使用。基于时间数据转换到频域上,理论上直流分量,频率fc处,以及频率fc-fm,fc+fm 处都会有波峰出现,实际看FFT 波形如下:

<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26424-s4.jpg&quot; alt=“” width="600"></center>

<strong>实际ADC采样并进行FFT操作</strong>

使用波形发生器产生50% 调幅波,载波10KHz,调制波1KHz,调制比50%,偏移1.5V。

<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26425-s5.jpg&quot; alt=“” width="600"></center>

使用STM32F30x进行ADC 采样,采样结果存于数组,数据导入到Matlab 显示波形如下:

<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26426-s6.jpg&quot; alt=“” width="600"></center>

根据ADC采样数据进行FFT 变换,分析结果如下面所示:

<center><img src="http://mouser.eetrend.com/files/2017-09/博客/100007986-26427-s7.png&quot; alt=“” width="600"></center>

<strong>结论:</strong>
由STM32F30x 的ADC 采样的波形可以完整进行快速傅立叶变换,变化结果符合理论变化预期。并且利用STM32F30x 的FPU 以及DSP 模块方便快速进行变化,给实际应用带来很大便利性。

本文转载自<a href="http://mp.weixin.qq.com/s/B-YYJ_LTQo1UFFY6_oCZDw">STM32单片机</a&gt;
转载地址:http://mp.weixin.qq.com/s/B-YYJ_LTQo1UFFY6_oCZDw
声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有,如涉及侵权,请联系小编进行处理。

STM32F30x ADC 采样的傅立叶变换示例