如何製作胎心音器

要知道小Baby 在媽媽的肚子裡是否平安的長大,通常會透過超音波的照射來觀察小孩現在的生長狀況。關於照射超音波是否會對小孩的生長造成負面的影響,至今仍然眾說紛紜。 一般的家庭其實很難在家中擁有一台超音波的顯像機器,因此懷孕五個月大之後的媽媽,通常都是利用小孩的胎動來感覺小孩是否正常成長。

胎心音器是一種可以聆聽小孩心胎音的機器,費用也遠比超音波顯像儀來的便宜的多,因此,許多懷孕的媽媽們會購買一台胎心音器在家中,隨時監測小 Baby 的心跳是否正常。胎心音器的製作原理其實非常簡單,背景知識主要是傅立葉轉換。以下我們將介紹胎心音器的原理,並且介紹簡單的 Matlab 程式,來模擬胎心音器核心元件的功能。

一般來說,正常人的心跳範圍在每分鐘 60 到 80 下左右,而小 Baby 的心跳範圍在 120 到 160 之間都算正常。因為小 Baby 的自律神經發展尚未完全,所以,他們的心跳是用這麼快的速度來跳動,當小孩漸漸長大,他們的心跳速度會慢慢下降到正常人的範圍。要偵測胎兒在母體裡的心跳,難免會同時收錄到媽媽動脈的脈搏聲音。因此,兩個重疊的訊號如何被分離,我們就是利用媽媽和小孩心跳頻率不同的特性來分離訊號。由於懷孕的婦女通常會辦隨著心律不整並且心跳加快的現象,所以,要區分是媽媽的心跳聲還是小孩的心跳聲用肉耳聽還真是有點難度。以下是兩個心跳的樣本,一個是媽媽的心跳聲,另一個是小孩的心跳聲。讀者可以下載後聽聽看,看看是否能用聽的分辨的出來。下圖呢,分別是方才的心跳聲的波形

 http://glophy.com/images/Matlab/mamy_wave.jpg

(媽媽的心跳聲波形)

 http://glophy.com/images/Matlab/baby_wave.jpg

(Baby 的心跳聲波形)

上圖是用Matlab 把wav 檔直接讀入一個向量,讀入的方法是利用 [Y,Fs,Nbits] = wavread('mamy.wav'); 指令。其中Y 是儲存wav 檔的變數,Fs 是取樣率,Nbits 是每一個聲音取樣用多少個bits 來儲存。若有一個向量要用聲音的方式來儲存,在Matlab 裡面也非常容易,語法是wavwrite(Y,Fs,Nbits,'檔名')。若要在Matlab 裡面試聽一個向量對應的聲音,只要利用 sound(Y,Fs) 即可播放。

若我們直接從時間域上觀看媽媽的心跳和小孩的心跳,我們會覺得有所差別,但是又說不清楚個所以然來。這時,我們可以利用傅立葉轉換或是離散餘弦轉換(DCT)把時間域的資料轉換到頻率域的資料。例如,X = dct(Y); X 是Y 的離散餘弦轉換,方才媽媽與Baby 心跳的頻率圖形如下圖。

http://glophy.com/images/Matlab/mamy_fre.jpg

(媽媽的心跳頻率圖形)

 http://glophy.com/images/Matlab/baby_fre.jpg

(Baby 的心跳頻率圖形)

從圖形上我們可以清楚的看見兩個特性,第一是Baby 的心跳頻率域的表現,幾乎在每一個頻率上都有值,這表示在Baby 的心跳訊號中充滿了雜訊。一般而言所謂的雜訊是一種 white noise ,被稱作 white 的原因,是因為這樣的訊號頻率,就好像白光一樣,是在每一個光譜上都有分量(所有有色光的加總正好是白光)。第二是Baby 的心跳主頻率發生的位置比媽媽的心跳主頻率來的高。這也印證了Baby 的心跳比媽媽心跳來的快。

當我們清楚看到媽媽的心跳和Baby 的心跳在頻率域上有如此明顯的區別時,我們就可以利用這個特性來濾出小Baby 的心跳聲,先在頻率域上作處理,把雜訊移除,然後再轉換成時間域上可以讓人聽見的訊號。因為媽媽的心跳頻率和 Baby 的心跳頻率有重疊的部份,因此我們還需要用到 Clustering 的技術來校正小Baby 的心跳聲,建議的方法是Gaussian mixture model,往後我們會在開專題來介紹何為 Gaussian mixture model 技術。

在Matlab 裡面要移除混雜在心跳上的雜訊其實非常容易。假設 X 是 Baby 心跳的頻率資料,我們可以利用

X = X.*(abs(X)>0.5);

這個指令,就可以把雜訊移除,再來是過高頻率的訊號我們也當作是機件造成的雜訊,因此我們用

X(6*10^4:end)=0;

這個指令把高頻的訊號都移除。最後再利用

Y = idct(X);

把頻率域上得資料轉換為時間域上的資料,然後儲存。瞧!處理過後的訊號比原來的訊號清楚多了,少了許多機件帶來的音爆聲。