亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于STM32及DSP庫對脈搏波進(jìn)行傅里葉變換的方法

        2021-12-02 01:22:44趙星
        現(xiàn)代計(jì)算機(jī) 2021年28期
        關(guān)鍵詞:信號

        趙星

        (安徽電子科學(xué)研究所,合肥 230026)

        0 引言

        中醫(yī)是我國傳統(tǒng)文化中的瑰寶,脈診在中醫(yī)四診中占有重要地位,但中醫(yī)對脈象的診斷主要依靠醫(yī)生自身診斷經(jīng)驗(yàn),受到主觀因素影響較大,難免會有疏漏。隨著現(xiàn)代科學(xué)技術(shù)的快速發(fā)展,數(shù)學(xué)、物理學(xué)、電子信息學(xué)等學(xué)科在醫(yī)學(xué)領(lǐng)域得到大量應(yīng)用,以現(xiàn)代科技對脈搏波進(jìn)行分析研究,已經(jīng)是現(xiàn)代醫(yī)學(xué)的重要課題。而當(dāng)前對脈搏波的分析中大多使用小波變換、希爾伯特-黃變換等方法進(jìn)行時頻分析,而非使用傅里葉變換,其目的是期望突破傅里葉變換局限性,從而更加準(zhǔn)確地描述時間和頻率的關(guān)系。然而這并不意味著傅里葉變換在脈搏波分析上就毫無用武之地,在進(jìn)行如脈象分辨[1]、中年慢性病[2]等方面的研究時傅里葉變換依然有自己的價值。下文就應(yīng)用STM32及ARM CMSIS DSP庫對脈搏波進(jìn)行傅里葉變換的方法進(jìn)行分析。

        1 脈搏波的提取

        脈搏波是由心臟搏動沿著動脈血管向外傳播而形成。人體發(fā)生病變時常常會對心臟、血管、血液等產(chǎn)生影響,使得脈搏波的幅度、頻率、特征點(diǎn)等發(fā)生變化,對此做研究分析就可以了解人體的相關(guān)信息。本文分析使用的脈搏波為橈動脈脈搏波,其具體提取方法為使用一個高靈敏度的壓力傳感器作為脈搏傳感器,將傳感器的敏感點(diǎn)對準(zhǔn)橈動脈跳動最強(qiáng)處,再以綁帶固定。傳感器輸出的差分信號為毫伏級,需經(jīng)過放大、濾波等信號調(diào)理電路處理,再通過A/D轉(zhuǎn)換,變?yōu)閿?shù)字信號,然后才能進(jìn)行相應(yīng)的數(shù)學(xué)分析。整個流程如圖1所示。

        圖1 脈搏波提取流程

        圖中放大器部分本文使用儀表放大器對傳感器輸出信號進(jìn)行放大。因人體脈搏波頻率成分主要分布在0~20 Hz之間,使用低通濾波器對信號濾波。信號在濾波之后,再通過一個加法器混入一個直流分量,然后進(jìn)入STM32的AD部分,從而便于其進(jìn)行處理。在實(shí)際應(yīng)用中依據(jù)需求可使用性能更好的專用AD芯片,在此對具體電路不再贅述。

        2 STM32F4系列MCU及ARM CMSIS DSP庫簡介

        傅里葉變換的計(jì)算量隨著數(shù)據(jù)量的增大而增大,通常進(jìn)行研究時使用計(jì)算機(jī)進(jìn)行分析計(jì)算,但當(dāng)其用于小型儀器中時主芯片計(jì)算能力可能比較有限,這時就難以保證一定的實(shí)時性。STM32F4系列是意法半導(dǎo)體公司基于ARM Cortex-M4內(nèi)核的MCU,其內(nèi)置一個32位的浮點(diǎn)運(yùn)算單元(FPU,float point unit)[3],支持單精度浮點(diǎn)運(yùn)算,可以被看做協(xié)處理器。因此當(dāng)其開啟FPU進(jìn)行復(fù)雜的浮點(diǎn)運(yùn)算時具備明顯優(yōu)勢,其速度可超出未開啟FPU時十余倍甚至更高。Cortex-M4內(nèi)核具有DSP擴(kuò)展,支持多種DSP指令[4]。ARM公司的CMSIS DSP庫專門為其進(jìn)行了優(yōu)化,在進(jìn)行向量處理、矩陣處理、計(jì)算三角函數(shù)、濾波函數(shù)、統(tǒng)計(jì)函數(shù)、傅里葉變換等方面十分高效便捷。這也是本文使用STM32F4系列及ARM CMSIS DSP庫進(jìn)行傅里葉變換的原因。

        3 應(yīng)用STM32F405RGT6及CMSIS DSP庫進(jìn)行傅里葉變換

        STM32F405RGT6是屬于STM32F4系列的MCU芯片,其工作頻率高達(dá)168 MHz,具有單精度浮點(diǎn)單元(FPU),支持所有ARM單精度數(shù)據(jù)處理指令和數(shù)據(jù)類型。它還實(shí)現(xiàn)了DSP指令用于更快速地進(jìn)行數(shù)字信號處理,以及一個存儲器保護(hù)單元(MPU)從而增強(qiáng)了應(yīng)用程序的安全性。意法半導(dǎo)體同時推出了STM32CubeIDE作為開發(fā)工具,其基于Eclipse/CDT框架和GCC工具鏈,并以GDB作為調(diào)試工具,本文使用的開發(fā)工具便是STM32CubeIDE。

        傅里葉變換是一種研究信號成分的重要工具。在數(shù)字信號處理中經(jīng)常需要用到離散傅里葉變換(DFT,discrete fourier transform)來獲取信號的頻域特征。但這種方法在采樣點(diǎn)較多時計(jì)算量過大,因此通常采用快速傅里葉變換(FFT,fast fourier transform)來實(shí)現(xiàn)其在工程上的應(yīng)用,在CMSIS DSP庫也有對應(yīng)的函數(shù)可以使用。

        STM32F405RGT6內(nèi)部具有3個12位2.4 MSPS的A/D模塊,本文以此對脈搏波的模擬信號進(jìn)行模數(shù)轉(zhuǎn)換。脈搏波頻率成分主要分布在0~20 Hz之間,根據(jù)采樣定理采樣頻率應(yīng)當(dāng)高于于信號最高頻率的2倍,本文使用的采樣頻率是200 Hz。由傅里葉變換的原理可知,對于第n個點(diǎn)的頻率F n有:

        其中F s為采樣頻率,N為采樣點(diǎn)數(shù)??梢姰?dāng)N越大時,獲得的頻率分辨率越佳。這里采集1024個數(shù)據(jù)點(diǎn)。本文中的編程在FFT部分使用DSP庫中文件“l(fā)ibarm_cortexM4lf_math.a”提供的相應(yīng)函數(shù),其他部分如AD采樣和定時器等都使用STM32的HAL庫。這里需要注意的是DSP庫中文件的選擇,不僅針對不同編譯器的庫不同,而且對同一芯片使用不同設(shè)置時選擇的文件也是不同。本文測試時開啟了STM32F405RGT6的FPU,選擇使用“l(fā)ibarm_cortexM4lf_math.a”。在AD采樣時首先要對AD進(jìn)行初始化,完成各種基本設(shè)置,如通道、時鐘源、分辨率、數(shù)據(jù)對齊方式等。然后選擇一個定時器設(shè)置為5 ms一次中斷,中斷觸發(fā)時對信號進(jìn)行AD采樣。以下為程序中AD采樣部分的主要代碼:

        HAL_ADC_Start(&hadc1); //開始AD轉(zhuǎn)換

        HAL_ADC_Poll ForConversion(&hadc1,50);//等 待AD轉(zhuǎn)換完成

        if(HAL_ADC_Get State(&AdcHandle)==HAL_ADC_STATE_EOC_REG)//檢查AD轉(zhuǎn)換是否完成

        {

        SignValue=HAL_ADC_GetValue(&hadc1); //獲取AD轉(zhuǎn)換的值

        }

        以上代碼可用在定時器中斷函數(shù)、回調(diào)函數(shù)或設(shè)置標(biāo)志后輪詢等多種方式中,依工程實(shí)際需要設(shè)置即可。采集到的脈搏波曲線如圖2所示。

        圖2 脈博波曲線

        取得采樣數(shù)據(jù)后可以根據(jù)數(shù)據(jù)質(zhì)量進(jìn)行一些數(shù)字濾波等處理,這里不再贅述。FFT運(yùn)算函數(shù)的輸入數(shù)據(jù)和輸出數(shù)據(jù)使用同一塊緩沖區(qū)。在進(jìn)行FFT之前,還需對輸入信號數(shù)據(jù)再做一次加入虛部的處理。采集到的信號為時域信號,作為FFT函數(shù)輸入變量的實(shí)部,虛部為0。然后進(jìn)行FFT,再把運(yùn)算結(jié)果復(fù)數(shù)求模。以下為主要代碼:

        for(int i=0;i<SignLength;i++) //SignLength為采樣點(diǎn)數(shù)1024

        {

        ComplexSignArray[2*i]=SignArray[i]; //采 集 到的信號為實(shí)部

        ComplexSignArray[2*i+1]=0; //虛部設(shè)為0

        SignFrequency[i]=((i+1)-1)*200/(float)Sign-Length; //計(jì)算譜線的頻率

        }

        arm_cfft_f32(&arm_cfft_sR_f32_len1024,ComplexSignArray,0,1); //進(jìn)行FFT計(jì)算

        arm_cmplx_mag_f32(ComplexSignArray,OutputArray,SignLength); //把運(yùn)算結(jié)果復(fù)數(shù)求模

        上面代碼中SignArray為采集數(shù)據(jù),計(jì)算譜線頻率依據(jù)公式(1)。FFT計(jì)算的函數(shù)arm_cfft_f32中第一個參數(shù)為對計(jì)算進(jìn)行配置的參數(shù),已經(jīng)包含在DSP庫中的頭文件“arm_const_structs.h”中,直接使用即可。第二個參數(shù)為輸入數(shù)據(jù)和輸出數(shù)據(jù)共用的緩沖區(qū)。第三個參數(shù)為選擇正向或反向轉(zhuǎn)換的標(biāo)志。第四個參數(shù)為輸出位反轉(zhuǎn)的標(biāo)志。復(fù)數(shù)求模的函數(shù)arm_cmplx_mag_f32中第一個參數(shù)為輸入數(shù)據(jù),第二個參數(shù)為輸出數(shù)據(jù),第三個參數(shù)為數(shù)據(jù)長度。將基于STM32F405RGT6的DSP庫進(jìn)行傅里葉變換后的頻譜圖如圖3,由于實(shí)信號傅里葉變換的對稱性,為便于特征顯示圖中只繪制了頻譜前半部分的主要譜線。

        圖3 基于stm32的DSP庫計(jì)算的脈搏波頻譜

        4 應(yīng)用Python的scipy庫進(jìn)行傅里葉變換并對比驗(yàn)證

        對上文中基于STM32F405RGT6的DSP庫的計(jì)算結(jié)果,可以使用計(jì)算機(jī)工具來進(jìn)行驗(yàn)證??梢允褂玫尿?yàn)證工具有多種,如MATLAB,Scilab,Octave等,本文使用Python的scipy庫來進(jìn)行驗(yàn)證。

        Python是一種解釋性計(jì)算機(jī)腳本語言,因其擁有眾多強(qiáng)大的第三方庫常常用于數(shù)據(jù)科學(xué)研究、web開發(fā)、網(wǎng)絡(luò)爬蟲等眾多領(lǐng)域。scipy庫便是Python的一個重要的高級科學(xué)計(jì)算庫,可用于信號處理、統(tǒng)計(jì)分析、線性代數(shù)計(jì)算、圖像處理等諸多方面,可以十分方便地進(jìn)行傅里葉變換計(jì)算。其傅里葉變換的函數(shù)fft()位于fftpack子模塊中。以下為主要代碼:

        import numpy as np #導(dǎo)入numpy模塊

        from scipy.fftpack import fft #從scipy模塊的子模塊fftpack中導(dǎo)入fft函數(shù)

        import matplotlib.pyplot as plt#導(dǎo)入matplotlib模塊的子模塊pyplot

        SignLength=1024 #采樣點(diǎn)數(shù)

        SignArrayTrans=fft(SignArray)#快速傅里葉變換

        SignArrayAbs=np.abs(SignArrayTrans)#對快速傅里葉變換后的復(fù)數(shù)取模

        SignArrayAbs/=(SignLength/2)

        SignArrayAbs[0]/=2

        SignFrequency=(np.arange(1,SignLength+1)-1)*200/SignLength #計(jì)算譜線的頻率

        np.set_printoptions(threshold=np.inf,suppress=True)

        #完整打印全部變量

        print(SignArrayAbs) #輸出模的值

        print(SignFrequency)#輸出譜線頻率

        plt.plot(SignFrequency[1:(int)(SignLength/2)],SignArrayAbs[1:(int)(SignLength/2)],label=′脈搏波頻譜′)#繪制頻譜圖

        plt.rcParams[′font.sans-serif′]=[′SimHei′]

        plt.xlabel(′頻率/Hz′)

        plt.ylabel(′幅值′)

        plt.legend()

        plt.show()

        上面代碼中SignArray為采樣數(shù)據(jù)儲存的數(shù)組,譜線的頻率根據(jù)公式(1)計(jì)算。下面圖4是基于Python的scipy庫計(jì)算的脈搏波頻譜。由于實(shí)信號傅里葉變換的對稱性,為便于特征顯示圖中只繪制了頻譜前半部分的主要譜線。

        圖4 基于Python的scipy庫計(jì)算的脈搏波頻譜

        將圖3與圖4對比可見兩圖一致。將基于STM32F405RGT6的DSP庫和Python的scipy庫分別計(jì)算的部分主要譜峰幅值及對應(yīng)頻率進(jìn)行對比,如表1所示。

        表1 主要譜峰幅值及對應(yīng)頻率進(jìn)行對比

        由表1可見兩者數(shù)據(jù)相符,其誤差已經(jīng)非常小,在應(yīng)用中可以忽略不計(jì)。

        5 結(jié)語

        本文介紹了基于STM32對脈搏波進(jìn)行采集處理及應(yīng)用DSP庫進(jìn)行傅里葉變換的方法,并將處理的結(jié)果與使用Python的scipy庫進(jìn)行傅里葉變換的結(jié)果進(jìn)行對比,驗(yàn)證了此方法的可行性,其可用于醫(yī)療儀器對脈搏波進(jìn)行傅里葉變換的分析,從而提取出有價值的人體特征參數(shù),其處理過程對類似的應(yīng)用也具有參考意義。

        猜你喜歡
        信號
        信號
        鴨綠江(2021年35期)2021-04-19 12:24:18
        完形填空二則
        7個信號,警惕寶寶要感冒
        媽媽寶寶(2019年10期)2019-10-26 02:45:34
        孩子停止長個的信號
        《鐵道通信信號》訂閱單
        基于FPGA的多功能信號發(fā)生器的設(shè)計(jì)
        電子制作(2018年11期)2018-08-04 03:25:42
        基于Arduino的聯(lián)鎖信號控制接口研究
        《鐵道通信信號》訂閱單
        基于LabVIEW的力加載信號采集與PID控制
        Kisspeptin/GPR54信號通路促使性早熟形成的作用觀察
        国产欧美性成人精品午夜| 日本人妖一区二区三区| 亚洲精品一区二区成人精品网站| 婷婷伊人久久大香线蕉av| 国产乱xxⅹxx国语对白| 最新精品国偷自产在线婷婷| 一区二区三区视频免费观看在线| 亚洲精品视频在线一区二区| 超碰97资源站| 亚洲人成人无码www影院| 无码吃奶揉捏奶头高潮视频| 正在播放国产多p交换视频| 在线播放中文字幕一区二区三区| 蜜桃a人妻精品一区二区三区| 国产人妻丰满熟妇嗷嗷叫| 亚洲区小说区图片区| 久久国产亚洲av高清色| 国产成人自拍高清在线| 国产人妻久久精品二区三区特黄| 久久国产综合精品欧美| 女同另类专区精品女同| 国产成人午夜高潮毛片| 亚洲国产成人va在线观看天堂| 亚洲加勒比无码一区二区在线播放 | 国产日产韩国av在线| 日韩成人无码| 偷亚洲偷国产欧美高清| 日本免费一区二区在线| (无码视频)在线观看| 免费精品无码av片在线观看| 亚洲日韩国产精品不卡一区在线 | 国产人妻高清国产拍精品| 少妇人妻200篇白洁| 精品无码一区二区三区小说| 精品亚洲一区中文字幕精品| 久久久久亚洲精品无码网址蜜桃 | 亚洲中文字幕精品久久久| 亚洲av区,一区二区三区色婷婷| 久久久久久人妻一区精品| 亚洲乱码一区二区三区成人小说 | 亚洲精品一区二区三区麻豆|