国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于STM32F407實(shí)現(xiàn)快速傅里葉變化(FFT),計(jì)算指定頻率的幅值

這篇具有很好參考價(jià)值的文章主要介紹了基于STM32F407實(shí)現(xiàn)快速傅里葉變化(FFT),計(jì)算指定頻率的幅值。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:本人的課題是關(guān)于EIT采集系統(tǒng)設(shè)計(jì),所謂的EIT,簡(jiǎn)單的說就是往人體注入特定頻率的電流信號(hào),通過采集反饋的電壓信號(hào),進(jìn)而使用成像算法重構(gòu)人體內(nèi)部的阻抗分布。由于采集到的電壓包含其它頻率的熱噪聲,為了只保留注入頻率的信號(hào)成分,需要對(duì)采集到的電壓信號(hào)進(jìn)行FFT處理。

在本文應(yīng)用中,F(xiàn)FT相當(dāng)于一個(gè)帶通濾波器,用于獲取指定頻率的信號(hào)信息。關(guān)于快速傅里葉變化這里不做過多的介紹,具體可參考別人寫的博客:

如何 FFT(快速傅里葉變換) 求幅度、頻率(超詳細(xì) 含推導(dǎo)過程)_Xav Zewen的博客

本文主要介紹如何在STM32F407上實(shí)現(xiàn)對(duì)特定頻率進(jìn)行FFT。重新更新并完善了一下,將代碼整理為函數(shù),方便讀者調(diào)用。

一、使用DSP庫進(jìn)行FFT計(jì)算

1.1 DSP庫開啟

我們知道,相比于整形運(yùn)算,浮點(diǎn)運(yùn)算會(huì)大量消耗算力,若直接讓STM32強(qiáng)行計(jì)算,難以滿足實(shí)時(shí)性的需求。好在STM32F407是具有浮點(diǎn)運(yùn)算(FPU)功能,可以通過MDK配置:target->Roating Point Hardware->Use Single Precison中打開。

stm32 傅里葉變換,電阻抗成像,單片機(jī),stm32,嵌入式硬件,Powered by 金山文檔

在進(jìn)行FFT計(jì)算時(shí),我們還需要用到三角計(jì)算,因此我們還需要添加dsp數(shù)學(xué)庫,調(diào)用庫中的函數(shù)進(jìn)行數(shù)學(xué)運(yùn)算。DSP庫的開啟如下所示。

stm32 傅里葉變換,電阻抗成像,單片機(jī),stm32,嵌入式硬件,Powered by 金山文檔

同時(shí)在MDK配置中添加頭文件:ARM_MATH_CM4

stm32 傅里葉變換,電阻抗成像,單片機(jī),stm32,嵌入式硬件,Powered by 金山文檔

?通過上述操作,我們便可進(jìn)入編程環(huán)節(jié)。

1.2 調(diào)用DSP庫進(jìn)行FFT計(jì)算

那么,如何通過FFT變換,獲取指定頻率的幅值信息呢?下面舉個(gè)例子:

目的:獲取電壓數(shù)據(jù)中10kHz的幅值分量

要求:待計(jì)算的頻率、ADC的采樣頻率、采集樣本量、數(shù)據(jù)點(diǎn)N 應(yīng)該滿足以下等式:

stm32 傅里葉變換,電阻抗成像,單片機(jī),stm32,嵌入式硬件,Powered by 金山文檔

在STM32程序中,我們可以通過中斷設(shè)定ADC的采樣頻率,進(jìn)而配平上述等式。如定義一個(gè)1us定時(shí)器中斷,在中斷任務(wù)中執(zhí)行一次ADC采集(此時(shí)采樣頻率為1MHz),一共采集1000次。

此時(shí)FFT的參數(shù)為:

????????待計(jì)算的頻率——10kHz

????????ADC的采樣頻率——1MHz

????????采集樣本量——1000

配平上述式子,求得數(shù)據(jù)點(diǎn) N = 10。

【注】 1. 若等式配不平,會(huì)導(dǎo)致頻譜泄露,造成數(shù)據(jù)失真;

