基于MATLAB 的脈搏信號(hào)處理軟件系統(tǒng)_第1頁
基于MATLAB 的脈搏信號(hào)處理軟件系統(tǒng)_第2頁
基于MATLAB 的脈搏信號(hào)處理軟件系統(tǒng)_第3頁
基于MATLAB 的脈搏信號(hào)處理軟件系統(tǒng)_第4頁
基于MATLAB 的脈搏信號(hào)處理軟件系統(tǒng)_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、基于MATLAB的脈搏信號(hào)處理軟體系統(tǒng)基于MATLAB 的脈搏信號(hào)處理軟件系統(tǒng)摘要: 本文根據(jù)在實(shí)驗(yàn)室里測(cè)得的脈搏數(shù)據(jù),基于MATLBA設(shè)計(jì)一個(gè)脈搏信號(hào)的GUI處理界面,并利用MATLAB強(qiáng)大數(shù)字信號(hào)處理功能還原脈搏波形,并對(duì)波形的特征信息進(jìn)行提取及存儲(chǔ)。原始信號(hào)進(jìn)行了去除基線漂移、通過巴特沃斯帶通濾波器以及二階切比雪夫?yàn)V波器去除50HZ工頻干擾,并且能計(jì)算實(shí)時(shí)的脈率并更新,顯示脈率變化趨勢(shì)曲線,進(jìn)行頻譜分析和輸出文檔。此軟件有兩個(gè)GUI界面,第一個(gè)為密碼登陸界面,第二個(gè)為脈搏信號(hào)處理系統(tǒng)GUI界面。第二個(gè)GUI界面主要分為五大模塊:1.打開與退出模塊包括打開數(shù)據(jù)和退出系統(tǒng);2.信號(hào)回放模塊包

2、括對(duì)原信號(hào)和濾波信號(hào)的回放、暫?;胤?、繼續(xù)回放、關(guān)閉窗口;3.信號(hào)放大與縮小模塊包括對(duì)信號(hào)的X軸和Y軸的放大、縮小處理;信號(hào)快進(jìn)退模塊包括對(duì)信號(hào)的快進(jìn)、慢進(jìn)、快退、慢退處理;4.脈率實(shí)時(shí)處理模塊包括輸出脈率曲線、暫?;胤拧⑤敵雒}搏信息、脈搏頻譜分析、清除波形、輸出文檔;5.脈率信號(hào)輸出模塊包括輸出實(shí)時(shí)的脈率更新、以及脈搏數(shù)據(jù)的信息,諸如脈搏采樣頻率、采樣時(shí)間、最大脈率值、最小脈率等。關(guān)鍵詞:脈搏;脈率 ;Matlab ;GUI ;1 引言人體內(nèi)部各個(gè)生理系統(tǒng)之間(如循環(huán)系統(tǒng)、呼吸系統(tǒng)等)是相互耦合的。反映人身體健康狀態(tài)相對(duì)最重要、最全面的是心臟血液循環(huán)系統(tǒng),因此通過采集脈搏波進(jìn)而分析心臟循環(huán)系

3、統(tǒng)功能,能從一個(gè)方面較全面反映人體的健康情況。從脈搏波中提取人體的生理病理信息作為臨床診斷和治療的依據(jù),歷來都受到中外醫(yī)學(xué)界的重視。幾乎世界上所有的民族都用過“摸脈”作為診斷疾病的手段。脈搏波所呈現(xiàn)出的形態(tài)(波形)、強(qiáng)度(波幅)、速率(波速)和節(jié)律(周期)等方 面的綜合信息,在很大程度上反映出人體心血管系統(tǒng)中許多生理病理的血流特征,因此對(duì)脈搏波采集和處理具有很高的醫(yī)學(xué)價(jià)值和應(yīng)用前景。目前脈搏信息的研究已經(jīng)應(yīng)用于以下幾個(gè)方面:(1)中醫(yī)脈象信息的檢測(cè)與識(shí)別;(2)血壓的臨床檢測(cè);(3)心率穩(wěn)定性的一種簡(jiǎn)便估計(jì)方法;(4)心輸出量的一種測(cè)量方法;(5)血管功能的一種早期、無創(chuàng)檢測(cè)方法。MATLAB

