我在做一個計算心率的演算法,具體來說就是對採來的感測器信號做預處理後,用fft計算頻譜,找到峯值,對應的點就代表心率。然而實際測試中發現問題。根據公式:頻率=(n-1)*Fs/N,n代表fft譜上的點,Fs代表採樣頻率,N為信號長度。我取了Fs為25,N為250,也就是說信號時長為N/Fs=10s,用10s的信號來計算一個時間點的頻率。上式的參數導致的結果是頻率的解析度為Fs/N為0.1,對應的心率結果為0.1*60=6,也就是說計算出來的心率結果都是6的倍數,這明顯不合理。可以通過增大N值來提高解析度,但這意味著要用更長的時間來計算一個時間點的頻率,這也不合理,請問各位大神們有什麼好的解決方案?謝謝!


我猜想題主也沒有辦法改變採樣率,這樣的話這就是一個超解析度譜分析問題。

方法1:傳統超解析度分析方法,比如MUSIC或者ARMA。

方法2:既然心率是單個頻率,心跳信號應該是頻域稀疏的。這樣就可以用稀疏信號恢復的方法來試試看。

(附加的)方法3:我不知道心率信號有沒有參數化模型,如果有的話可能效果會更好。


從兩個角度為題主提供一下思路:

1.採樣率:題主並未給出是在什麼信號的基礎上進行心率的計算,我們考慮心電信號(ECG)或脈搏波(ABP)信號,這兩種信號較為典型的採樣率分別是500Hz和125Hz,遠高於題主給出的25Hz。

2.準週期:不管源信號是什麼信號,心率是一個準週期的低頻信號,從我認知的角度來講,通過FFT獲得的頻譜上,只有嚴格週期信號才能獲得較為明顯的尖峯,因此直接對信號做FFT幾乎不可能得到準確的心率值。比較合理的做法都是直接從時域上對心拍進行定位,然後計算兩個心拍間的距離,從而獲得逐博心率。

典型的演算法可以參考:

脈搏波:WABP(1)

心電圖:直接預處理+窄帶濾波再進行一個峯值檢測就可以獲得R波位置,然後通過RR間期即可算得心率。通常情況下這種演算法的精度已經完全夠用了,如果還需要進一步提高精度,可以通過QRS波進行定位,典型方法包括:

SQRS(1)

https://www.physionet.org/physiotools/wag/wqrs-1.htm

QRS detection and waveform boundary recognition using ecgpuwave

以上鏈接均包括源代碼,有興趣的話可以自行閱讀源碼,瞭解演算法實現細節。


心率也就幾個Hz到頭了,採樣率可以降。可以分兩級做,先fft粗搜,再用dft細搜,只計算感興趣的頻點就好。


樓主問題解決了麼?我也在做類似的事情,發現對於低頻信號,計算功率譜密度圖會明顯一點,不知道這種方法是否可行?我自己三角函數反推生成的數據做功率譜密度圖,計算出的頻率和實際相差不太大。


提高頻率解析度:

1、增大n。

2、減小採樣率。

心率的頻率也就1.5HZ左右。是用25HZ使得fft分析的頻譜過寬,精度就損失了。最好把25HZ降到8HZ也就足夠了,也就是最大測到240的心率。這樣可以提高4倍精度,心率精度就在1-2之間了。


推薦閱讀:
相關文章