前言
本文目的是演示如何使用STM32F30x 內部的DSP 進行浮點快速傅立葉變換(FFT),為聯系實際應用,使用ADC 對波形發生器進行ADC 采樣,然后對ADC 采樣結果進行FFT, 與 Matlab 仿真結果進行比較察看最終結果的準確性。會使用到ARMDSP 庫文件,以及STM32F30x 的浮點運算單元以及DSP指令等。
模擬ADC采樣數據實現FFT使用Matlab生成AM調制波形
波形公式為:AM_50= sin(2πfc)*(1+50%*sin(2πfm)), 其中fc 為載波頻率,fm 為調制波頻率,調制比50%。為了使用ADC 采樣,將波形進行偏移處理,疊加1.5V 電壓,最終波形展開公式如下:
AM_50 = sin(2πfc) + 50%*sin(2πfm))* sin(2πfc) + 1.5
Matlab 程序如下:
x =sin(2*pi*fm*t); % modulation wave
figure;plot(t,x);y =sin(2*pi*fc*t); % carrier wavefigure;plot(t,y);z1 =y.*(1+m1*x) + 1.5; % AM wave with 50% depthfigure; %figure 1plot(t,z1);xlabel('Time');ylabel('Amplitude');title('AM with50% depth');Z1 =z1*4096/3.3; % 12-bit ADC Value
產生波形如下:
圖【一】
生成模擬ADC數據,使用STM32F30x進行FFT運算
生成數據存于AM_50_ADC_Data[]數組中,實數轉換為復數,進行CFFT 的運算,調用arm_cfft_f32 庫函數,1024 點FFT。
/* Real data to magnitudedata */
for(i=0; i {testInput_f32_10khz[i*2+1] =0;testInput_f32_10khz[i*2] = AM_50_ADC_Data[i];}
/* Process the data throughthe CFFT/CIFFT module */
arm_cfft_f32(&arm_cfft_sR_f32_len1024,testInput_f32_10khz, ifftFlag, doBitReverse);
/* Process the data throughthe Complex Magnitude Module forcalculating the magnitude ateach bin */
arm_cmplx_mag_f32(testInput_f32_10khz,testOutput, fftSize);
結果打印并和Matlab計算結果進行比較
為方便顯示只取整數部分比較:圖【二】為Matlab 輸出,圖【三】為經過STM32F30x計算后的結果.
圖【二】
圖【三】
從數據上看Matlab 仿真以及STM32F30x的FFT 兩者非常吻合,數據可以直接使用。基于時間數據轉換到頻域上,理論上直流分量,頻率fc處,以及頻率fc-fm,fc+fm 處都會有波峰出現,實際看FFT 波形如下:
實際ADC采樣并進行FFT操作
使用波形發生器產生50% 調幅波,載波10KHz,調制波1KHz,調制比50%,偏移1.5V。
使用STM32F30x進行ADC 采樣,采樣結果存于數組,數據導入到Matlab 顯示波形如下:
根據ADC采樣數據進行FFT 變換,分析結果如下面所示:
結論:
由STM32F30x 的ADC 采樣的波形可以完整進行快速傅立葉變換,變化結果符合理論變化預期。并且利用STM32F30x 的FPU 以及DSP 模塊方便快速進行變化,給實際應用帶來很大便利性。
-
dsp
+關注
關注
553文章
7998瀏覽量
348943 -
模擬電路
+關注
關注
125文章
1557瀏覽量
102741 -
傅立葉變換
+關注
關注
3文章
105瀏覽量
32391
原文標題:【演示示例】STM32F30x ADC 采樣的傅立葉變換,建議看看!
文章出處:【微信號:Mouser-Community,微信公眾號:貿澤電子設計圈】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論