4、(Matrix Laboratory,矩陣實(shí)驗(yàn)室)是由美國(guó)MathWorks公司開發(fā)的一種功能強(qiáng)、效率高、簡(jiǎn)單易學(xué)的可視化軟件,覆蓋面包括控制、通訊、金融、圖像處理、建筑、生物學(xué)等幾乎所有的行業(yè)與科學(xué)領(lǐng)域。除了經(jīng)典的一些算法外,MATLAB還提供了豐富的數(shù)據(jù)分析和處理功能模塊,如神經(jīng)網(wǎng)絡(luò)、小波分析、信號(hào)處理、圖像處理、自動(dòng)控制、模糊控制、系統(tǒng)仿真等,因此MATLAB是一種高效的編程軟件。本文介紹利用MATLAB軟件作為技術(shù)平臺(tái),實(shí)現(xiàn)對(duì)統(tǒng)脈搏波快速、準(zhǔn)確實(shí)時(shí)顯示,而且實(shí)現(xiàn)方法簡(jiǎn)單有效,有一定的實(shí)用性。2 軟件總體界面與總體設(shè)計(jì)思路2.1密碼登陸系統(tǒng)圖2.1 未運(yùn)行前密碼登陸界面圖2.2 運(yùn)行后輸

5、入錯(cuò)誤的密碼登陸界面圖2.3 運(yùn)行后輸入正確的密碼登陸界面2.2 脈搏信號(hào)處理系統(tǒng)界面圖2.4 未運(yùn)行前的脈搏信號(hào)處理系統(tǒng)界面圖2.4運(yùn)行后的脈搏原信號(hào)與濾波信號(hào)回放圖2.6運(yùn)行后的脈率曲線回放與判斷脈率正常、輸出脈搏信息圖2.7運(yùn)行后的頻譜分析2.3 軟件總體設(shè)計(jì)思路包含功能包含功能包含功能包含功能包含功能暫?;胤泡敵雒}搏信息判斷脈率正常與否輸出脈搏信號(hào)的采樣頻率、采樣時(shí)間、最大脈率、最小脈率等輸出脈率曲線文本框中脈率的更新脈率變化趨勢(shì)曲線脈率峰值變化曲線繼續(xù)回放X軸縮小X軸放大X軸縮小X軸縮小信號(hào)快進(jìn)信號(hào)快退信號(hào)慢進(jìn)信號(hào)慢退退出系統(tǒng)關(guān)閉窗口暫?;胤糯蜷_數(shù)據(jù)原始信號(hào)與濾波后的信號(hào)回放輸入正確

6、用戶名和密碼登陸脈搏信號(hào)處理系統(tǒng)運(yùn)行登陸軟件頻譜分析清除波形輸出文檔輸出信號(hào)幅頻譜曲線、功率譜曲線輸出按當(dāng)前日期和時(shí)間命名的文檔,包含有脈率及各種信息3 信號(hào)回放模塊設(shè)計(jì)3.1 脈搏波信號(hào)濾波脈搏信號(hào)是強(qiáng)干擾下的微弱信號(hào),脈搏信號(hào)幅度很小,大約是微伏到毫伏的數(shù)量級(jí)范圍,其主要頻帶范圍在020Hz之間。一般情況下為1Hz左右,脈搏信號(hào)可看成一個(gè)準(zhǔn)直流信號(hào),也可看成是一個(gè)甚低頻交變信號(hào)。根據(jù)脈搏功率譜能量分析,健康人脈搏能量絕大多數(shù)分布于0.55Hz,而病人脈搏在1Hz以下和較高頻段(如5Hz以上或10Hz以上)仍有相當(dāng)一部分的能量分布。脈搏信號(hào)極容易引入干擾,一般情況下,由體表檢測(cè)到的脈搏波主要

7、有三種干擾:基線漂移,高頻隨機(jī)干擾和運(yùn)動(dòng)偽差噪聲,還有一些干擾,比如工頻干擾,等,這些干擾較之前三種干擾比較小,而且很容易去掉。1).基線漂移:這種噪聲是由于被測(cè)對(duì)象的呼吸運(yùn)動(dòng)和身體移位而產(chǎn)生的,呼吸的頻率分量通常在0.8Hz以下,每個(gè)人的呼吸頻率也不同;身體移位也可以用低頻分量來表征,因此基線漂移基本上都是趨勢(shì)分量和低頻分量。2).高頻隨機(jī)干擾:脈搏信號(hào)的采集過程中有好多隨機(jī)噪聲和環(huán)境干擾的影響,這些噪聲都表現(xiàn)為高頻噪聲,在5Hz以上。3).運(yùn)動(dòng)偽差噪聲:由于對(duì)病人進(jìn)行血氧檢測(cè)時(shí),病人手指(或腳趾)經(jīng)常會(huì)發(fā)生運(yùn)動(dòng),使手指(或腳趾)與傳感器之間的距離發(fā)生位移,從而得到導(dǎo)致測(cè)量的病人脈搏波形很不