? ? ? ? ? ? 2. 采樣依舊要滿足采樣定理,即:ADC的采樣頻率 >2*電壓數(shù)據(jù)中最大的頻率分量;

? ? ? ? ? ? 3. 由于FFT變換的特點(diǎn),采集樣本量為2的指數(shù)倍能提高計(jì)算速度。?

使用DSP庫進(jìn)行FFT變換的函數(shù)如下:


// FFT計(jì)算函數(shù)
// *DATA: 導(dǎo)入待FFT計(jì)算的原始數(shù)組指針
// num:采集樣本量
// N:需要保存的第幾個(gè)數(shù)據(jù)點(diǎn)
float FFT_Calculation(float *DATA, int num, int N)
{
    float array_FFT_output[num];        //儲(chǔ)存FFT變換后的512個(gè)數(shù)據(jù)
    float array_arm_cmplx_mag[num];     //儲(chǔ)存FFT變換后的512個(gè)數(shù)據(jù)的幅值信息

    arm_rfft_fast_instance_f32 S;
    arm_rfft_fast_init_f32(&S, fftSize);        //初始化結(jié)構(gòu)體S中的參數(shù)
    arm_rfft_fast_f32(&S, array_f32, array_FFT_output, 0);          //fft正變換 
    arm_cmplx_mag_f32(array_FFT_output, array_arm_cmplx_mag, num);  //計(jì)算幅值  

? ? return array_arm_cmplx_mag[N];  
}  ? 

下面簡(jiǎn)單的示范一下這個(gè)函數(shù)怎么使用:


float Data_FFT[1000];? ? ? ? // 待FFT計(jì)算的原始數(shù)據(jù)(讀者自行賦值)
float result;

result = FFT_Calculation(Data_FFT,1000,10);? ? // 1000個(gè)采樣點(diǎn)數(shù),需要保存第10個(gè)頻點(diǎn)

二、FFT算法的優(yōu)化:使用DFT計(jì)算單一頻點(diǎn)信息

雖然FFT計(jì)算十分方便,但是,當(dāng)我們只需要單一頻點(diǎn)數(shù)據(jù)時(shí),F(xiàn)FT由于計(jì)算了大量的無效數(shù)據(jù),消耗了算力。在上面的例子中,我們只需要獲得10kHz的電壓幅值,這時(shí)代碼可以優(yōu)化為離散型傅里葉變化(DFT)。離散型傅里葉變化的計(jì)算公式如下:

stm32 傅里葉變換,電阻抗成像,單片機(jī),stm32,嵌入式硬件,Powered by 金山文檔

離散型傅里葉變換(DFT)的計(jì)算代碼如下:


#include "arm_math.h"   // 代碼中涉及了sin cos 計(jì)算, 需按1.1小節(jié)開啟DSP庫

// *Data: 導(dǎo)入待DFT計(jì)算的原始數(shù)組指針
// num:采集樣本量
// N:需要保存的第幾個(gè)數(shù)據(jù)點(diǎn)
float DFT_Calculation(float *Data, int num, int N)
{
        unsigned int i;
        float SUM_Re = 0;        //實(shí)頻數(shù)值
        float SUM_Im = 0;        //虛頻數(shù)值
        float result = 0;            // 計(jì)算結(jié)果
        
        //FFT展開式
        for(i=0;i<num;i++)
        {
            SUM_Re = SUM_Re + Data[i]*cos(2*3.1415926*N*i/num);
            SUM_Im = SUM_Im - Data[i]*sin(2*3.1415926*N*i/num);
        }

        //計(jì)算幅值
        result = sqrt(SUM_Re*SUM_Re + SUM_Im*SUM_Im);

        return result;
}

該函數(shù)的使用方法同F(xiàn)FT一致:

float Data_DFT[1000];? ? ? ? // 待DFT計(jì)算的原始數(shù)據(jù)(讀者自行賦值)
float result;

result = DFT_Calculation(Data_DFT,1000,10);? ? // 1000個(gè)采樣點(diǎn)數(shù),需要保存第10個(gè)頻點(diǎn)

經(jīng)過測(cè)試,計(jì)算單一頻點(diǎn)信息時(shí),使用DFT算法相比于FFT,時(shí)間節(jié)省了約51%。

