作作者者::陳陳明明周周 ((22000033--0077--1122));;推推薦薦::徐徐業業良良((22000033--0077--1122))。。
附附註註::本本文文為為九九十十三三學學年年度度元元智智大大學學機機械械工工程程研研究究所所陳陳明明周周碩碩士士論論文文「「鼾鼾聲聲監監測測裝裝置置 之之設設計計與與製製作作」」第第四四章章。。
第四章 鼾聲監測裝置軟體設計
本研究鼾聲監測裝置中,鼾聲經過訊號聲音感測系統及濾波系統後,輸入 PIC16f877 進行 A/D 轉換,之後以鼾聲判斷程式進行辨別及輸出。本章的重點就在介 紹鼾聲判斷程式之設計。
4.1 鼾聲監測裝置之使用說明與軟體程式流程
圖 4.1 為本研究鼾聲監測裝置之操作與顯示介面,外觀正面為一 LCD 顯示幕、
四段旋鈕開關、及調整時間之增加數字按鈕與切換項目按鈕,側面則有一睡眠模式開 關。
圖 4.1 鼾聲監測裝置之控制介面
平時將睡眠模式開關調整在「一般模式」,此時四段旋鈕開關若在“normal”的位 置,LCD 顯示器上會顯示時間、日期等一般資訊;將旋鈕開關旋至“report”的位置,
即可查閱前一次睡眠的鼾聲報告;將旋鈕開關旋至“time_set”或是“alarm_set”的位置,
即可對系統時間以及鬧鐘時間進行調整,調整的方式為以增加數字按鈕增加數字,以 切換項目按鈕切換欲調整的項目。
準備入睡時可將睡眠模式開關調至「睡眠模式」,旋鈕開關調至“normal”的位置,
便會啟動監測鼾聲以及睡眠呼吸中止症鼾聲特徵模式,並且將相關資訊記錄於 MMC 卡中。當使用者起床後將睡眠模式開關再調回「一般模式」,鼾聲監測裝置便會計算 使用時間,若使用者遲遲未將睡眠模式開關調回「一般模式」,則對鼾聲的監測會自 動於啟動 8 小時後停止。
在「睡眠模式」下若將旋鈕開關調至“report”、“alarm_set”、或“time_set”位置,
亦可進行查閱報告及鬧鐘或時間調整,但此時監測的動作中斷,待旋鈕開關調回
“normal”位置後才會繼續。
若是使用者搭配使用睡眠監測系統之 BioMat,則可將睡眠模式開關調至「BioMat 模式」,此時鼾聲監測裝置的監測動作將由 BioMat 控制啟動與停止,不需使用者手動 控制。
圖 4.2 為本鼾聲監測裝置之軟體程式流程,程式區分為“Sleep Mode”、“Normal Mode”、“Report Mode”、“Alarm_set Mode”、與“Time_set Mode”等 5 個副程式,由睡 眠模式開關與旋鈕開關之位置進入對應的副程式。因此本鼾聲監測裝置之內部程式除 了對鼾聲及睡眠呼吸中止症模式特徵進行判斷,還同時整合控制介面、資料顯示、時 鐘設定等功能。
開始
If (sleep_switch)
if (normal)
“Normal Mode”副程 式:顯示時間、日期等
一般資訊
if (report)
“Report Mode”副程 式:顯示鼾聲與睡眠呼 吸中止症鼾聲模式特徵
報告
“Alarm_set Mode”副 程式:調整鬧鐘時間
“Time_set Mode”副 程式:調整系統時間 if (time_set)
if (alarm_set) F
F
F
T
T
T
T
F
清除前次紀錄
“Sleep Mode”副程 式:偵測鼾聲與睡眠呼 吸中止症鼾聲模式特徵 while
(sleep_switch) T
If (normal)
if (report)
if (alarm_set)
Break;
“Report Mode”副程 式:顯示鼾聲與睡眠呼 吸中止症鼾聲模式特徵
報告
“Alarm_set Mode”副 程式:調整鬧鐘時間 T
T F
F
F
T T
F
if (time_set) F
T “Time_set Mode”副 程式:調整系統時間
一般模式 睡眠模式
圖 4.2 鼾聲判斷程式運作流程圖
如圖 4.2,監測裝置開機運作後,會對睡眠模式開關(程式中稱為“sleep_switch”)
等一般資訊。接著不論是睡眠模式開關在睡眠模式或一般模式,都可以隨時由調整四 段旋鈕開關選擇進入“Report Mode”副程式查閱鼾聲報告,或是進入“Alarm_set Mode”
與“Time_set Mode”副程式調整鬧鐘與系統時間。相關程式功能整理如表 4.1,以下針 對各模組進行介紹,原始程式請參考附錄 G。
表 4.1 相關程式功能整理
一般模式 睡眠模式
Normal Mode 顯示日期、時間 顯示時間、鼾聲次數、符合睡眠呼吸中止症鼾聲 模式特徵次數
Report Mode 顯示前次鼾聲報告 顯示即時鼾聲報告 Alarm_set Mode 調整鬧鐘時間 調整鬧鐘時間
Time_set Mode 調整系統時間 調整系統時間(紀錄歸零)
4.2 “Normal Mode”副程式
睡眠模式開關在一般模式、旋鈕開關在“normal”位置時,執行“Normal Mode”副 程式。此時鼾聲監測裝置的功能近似於一般鬧鐘,於 16×2 的 LCD 面面板顯示如圖 4.3 的時間、日期資訊。“Normal Mode”副程式流程如圖 4.4,先由 DS1302 晶片取得 即時時間,若與鬧鐘設定時間相同則 Beeper 發出聲響,若與鬧鐘設定時間不同則將 時間、日期顯示於 LCD。最後檢查睡眠模式開關腳位是否受到調整,是則跳出“Normal Mode”副程式,否則繼續反覆執行“Normal Mode”副程式。
0 2 : 4 5 : 2 2
2 0 0 4 / 0 1 / 0 1
時間
日期
圖 4.3 執行“Normal Mode”副程式時顯示面板資訊
圖 4.4 “Normal Mode”副程式執行流程
4.3 “Report Mode”副程式
不論睡眠模式開關的位置,旋鈕開關旋至“report”位置,即執行“Report Mode”副 程式,此時 LCD 面板顯示如圖 4.5 所示,顯示訊息包括有打鼾嚴重程度、呼吸中止 症可能性、平均每小時打鼾次數、以及平均每小時符合呼吸睡眠中止症模式特徵次 數,為前一次進入睡眠模式所紀錄的數據資料。圖 4.6 為“Report Mode”副程式的流程 圖,其中打鼾嚴重程度分級方式以及呼吸中止症可能性的認定方式說明如下。
[ m e d i u m ] 3 7 5 / H r
[ M a y b e ] 7 / H r
鼾聲嚴重程度 平均每小時打鼾次數
睡眠呼吸中止症可能性 平均每小時符合睡眠呼吸中 止症鼾聲模式特徵次數
圖 4.5 執行“Report Mode”副程式時顯示面板資訊
Report False
跳出“Report Mode” 副程式
snore_per_hour=snore*60/
(last_snore_time-first_snore_time);
osas_per_hour=osas*60/
(last_snore_time-first_snore_time);
//計算每小時鼾聲次數&每小時符合呼 吸中止症鼾聲模式特徵次數
if (snore_per_hour<96)
else if (snore_per_hour<288)
else if (snore_per_hour<480) True
False
False
[Serious]
False [None]
[Slight]
[Medium]
if (osas<30 &&
osas_per_hour<5)
else if (osas<50 &&
osas_per_hour<10)
[Yes]
False
False
[Maybe]
[Unlike]
Printf(“平均每小時鼾聲次數.”) Printf(“睡眠呼吸中止症鼾聲模式 特徵次數.”)
Printf(“使用時間 .”)
delay_ms(300);
True
圖 4.6 “Report Mode”副程式執行流程
(1) 鼾聲嚴重程度分級方式
本研究鼾聲監測裝置執行“Report Mode”副程式時,顯示面板會輸出每小時鼾聲 次數,計算方式為總鼾聲次數所除以第一次與最後一次打鼾的間隔小時(而非使用時 間),供使用者瞭解前晚睡眠鼾聲嚴重程度。
然而一般人對每小時鼾聲次數對應的鼾聲嚴重程度可能並無具體概念。一般人平 均每分鐘呼吸 16 次,一小時的呼吸次數即為 960 次,假設這 960 次的呼吸都伴隨著 打鼾,則每小時的最多可能打鼾次數即為 960 次。本研究鼾聲監測裝置即依據每小時 鼾聲次數之比例,將鼾聲嚴重程度分為[none]、[slight]、[medium]、[serious]四種等級 顯示於面版上:
[none]:每小時鼾聲次數小於最多可能次數的 10%,即每小時鼾聲少於 96 次。
[slight]:每小時鼾聲次數在最多可能次數的 10%~20%之間,即每小時鼾聲 在 96~288 之間。
[medium]:每小時鼾聲次數在最多可能次數的 20%~40%之間,即每小時鼾 聲在 288~480 之間。
[serious]:每小時鼾聲次數大於最多可能次數的 40%,即每小時鼾聲超過 480 次。
(2) 睡眠呼吸中止症可能性分級方式
睡眠呼吸中止症的在醫學診斷上的定義為「每小時的睡眠中有 5 次或以上超過 10 秒的阻塞性呼吸中止事件,或每 7 小時睡眠有 30 次的事件」。根據上述定義,本 研究鼾聲監測裝置依所偵測睡面呼吸中止症鼾聲模式特徵發生次數,對睡眠呼吸中止 症可能性的判斷定分為[Unlike]、[Maybe]、[Yes]三種情形
[Unlike]:每小時 5 次之內且整夜睡眠在 30 次之內。
[Maybe]:每小時 5~10 次之間或整夜睡眠在 30~50 次之間。
[Yes]:每小時 10 次以上且整夜睡眠在 50 次以上。
其中每小時發生次數亦是由總數除以第一次與最後一次打鼾的間隔小時。由於本鼾聲 監測裝置所量測的是鼾聲次數以及符合睡眠呼吸中止鼾聲模式特徵的次數,此處對睡 眠呼吸中止症可能性的判斷亦僅提供使用者參考,不作醫療診斷上的用途。
4.4 “Alarm_set Mode”副程式及“Time_set Mode”副程式
不論睡眠模式開關的位置,旋鈕開關旋至“alarm_set”位置,即執行“Alarm_set Mode”副程式,旋至“time_set”位置,即執行“Time_set Mode”副程式。
程式進入“alarm_set”模式後,會依照「時 分」的順序供使用者調整鬧鐘時間。
進入“time_set”模式後,會依照「時 分 年 月 日」的順序,供使用者調整至正 確時間。以下以“time_set”為例,說明調整程式內部運作的流程。
圖 4.7 為進入“time_set”模式後的程式流程,首先使用一個 while 迴圈將程式停留 在調整“時”的狀態,按「切換項目按鈕(change)」即可往下一個調整項目,最後會 再回到調整“時”。程式於切換之間必需延遲 300msec,因為按鈕動作並非一瞬間完 成,若沒有延遲會導致程式以高速不斷往下一個項目切換而無法控制。調整完畢後將 旋鈕開關切離“time_set”模式即可。
圖 4.8 乃放大圖 4.5 紅色虛框的部份,以詳細說明對程式是如何對時間進行調整。
首先在顯示器中顯示去掉小時的完整時間,延遲 400msec 後再顯示包含小時的完整時 間再延遲 400msec,如此即可製造閃爍的效果,使用者可以清楚得知現在處於調整小 時的狀態。接著按下「增加數字(add)」按鈕,遞增代表小時的變數(hour),每次遞增 當中必需延遲 500msec 以避免增加過於快速而無法控制。達到正確的時間後使用「切 換項目(change)」按鈕往下切換,再以相同方法調整分、年、月、日。“Alarm_set Mode”
中對鬧鐘時間的調整方式上述完全相同,不另外說明。
圖 4.7 Time_set 模式流程圖(省略年、月、日)
圖 4.8 調整時間的細部流程圖
4.5 “Sleep Mode”副程式
對於鼾聲以及睡眠呼吸中止症模式特徵的判斷集中於“Sleep Mode”副程式,是整 個軟體程式最重要的部份。睡眠模式開關在睡眠模式、旋鈕開關在“normal”位置時,
執行“Sleep Mode”副程式,對鼾聲以及睡眠呼吸中止症特徵模式進行判斷。
執行“Sleep Mode”副程式時面板顯示資訊如圖 4.9,顯示 Vsum、使用時間、實際
合睡眠呼吸中止症鼾聲模式特徵的次數都會隨著偵測而增加;Vsum的定義詳細說明如 後,Vsum的值會隨周圍音量大小而變化,可增加面板的動態效果。
0 2 : 4 5 : 2 2 1 9 3 1 4 5 3
3 . 5 H r 0 1 / 0 1 2 5
打鼾次數
使用時間 實際日期
Vsum
睡眠呼吸中止症鼾聲 模式特徵次數
圖 4.9 睡眠模式面板資訊
4.5.1 訊號前處理
本研究鼾聲監測裝置接收鼾聲訊號後首先進行「前處理」,將 A/D 轉換後的電壓 數位訊號進行平滑化。圖 4.10 為將 4 次鼾聲的電壓訊號以 1.2kHz 的擷取頻率記錄,
以下以此訊號前處理的流程。
聲波訊號的特性是會依一個電壓準位做上下振盪,但這樣的訊號形態不易處 理,因此第一步先將電壓準位以程式的方式歸零,所採用的方法為將 A/D 值 10 筆計 算一次平均,可以得到上下振盪的中心線,如圖 4.11 所示,再將新進的值與中心線 相減,即可得到如圖 4.12 準位歸零後的波形,此時的擷取頻率仍為 1.2kHz。
圖 4.11 電壓訊號(藍)與中心線(紅)
此時的訊號乃是上下振盪,但向下的資料點對鼾聲判斷並沒有幫助,因此採用尋 找區域最大值的方式來去掉不必要的訊號,也就是每 10 個資料點中比較出一個最大 值來代表這 10 個點,如此就可將向下的點去除,圖 4.12 的波形也就簡化成如圖 4.13 所示,此時的運算頻率為 120Hz。圖中播放的鼾聲音量約為 75 分貝,圖中鼾聲所造 成的最大電壓為 300mV,而無聲的電壓為 75mV,兩者僅相差 225mV,若鼾聲的音 量再更小,可能就會造成判斷上的困難,因此使用 10 筆做一次總合也就是類似積分 的方式,來強化訊號的能量,拉大有聲與無聲時的差距,以利於判斷,波形成為如圖 4.14 所示,此時的運算頻率為 12Hz。然而圖 4.14 的波形還是有過多的起伏,因此再 使用 10 點做平均的方式進行平滑化,即成為如圖 4.15 的紅色平滑曲線。
圖 4.12 將電壓準位歸零
圖 4.13 取每 10 個的最大值(120Hz)
圖 4.14 每 10 點做一次總合(12Hz)
鼾聲訊號經過前處理後圖 4.13~15 的 Y 軸定義為“Vsum”,代表該時間內聲音能量 大小。在鼾聲判斷程式中以一個名為“getVsum()”的副程式專門計算 Vsum,圖 4.16 為 getVsum()的副程式流程。
圖 4.16 前處理副程式 getVsum();流程圖
訊號成為如圖 4.15 的狀態後,鼾聲由複雜的上下振盪成為平滑的連續遞增與遞
訊號連續 6 個資料點(約 0.5 秒)均為遞增表示鼾聲開始,將 Tduration歸零;連續連續 9 個資料點(約 0.75 秒)均為遞減表示鼾聲結束,紀錄此時的 Tduration即為鼾聲持續 時間,並且將 Tinterval歸零;偵測到再一次連續 6 個資料點均為遞增,紀錄此時的 Tinterval 即為鼾聲間隔時間。如此即可得到鼾聲判斷中所需的鼾聲持續時間及鼾聲間隔時間,
如圖 4.17 所示。再配合第二章中 Tduration以及 Tinterval的時間特性,即可進行鼾聲判斷。
圖 4.18 為“Sleep Mode”模式的流程圖。
連續遞增6次
連續遞減9次
Tduration Tinterval
連續遞增6次
900
600
300 Vsum
圖 4.17 鼾聲判斷模式
4.5.2 MMC 記憶卡資料儲存與讀取
在“Sleep Mode”模式中,鼾聲判斷程式除了偵測鼾聲,同時也將資料儲存於 MMC 卡中,儲存項目包括有開始的時間、日期,以及運作中每隔 1 分鐘就會寫入該分鐘內 所累計的鼾聲次數以及符合睡眠呼吸中止症模式特徵次數,還有結束的時間、日期。
MMC 卡將依一年 365 天劃分為 365 個檔案,鼾聲判斷程式會依照進入睡眠模式 的日期將資料存入 MMC 卡內對應的檔案。本鼾聲監測裝置的歷史資料的最大保留量 即為 1 年。
MMC 卡的資料可由一個專門的 Matlab 撰寫的「歷史資料查詢程式」讀取,程式 的一開始會詢問使用者欲查詢的日期,接著就可以列出如當日的使用時間始末、鼾 聲、睡眠呼吸中止症模式特徵次數、打鼾嚴重程度、以及呼吸中止症可能性。「歷史 資料查詢程式」詳列於附錄 H。