8、穩(wěn)定的一種噪聲,這種噪聲和信號(hào)在同一個(gè)頻帶范圍內(nèi),是脈搏信號(hào)去噪的一個(gè)重點(diǎn)和難點(diǎn)。所以,為了對(duì)信號(hào)做準(zhǔn)確的分析,在分析處理之前必須做一些必要的預(yù)處理。針對(duì)信號(hào)中存在噪聲的特點(diǎn),基線漂移和呼吸等低頻干擾在1Hz 以下,而脈搏信號(hào)主要在低頻范圍,所以可以設(shè)計(jì)讓信號(hào)先通過一個(gè)巴特沃斯帶通濾波器,借以濾除基線漂移、呼吸引起的干擾(考慮到不丟失太多的其他信息,通帶截止頻率設(shè)置為Wp=0.9,50,阻帶截止頻率設(shè)置為Ws=0.3,140,通帶波紋系數(shù)Rp=3,阻帶波紋系數(shù)Rs=10),如圖3.2,然后再通過一個(gè)切比雪夫二型濾波器濾除固定的工頻干擾(通帶截止頻率設(shè)置為Wp=30,65,阻帶截止頻率Ws=45

9、,55,通帶波紋系數(shù)Rp=3,阻帶波紋系數(shù)Rs=60),如圖3.3。由于Butterworth濾波器通帶內(nèi)有最大的平滑特性,信號(hào)經(jīng)過后衰減小,因此我們選用Butterworth帶通濾波器濾除基線漂移和呼吸等引起的干擾,但由于IIR濾波器本身固有的缺點(diǎn),信號(hào)通過Butterworth帶通濾波器后相位會(huì)失真,故我們可設(shè)計(jì)零相位Butterworth帶通濾波器去噪。50Hz固定工頻在頻域中是一個(gè)點(diǎn),因而要求設(shè)計(jì)的帶阻濾波器有好的截止特性,而切比雪夫II型濾波器有較好的截止特性,并且在其通帶內(nèi)單調(diào),故而設(shè)計(jì)零相位切比雪夫II型濾波器濾除工頻干擾。流程圖如下:Load命令讀取脈搏信號(hào)TXT文件去除基線漂

10、移通過Buttord和butter命令組成的巴特沃斯帶通濾波器通過cheb2ord和cheby命令構(gòu)成的切比雪夫二階濾波器原信號(hào)回放濾波信號(hào)回放圖3.1 脈搏信號(hào)濾波流程圖 圖3.2 巴特沃斯帶通濾波器 圖3.3 帶阻切比雪夫II型濾波器3.2 脈搏信號(hào)回放按鈕設(shè)計(jì)思路信號(hào)回放模塊設(shè)計(jì)如圖3.4,考慮到用戶使用的方便性,信號(hào)回放過程中才可對(duì)信號(hào)進(jìn)行放大與縮小操作,或者快進(jìn)退操作,在回放過程中,退出系統(tǒng)按鈕處于不激活狀態(tài),關(guān)閉窗口和繼續(xù)回放也處于不激活狀態(tài),只有當(dāng)信號(hào)暫停時(shí),才使前面三個(gè)按鈕激活,或者進(jìn)行下一步,輸出脈率曲線功能。圖 3.4 信號(hào)回放模塊設(shè)計(jì)1).信號(hào)回放:主要采用了Matlab

11、中的while、if、plot、axis、global、set、pause命令。思路先是將信號(hào)和濾波信號(hào)用plot命令分別在axes1、和axes2上畫出圖形,接著用axis移動(dòng)坐標(biāo)軸,用while進(jìn)行死循環(huán),讓信號(hào)不停的回放。2).信號(hào)暫停:主要利用if-break語句來實(shí)現(xiàn),在信號(hào)回放的控件Callback函數(shù)中,定義一個(gè)全局變量flg1,初始flg1=1,接著在while每次循環(huán)中,檢測(cè)flg1的值,為1繼續(xù)循環(huán)回放,為0的話跳出循環(huán),停止回放。所以,要信號(hào)暫停回放,只需要在信號(hào)暫停按鈕的Callback函數(shù)中,定義一個(gè)全局變量flg1,并命flg1=0即可。3).繼續(xù)回放:也是利用全局