進(jìn)一步提升

如果代碼對(duì)于實(shí)時(shí)性有要求,在內(nèi)存和算力的寸土寸金的單片機(jī)上,可以通過查表法,代替耗時(shí)的三角函數(shù)計(jì)算。

如上面的代碼, cos(2*3.1415926*N*i/num) 和 sin(2*3.1415926*N*i/num) 的計(jì)算結(jié)果是固定值,可以提前計(jì)算出N=1000,k=10,i取0~999時(shí)的cos和sin值,在DFT計(jì)算是查詢預(yù)先計(jì)算好的三角函數(shù)值,以節(jié)省算力。文章來源地址http://www.zghlxwxcb.cn/news/detail-521672.html

到了這里,關(guān)于基于STM32F407實(shí)現(xiàn)快速傅里葉變化(FFT),計(jì)算指定頻率的幅值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于STM32F407的智能門鎖

    基于STM32F407的智能門鎖

    ????????在消費(fèi)升級(jí)滲透在各個(gè)領(lǐng)域的今天,國(guó)民消費(fèi)發(fā)生著巨大的變化,與每個(gè)人息息相關(guān)的家居行業(yè)也是如此?,F(xiàn)今,越來越多的智能家居產(chǎn)品出現(xiàn)在普通老百姓的生活中,智能照明、智能窗簾、智能掃地機(jī)器人等各種智能產(chǎn)品都給人們的生活帶來了極大的便利。智能

    2024年02月11日
    瀏覽(21)
  • 基于STM32&FFT(快速傅里葉變換)音頻頻譜顯示功能實(shí)現(xiàn)

    基于STM32&FFT(快速傅里葉變換)音頻頻譜顯示功能實(shí)現(xiàn)

    + v hezkz17進(jìn)數(shù)字音頻系統(tǒng)研究開發(fā)交流答疑 一實(shí)驗(yàn)效果 ? 二 設(shè)計(jì)過程 要用C語言實(shí)現(xiàn)STM32頻譜顯示功能,可以按照以下步驟進(jìn)行操作: 1 確保已經(jīng)安裝好了適當(dāng)?shù)拈_發(fā)環(huán)境和工具鏈,例如Keil MDK或者GCC工具鏈。 2 創(chuàng)建一個(gè)新的STM32項(xiàng)目,并選擇適合的MCU型號(hào)。 3 配置GPIO引腳用

    2024年02月12日
    瀏覽(19)
  • 搭建STM32F407的Freertos系統(tǒng)(基于STM32CubeMX)

    搭建STM32F407的Freertos系統(tǒng)(基于STM32CubeMX)

    ? ? ? ?本人長(zhǎng)期開發(fā)Linux、Windows上應(yīng)用軟件,一直以來MCU開發(fā)有所接觸,但較少(最近項(xiàng)目需要,小公司么,都得會(huì),被逼的),好在有STM32CubeMX這樣工具,貌似就是我想要的工具。 ? ? ? ? 本次demo目標(biāo)立下: ? ? ? ? 1. 搭建或移植FreeRTOS到STM32上,畢竟對(duì)于長(zhǎng)期在Linux環(huán)境

    2024年02月10日
    瀏覽(31)
  • 基于stm32f407的示波器+FFT頻譜分析

    基于stm32f407的示波器+FFT頻譜分析

    1 設(shè)計(jì)思路 2 DMA傳輸ADC采樣值 使用DMA直接將ADC-DR中的數(shù)據(jù)傳輸?shù)紸DC數(shù)據(jù)緩存區(qū),節(jié)省cpu資源,高速AD采集,代碼如下: 3 ADC定時(shí)器觸發(fā)(可修改ADC采樣率) 為了實(shí)現(xiàn)ADC采樣率可調(diào),我將AD的出發(fā)方式設(shè)置為定時(shí)器觸發(fā),使用TIM3來觸發(fā)adc采集,首先初始化定時(shí)器,先預(yù)設(shè)幾種初

    2024年02月05日
    瀏覽(19)
  • STM32CubeMX生成C代碼及時(shí)鐘樹配置(基于stm32f407)

    STM32CubeMX生成C代碼及時(shí)鐘樹配置(基于stm32f407)

    近來對(duì)于stm32單片機(jī)編程中,HAL庫逐漸取代標(biāo)準(zhǔn)庫成為主流的庫。標(biāo)準(zhǔn)庫支持的芯片型號(hào)有限,而且目前已經(jīng)停止支持,而HAL庫支持所有類型的芯片,可移植性也很高,再加上有神器STM32Cube可以生成工程模板,越來越多的編程開始從使用標(biāo)準(zhǔn)庫轉(zhuǎn)到使用HAL庫。 新建工程后,在

    2024年02月15日
    瀏覽(26)
  • stm32f407探索者開發(fā)板(二)——新建工程(基于固件庫)

    stm32f407探索者開發(fā)板(二)——新建工程(基于固件庫)

    說實(shí)話,我非常不想這篇文章,因?yàn)樘L(zhǎng)太長(zhǎng)了,我看視頻寫都寫了一個(gè)下午(雖然我下午一直在摸魚,啊啊啊啊?。┖?,不管了,趕緊開始寫吧,不然今晚是寫不完了,嗚嗚嗚…… 把這個(gè)里面的文件放先給下好,我這里是沒有光盤的,所以需要從百度網(wǎng)盤上下載好,這里面

    2023年04月08日
    瀏覽(32)
  • 基于STM32F407的俄羅斯方塊小游戲的設(shè)計(jì)

    基于STM32F407的俄羅斯方塊小游戲的設(shè)計(jì)

    ? ? 本文講述的是基于STM32F407的俄羅斯方塊小游戲的設(shè)計(jì)思路和測(cè)試結(jié)果,具體的代碼分析見文章?基于STM32F407的俄羅斯方塊游戲代碼分析_鉆仰彌堅(jiān)的博客-CSDN博客 1.1 可行性分析 可行性分析能夠?qū)π孪到y(tǒng)進(jìn)行各方面的分析與研究,確定新系統(tǒng)是否具有開發(fā)的可行性和必要性

    2024年02月11日
    瀏覽(68)
  • STM32F407實(shí)現(xiàn)1588v2(ptpd)

    STM32F407實(shí)現(xiàn)1588v2(ptpd)

    硬件: STM32F407ZGT6開發(fā)板 軟件: VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一個(gè)在NUCLEO-F429ZI開發(fā)板上移植ptpd的example,因?yàn)楹虵407差別很小,所以就打算用這個(gè)demo移植到手頭的開發(fā)板上。因?yàn)槟壳爸恍枰猻lave,所以只調(diào)試了slave。據(jù)介紹,master好像原作者沒有充分測(cè)試過。 源項(xiàng)

    2024年02月08日
    瀏覽(26)
  • 從STM32F407到AT32F407(一)

    從STM32F407到AT32F407(一)

    雅特力公司的MCU有著性能超群,價(jià)格優(yōu)越的巨大優(yōu)勢(shì),缺點(diǎn)是相關(guān)資料少一些,我們可以充分利用ST的現(xiàn)有資源來開發(fā)它。 我用雅特力的STM32F437開發(fā)板,使用原子?stm32f407的開發(fā)板自帶程序,測(cè)試串口程序,原設(shè)定串口波特率為115200,但是輸出亂碼,波特率改成230400,串口輸

    2024年02月02日
    瀏覽(30)
  • STM32F407普通IO口模擬串口實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)收發(fā)

    STM32F407普通IO口模擬串口實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)收發(fā)

    因?yàn)轫?xiàng)目中用到的串口比較多,STM32F407VET6自帶的串口不夠用了,所以只能考慮用模擬串口來實(shí)現(xiàn)功能。普通的IO口來模擬串口需要先了解串口的時(shí)序圖,需要用到兩個(gè)IO引腳即收發(fā)引腳,兩個(gè)定時(shí)器,一個(gè)用于發(fā)送延時(shí)使用,一個(gè)用于產(chǎn)生中斷接收數(shù)據(jù)。代碼的初始化主要用

    2024年02月07日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包