12、變量來實(shí)現(xiàn),當(dāng)信號(hào)暫停回放時(shí),記錄下些時(shí)的X軸和Y軸的長(zhǎng)度大小,點(diǎn)擊繼續(xù)回放就還是用plot命令分別在axes1、和axes2上畫出圖形,接著用axis移動(dòng)坐標(biāo)軸,用while進(jìn)行死循環(huán),讓信號(hào)不停的回放。只不過這里要注意的是,此時(shí)坐標(biāo)軸的移動(dòng)不是從0開始,而是從暫停時(shí)的記錄下來的全局變量X軸的長(zhǎng)度大小xmin、xmax。4).關(guān)閉窗口:直接用delete(allchild(handles.axes1); delete(allchild(handles.axes2); 語句圖 3.5原信號(hào)和濾波后的脈搏信號(hào)回放4信號(hào)放大與縮小模塊設(shè)計(jì)4.1 設(shè)計(jì)界面考慮到信號(hào)回放過程中每個(gè)人的脈搏的曲線都會(huì)有

13、所不一樣,兩個(gè)波峰之間的時(shí)間,波峰的數(shù)值大小,為了能方便看到每個(gè)點(diǎn)的數(shù)據(jù),我在信號(hào)放大與縮小模塊中加了四個(gè)按鈕,可沿X軸縮小放大和沿Y軸縮小放大,如圖4.1。另外,考慮到操作的方便性,設(shè)計(jì)了在信號(hào)回放或者繼續(xù)回放的過程中,這四個(gè)按鈕才被激活,信號(hào)暫停時(shí),這四個(gè)按鈕都處于不激活的狀態(tài)。圖4.1 信號(hào)放大與縮小模塊4.2 信號(hào)放大與縮小按鈕設(shè)計(jì)思路1).X軸縮小: 即將信號(hào)沿X軸壓縮,如圖4.3,X軸的長(zhǎng)度變長(zhǎng),但是Y軸保持不變,這里,主要也是利用axis命令,實(shí)時(shí)的改變X軸長(zhǎng)度,并且用while進(jìn)行死循環(huán),直到遇到flg1=0,才跳出循環(huán)。程序流程圖如下:flg1=1flg1=0鼠標(biāo)點(diǎn)擊放大X軸

14、坐標(biāo)的Xmin=Xmin*0.5判斷全局變量flg1的值Xmin=Xmin+0.1;Xmax=Xmax+0.1Plot命令畫圖Axis(Xmin,Xmax,Ymin,Ymax)改變坐標(biāo)軸Pause命令延時(shí)0.5S暫停回放 圖 4.2 信號(hào)放大流程圖圖4.3 X軸縮小2).X軸放大: 即將信號(hào)沿X軸拉伸,如圖4.4,X軸的長(zhǎng)度變短,但是Y軸保持不變,這里,主要也是利用axis命令,實(shí)時(shí)的改變X軸長(zhǎng)度,并且用while進(jìn)行死循環(huán),直到遇到flg1=0,才跳出循環(huán)。圖4.4 X軸放大3).Y軸縮小: 即將信號(hào)沿Y軸壓縮,如圖4.5,Y軸的長(zhǎng)度變長(zhǎng),但是Y軸保持不變,這里,主要也是利用axis命令,實(shí)

15、時(shí)的改變X軸長(zhǎng)度,并且用while進(jìn)行死循環(huán),直到遇到flg1=0,才跳出循環(huán)。圖4.5Y軸縮小4).Y軸放大: 即將信號(hào)沿Y軸拉伸,如圖4.6,Y軸的長(zhǎng)度變短,但是Y軸保持不變,這里,主要也是利用axis命令,實(shí)時(shí)的改變X軸長(zhǎng)度,并且用while進(jìn)行死循環(huán),直到遇到flg1=0,才跳出循環(huán)。圖4.6 Y軸放大5 信號(hào)快進(jìn)退模塊設(shè)計(jì)5.1 設(shè)計(jì)界面考慮到有時(shí)信號(hào)的采樣時(shí)間很長(zhǎng),為了能快速瀏覽信號(hào)的波形或者看之前的波形,我特別又設(shè)計(jì)此模塊。圖 5.1 信號(hào)快進(jìn)退模塊界面5.2信號(hào)快進(jìn)退按鈕設(shè)計(jì)思路 1).快進(jìn):設(shè)計(jì)全局變量pauset=pauset*0.5,即讓每次移動(dòng)坐標(biāo)軸的時(shí)間間隔減小,再令

16、Xmin=Xmin+0.1,Xmax=Xmax+0.1,移動(dòng)X軸,這樣回放的速度就會(huì)變快,按鈕每按一次,回放速度加快一倍。 2).慢進(jìn):設(shè)計(jì)全局變量pauset=pauset*2,即讓每次移動(dòng)坐標(biāo)軸的時(shí)間間隔加大,再令Xmin=Xmin+0.1,Xmax=Xmax+0.1,移動(dòng)X軸,這樣回放的速度就會(huì)變慢,按鈕每按一次,回放速度減少一倍。 3).快退:設(shè)計(jì)全局變量pauset=pauset*0.5,即讓每次移動(dòng)坐標(biāo)軸的時(shí)間間隔減小,再令Xmin=Xmin-0.1,Xmax=Xmax-0.1,移動(dòng)X軸,這樣回放的速度就會(huì)變快,按鈕每按一次,回放速度加快一倍。 4).慢退:設(shè)計(jì)全局變量pauset

17、=pauset*2,即讓每次移動(dòng)坐標(biāo)軸的時(shí)間間隔減小,再令Xmin=Xmin-0.1,Xmax=Xmax-0.1,移動(dòng)X軸,這樣回放的速度就會(huì)變快,按鈕每按一次,回放速度加快一倍。6 脈率實(shí)時(shí)處理模塊設(shè)計(jì)6.1 脈搏信號(hào)峰值提取脈搏信號(hào)的特征提取是脈搏信號(hào)分析中的關(guān)鍵,能不能準(zhǔn)確的提取出來脈搏信號(hào)的特征關(guān)系到能不能準(zhǔn)確的分析脈搏信號(hào),其時(shí)域中提取的主要特征有脈搏的峰值、周期等。而在這其中最重要的是峰值的提取,準(zhǔn)確的提取出來峰值,可為進(jìn)一步分析其周期,脈率等其他 參數(shù)打下基礎(chǔ),如圖6.1 顯示的脈搏波,h為脈搏波形的高度。圖6.1 脈搏波形的高度提取信號(hào)的峰值基本思想是基于閾值的方法,統(tǒng)計(jì)分析采

18、集到得脈搏信號(hào)發(fā)現(xiàn),雖然每個(gè)脈搏波的波峰值大小并不相同,但他們總在一個(gè)范圍內(nèi)波動(dòng),波動(dòng)的范圍基本上不超過最大波形高度的0.3倍,為了更為可靠的檢測(cè)波峰,以0.4倍為參考。因此可以認(rèn)為波峰點(diǎn)是在每個(gè)脈搏周期中波形的最大值附近,大于其鄰域內(nèi)所有點(diǎn)的點(diǎn)。由于所用數(shù)據(jù)采樣頻率為800HZ,通過對(duì)大量脈搏波測(cè)量數(shù)據(jù)分析,把鄰域長(zhǎng)度定義為400個(gè)數(shù)據(jù)點(diǎn)可以準(zhǔn)確識(shí)別波峰點(diǎn)。 假設(shè)采集到的脈搏波為數(shù)字信號(hào)序列, 實(shí)際波峰的判別條件為:公式中, 為波峰點(diǎn)的位置。提取出波峰點(diǎn)的位置后,其他時(shí)域的特征,如周期、脈率等可相應(yīng)而出。峰值提取程序流程如下:NYNY開始取整個(gè)信號(hào)最大幅值PM設(shè)置峰值提取閾值G設(shè)置計(jì)數(shù)cnt

19、=0是否到數(shù)據(jù)最末尾PM-X(i)<G&&X(i)=max(x(i-200:i+200)儲(chǔ)存峰值點(diǎn)幅度和位置cnt=cnt+1結(jié)束圖6.1 判斷脈搏峰值程序流程圖6.2 脈率實(shí)時(shí)處理界面設(shè)計(jì)界面設(shè)計(jì)如圖6.2,脈率信號(hào)輸出窗口可輸出平均脈率、采樣頻率、采樣時(shí)長(zhǎng)、最大脈率、最小脈率等。圖6.2 脈率實(shí)時(shí)處理模塊6.3 脈率實(shí)時(shí)處理按鈕設(shè)計(jì)思路1).輸出脈率曲線:實(shí)時(shí)動(dòng)態(tài)輸出脈率變化趨勢(shì)曲線與脈率峰值變化曲線,如圖6.3同時(shí)在文本框1中實(shí)時(shí)平均脈率,這也是實(shí)時(shí)更新輸出。圖6.3 軟件實(shí)時(shí)輸出脈率趨勢(shì)曲線2).暫?;胤牛和V姑}率曲線的更新和平均脈率的更新,同時(shí)激活輸出脈搏信息按

20、鈕3).輸出脈搏信息:輸出所有脈率點(diǎn)的平均脈率,同時(shí)在列表中輸出采樣頻率、采樣時(shí)長(zhǎng)、最大脈率、最小脈率,并跳出判斷脈率是否正常的信息框(如圖6.4)。之后激活頻譜分析按鈕。圖6.4 輸出脈搏信號(hào)圖6.5 輸出脈搏信息到列表和文本框圖6.6 判斷脈率是否正常4).頻譜分析:輸出濾波后信號(hào)的幅頻圖和信號(hào)功率譜圖圖6.7 頻譜分析5).清除波形:清除窗口的繪圖6).輸出文檔:輸出TXT文檔,以電腦當(dāng)前的日期和時(shí)間命名,包含有所有計(jì)算出的脈率點(diǎn),以及采樣頻率、采樣時(shí)長(zhǎng)、最大脈率、最小脈率。7 參考文獻(xiàn)1 羅志昌,張松,楊益民,脈搏波的工程分析與臨床應(yīng)用M.北京:科學(xué)出版社,2006:1-202 鄭阿奇

21、,MATLAB實(shí)用教程M.北京:電子工業(yè)出版社,20043 王炳和,羅 建, 相敬林等. 人體脈搏功率譜分析與中醫(yī)脈診機(jī)理研究J. 西北大學(xué)學(xué)報(bào),2001,31( 1): 21-25.8 致謝 這里,首先要感謝候文生老師提供讓我設(shè)計(jì)此軟件的機(jī)會(huì)。軟件完成后,感觸頗多,覺得又學(xué)到了點(diǎn)了知識(shí),很有成就感。軟件前前后后花了總共一個(gè)禮拜的時(shí)間,這星期里起床后吃飯到睡覺時(shí)都在想著怎么來編寫代碼,怎么來完善軟件功能,一整天開機(jī)就Matlab,腦子就直想著怎么寫程序。設(shè)計(jì)每個(gè)控件按鈕時(shí),總會(huì)碰到很多問題,因?yàn)檎{(diào)試時(shí)各種Bug,光是界面就重畫了10來次。但我不放棄不后退,每次通過網(wǎng)上搜集資料、反復(fù)查看代碼、和

22、同學(xué)之間進(jìn)行交流總能把問題解決好,而且又想到新的功能設(shè)計(jì)。雖說軟件還不是很強(qiáng)大,設(shè)計(jì)也還不是很好,但還是算是自己設(shè)計(jì)的第一個(gè)軟件。最后,衷心感謝候老師安排的此次實(shí)驗(yàn),希望以后還能有更多這樣的實(shí)踐機(jī)會(huì)。附錄:(程序太多了,只附上主要部分的程序)1. 打開數(shù)據(jù)function pushbutton5_Callback(hObject, eventdata, handles)kong='' set(handles.listbox1,'string',kong); set(handles.edit1,'string',kong); axes(handle

23、s.axes1); grid on;axis(0,1,-2,4) axes(handles.axes2); grid on;axis(0,1,-2,4) global str;filename,pathname=. uigetfile('*.txt','choose');str=pathname filename;set(handles.pushbutton1,'enable','on');2.退出系統(tǒng)function pushbutton6_Callback(hObject, eventdata, handles)button1

24、=questdlg('你確定退出嗎?','退出程序','確定','取消','確定');if strcmp(button1,'確定')close(gcf);end3.原信號(hào)與濾波信號(hào)回放function pushbutton1_Callback(hObject, eventdata, handles)set(handles.pushbutton2,'enable','on');set(handles.pushbutton5,'enable','o

25、ff');set(handles.pushbutton6,'enable','off');set(handles.pushbutton10,'enable','off');set(handles.pushbutton11,'enable','off');set(handles.pushbutton15,'enable','on');set(handles.pushbutton16,'enable','on');set(handl

26、es.pushbutton17,'enable','on');set(handles.pushbutton18,'enable','on');set(handles.pushbutton19,'enable','on');set(handles.pushbutton20,'enable','on');set(handles.pushbutton21,'enable','on');set(handles.pushbutton22,'

27、;enable','on');global strglobal tglobal maiboglobal yminglobal ymaxglobal xminglobal xmaxglobal pausetpauset=0.5;data=load(str);t=data(:,1);maibo=data(:,2);ymin=min(data(:,2)-0.5;ymax=max(data(:,2)+0.5;%global s21global dtyy=data;x=yy(:,2)'dt=yy(:,1)'fs=800;%去除基線漂移k = .7; % cut-o

28、ff valuefc=0.3/fs;alpha = (1-k*cos(2*pi*fc)-sqrt(2*k*(1-cos(2*pi*fc)-k2*sin(2*pi*fc)2)/(1-k);y = zeros(size(x);for i = 1:size(x,1) y(1,:) = filtfilt(1-alpha,1 -alpha,x(1,:);end x1=x-y;%butter帶通濾波Wp=0.9 50/400;Ws=0.3 140/400;n,Wn = buttord(Wp,Ws,3,10);b,a = butter(n,Wn);%cheby去除50hz工頻干擾Wp1=30 65/400;

29、Ws1=45 55/400;rp=3;rs=60;n1,Wn1 = cheb2ord(Wp1,Ws1,rp,rs);b1,a1 = cheby2(n1,rs,Wn1,'stop');%信號(hào)之間的對(duì)比x2=filtfilt(b,a,x1);s21=filtfilt(b1,a1,x2);axes(handles.axes1);plot(t,maibo);title('原始脈搏信號(hào)');xlabel('時(shí)間/s');ylabel('幅值/mv');grid set(gca,'position',10 27.5 120 2

30、0);xmin=0;xmax=max(t)/10;axis(xmin,xmax,ymin,ymax)axes(handles.axes2);plot(dt,s21);grid;title('濾波去噪后脈搏信號(hào)');xlabel('時(shí)間/s');ylabel('幅值/mv');set(gca,'position',10 3 120 20);axis(xmin,xmax,ymin,ymax)%global flg1flg1=1;while 1 if (flg1=0) break; end xmin=xmin+0.1; xmax=xma

31、x+0.1; axes(handles.axes1);plot(t,maibo);title('原始脈搏信號(hào)');xlabel('時(shí)間/s');ylabel('幅值/mv');grid set(gca,'position',10 27.5 120 20); axis(xmin,xmax,ymin,ymax); %移動(dòng)坐標(biāo)系 axes(handles.axes2);plot(dt,s21);grid;title('濾波去噪后脈搏信號(hào)');xlabel('時(shí)間/s');ylabel('幅值/mv

32、');set(gca,'position',10 3 120 20);axis(xmin,xmax,ymin,ymax) pause(pauset);endguidata(hObject,handles);294.x軸縮小function pushbutton17_Callback(hObject, eventdata, handles)global xminglobal xmaxglobal s21global dtglobal tglobal maiboglobal yminglobal ymaxglobal pauset xmin=1/2*xmin;global

33、flg1flg1=1;while 1 if (flg1=0) break; end xmin=xmin+0.1; xmax=xmax+0.1; axes(handles.axes1);plot(t,maibo);title('原始脈搏信號(hào)');xlabel('時(shí)間/s');ylabel('幅值/mv');grid set(gca,'position',10 27.5 120 20);axis(xmin,xmax,ymin,ymax)axes(handles.axes2);plot(dt,s21);grid;title('濾

34、波去噪后脈搏信號(hào)');xlabel('時(shí)間/s');ylabel('幅值/mv');set(gca,'position',10 3 120 20);axis(xmin,xmax,ymin,ymax) pause(pauset);endguidata(hObject,handles);5.快進(jìn)function pushbutton15_Callback(hObject, eventdata, handles)global pausetpauset=pauset*0.5;6.輸出脈率曲線function pushbutton7_Callbac

35、k(hObject, eventdata, handles)set(handles.pushbutton1,'enable','off');set(handles.pushbutton5,'enable','off');set(handles.pushbutton6,'enable','off');set(handles.pushbutton8,'enable','off');set(handles.pushbutton9,'enable','

36、off');set(handles.pushbutton2,'enable','off');set(handles.pushbutton10,'enable','off');set(handles.pushbutton11,'enable','off');set(handles.pushbutton17,'enable','off');set(handles.pushbutton18,'enable','off');set(ha

37、ndles.pushbutton19,'enable','off');set(handles.pushbutton20,'enable','off');set(handles.pushbutton15,'enable','off');set(handles.pushbutton16,'enable','off');set(handles.pushbutton21,'enable','off');set(handles.pushbutto

38、n22,'enable','off');set(handles.pushbutton23,'enable','off');set(handles.pushbutton14,'enable','on');global strglobal pausetglobal tglobal TTyy=load(str);%HH=1./yy(3:1)x=yy(:,2)'fs=1000;%去除基線漂移k = .7; % cut-off valuefc=0.3/fs;alpha = (1-k*cos(2*pi*

39、fc)-sqrt(2*k*(1-cos(2*pi*fc)-k2*sin(2*pi*fc)2)/(1-k);y = zeros(size(x);for i = 1:size(x,1) y(1,:) = filtfilt(1-alpha,1 -alpha,x(1,:);end x1=x-y;%butter帶通濾波Wp=0.9 50/500;Ws=0.3 140/500;n,Wn = buttord(Wp,Ws,3,10);b,a = butter(n,Wn);%cheby去除50hz工頻干擾Wp1=30 65/500;Ws1=45 55/500;rp=3;rs=60;n1,Wn1 = cheb2o

40、rd(Wp1,Ws1,rp,rs);b1,a1 = cheby2(n1,rs,Wn1,'stop');%信號(hào)之間的對(duì)比x2=filtfilt(b,a,x1);s21=filtfilt(b1,a1,x2);%頻譜圖F=fft(s21);%R波的提取A=s21;PM=max(A);MM=min(A);G=(PM-MM)*0.3; %峰值大小波動(dòng)范圍不超過最大波形高度的0.3倍 if max(A(1:200)=max(A(1:550)P1(1),t1(1)=max(A(1:200); cnt1=1; elseif max(A(1:200)=max(A(1:550) cnt1=0; e

41、ndfor i=201:length(A)-200 %因?yàn)橹芷诖笥?00,波峰大于其左右各200個(gè)點(diǎn)內(nèi)的所有值if PM-A(i)<G&&A(i)=max(A(i-200:i+200) P1(cnt1+1)=A(i); t1(cnt1+1)=i*1.25; %時(shí)間! cnt1=cnt1+1; endendif max(A(length(A)-199:length(A)=max(A(length(A)-550:length(A)P1(cnt1+1),t1(cnt1+1)=max(A(length(A)-199:length(A); cnt1=cnt1+1;end% %求周期

42、Tj=1;for m=2:length(t1) T(j)=t1(m)-t1(m-1); j=j+1; MMT(j-1)=(1./mean(T)*1000*60;endTT=(1./T)*1000*60;TT=(1./T)*1000*60;yymin=1;yymax=2;mmax=max(P1)+2;axes(handles.axes1);plot(P1);axis(yymin yymax 0 mmax); grid on; xlabel('峰值數(shù)');ylabel('峰值');title('脈搏峰值變化曲線');set(gca,'posi

43、tion',10 27.5 120 20);axes(handles.axes2);plot(TT);axis(yymin yymax 0 100); grid on; xlabel('脈搏數(shù)');ylabel('脈率(次/min)');title('脈率變化曲線');set(gca,'position',10 3 120 20);mT=mean(TT);global maibomaibo=mT;global flg3flg3=1;global xxminglobal xxmaxi=1;while 1 if (flg3=0

44、) xxmin=yymin; xxmax=yymax; break; end if (yymax=cnt1); yymin=0; yymax=5; end mai=round(MMT(i); mai=num2str(mai); i=i+1; if (i=cnt1) i=1; end set(handles.edit1,'string',mai,'fontsize',18); yymin=yymin+1; yymax=yymax+1; axes(handles.axes1); plot(P1);axis(yymin yymax 0 mmax); grid on;

45、xlabel('峰值數(shù)');ylabel('峰值');title('脈搏峰值變化曲線');set(gca,'position',10 27.5 120 20); axes(handles.axes2);plot(TT);axis(yymin yymax 0 100); grid on; xlabel('脈搏數(shù)');ylabel('脈率(次/min)');title('脈率變化曲線');set(gca,'position',10 3 120 20); pause(pau

46、set);end7.輸出脈搏信息function pushbutton8_Callback(hObject, eventdata, handles)global maiboglobal TTglobal t str1='脈搏采樣頻率:' HH1=1./t(2); str2=num2str(HH1); str3='Hz' strr=str1 str2 str3; ktr1='脈搏采樣時(shí)長(zhǎng):' HH2=max(t); ktr2=num2str(HH2); ktr3='S' ktrr=ktr1 ktr2 ktr3; htr1='

47、脈率最大值:' htr2=num2str(round(max(TT); htr3='次/min' htrr=htr1 htr2 htr3; gtr1='脈率最小值:' gtr2=num2str(round(min(TT); gtr3='次/min' gtrr=gtr1 gtr2 gtr3; trrr=strvcat(strr,ktrr,htrr,gtrr); set(handles.listbox1,'string',trrr);maibo1=num2str(round(maibo);if maibo<60 msgb

48、ox('健康成人在安靜狀態(tài)下脈率為60100次/min,您的脈率過慢,建議到醫(yī)院檢查','脈率正常與否判斷');end if maibo>100 msgbox('健康成人在安靜狀態(tài)下脈率為60100次/min,您的脈率過快,建議到醫(yī)院檢查','脈率正常與否判斷'); else msgbox('健康成人在安靜狀態(tài)下脈率為60100次/min,您的脈率屬于正常范圍,請(qǐng)繼續(xù)保持','脈率正常與否判斷'); end set(handles.pushbutton24,'enable',&

49、#39;on'); set(handles.pushbutton8,'enable','off');set(handles.edit1,'string',maibo1,'fontsize',18);7.頻譜分析function pushbutton24_Callback(hObject, eventdata, handles)set(handles.pushbutton9,'enable','on');set(handles.pushbutton23,'enable',

50、9;on');global stryy=load(str);x=yy(:,2)'fs=1000;%去除基線漂移k = .7; % cut-off valuefc=0.3/fs;alpha = (1-k*cos(2*pi*fc)-sqrt(2*k*(1-cos(2*pi*fc)-k2*sin(2*pi*fc)2)/(1-k);y = zeros(size(x);for i = 1:size(x,1) y(1,:) = filtfilt(1-alpha,1 -alpha,x(1,:);end x1=x-y;%butter帶通濾波Wp=0.9 50/500;Ws=0.3 140/500;n,Wn = buttord(Wp,Ws,3,10

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論