項目經歷

項目一 :助聽器性能優化項目

STM32F4系列芯片:最高180MHz主頻,1M閃存,192KB的內存。現在 頻率降低到12MHz,4.5ms,仍然有下降的可能。內存的話看編譯器這裏是64位的編譯器,要計算全局變量,一個char是一個字節等等。int 4個字節,long8字節,數組最煩了。char*8字節指針類型存儲的是所指向變量的地址,所以32位機器只需要32bit,而64位機器需要64bit。
項目描述:經過幾代的硬件版本的優化,盒式助聽器模型已經基本確定,並且在前任實驗室師兄的努力下,助聽器的代碼也已經有了整體框架,並且能在硬件平臺上得到一個比較好的助聽效果。但是仍然存在嘯叫、主頻大、功耗大等不足需要改進。
項目任務:在已經能夠基本實現聲音放大及降噪處理的助聽器上進行性能的完善,包括解決嘯叫問題、降低主頻、代碼結構優化及聲音質量的提高等。
項目角色:主要負責人之一
助聽器技術的簡介:

  1. 首先是硬件方面:
    聲音先通過雙麥克風陣列,然後通過硬件上的放大器進行放大,然後再給AD/DA芯片(WM8978語音芯片兩路的AD通道),這個是16位的AD,也就是說分辨率是1/(216-1),如果是8位那麼分辨率就是1/(28-1)也就是1/255了,如果電壓是5V那麼就是5V對應着255,0V對應着0,現在的16位意味着若參考電壓是5V的話數模轉換後的數就是:Vf*(5/(2^16-1))。這個是轉換值那麼還有一個值是AD採樣率,一般助聽器需要的或者說能接收到的聲音頻率不會超過8Khz,所以採樣率就是16K。
    得到數字信號後(這就是已經是離散的了,變成了一個一個點了,後面就可以分針加窗了)然後再通過STM32F4進行信號的一系列處理:分幀加窗、AGC、FFT、嘯叫抑制、維納濾波、WDRC等。
    2、軟件方面的介紹:
    有幾點關於語音的知識點:1)關於分貝:分貝的定義就是功率的計量,dB=lg(pi/po),而P=I^2*R.電壓、電流與功率是成平方的關係。所以如果是功率的話就是10爲係數,如果是電壓電流的話就是20爲係數。2)人的聽覺神經能識別的時間爲100ms=0.1s。3)做256個點的FFT不夠點的補上零。4)語音識別中常用的幀長爲20ms-30ms,幀移爲10ms。

VAD(Voice Activity Detection語音估計)-----AGC(自動增益控制)把太高的降低把太低的增高-----HAD(嘯叫檢測與抑制)-------前處理(分幀加窗補零–FFT(256)-- 平滑129至65個點 – )------- 維納濾波(噪聲抑制,在有語音的時候纔有這個,沒有語音的時候就不執行了)維納濾波是核心算法---------將係數進行擴展反FFT回去還原就可以得到時域的數據了。然後就把當前幀送出去。

  • 1VAD:四幀的幀能都大於平均幀能的則爲語音幀;連續15幀的幀能都小於平均幀能的就判爲無聲,平均幀能是測出來的。
  • 2AGC:利用線性放大和壓縮放大的有效組合對助昕器的輸出信號進行調整。當弱信號輸入時,線性放大電路工作,保證輸出信號的強度;當輸入信號達到一定強度時,啓動壓縮放大電路,使輸出幅度降低。自動增益控制(AGC)是輸出限幅裝置的一種,它利用線性放大和壓縮放大的有效組合對助聽器的輸出信號進行調整。當弱信號輸人時,線性放大電路工作,保證輸出聲信號的強度;當輸人信號強度達到一定程度時,啓動壓縮放大線路,使聲輸出幅度降低。滿足了一些聽覺動態範圍較窄的聾人的需要。也就是說,AGC功能可以通過改變輸人輸出壓縮比例自動控制增益的幅度,擴大了助聽器的使用範圍。
  • 3HAD:計算幀間的相關性,根據規律來說,嘯叫一般發生在1500Hz以上,而且嘯叫是由於耳機播放出來的聲音重新進入麥克風形成正反饋,然後就一直增大就會產生很尖銳的聲音,嘯叫之間的相關性很高,而語音的相關性會比較低一些。而且在低頻段是不會產生嘯叫的。所以利用相關性和信號的頻段位置關係就可以區分開語音和嘯叫了。在這裏我們做了大量的實驗,在PC端打印音頻信號的各項指標數值找到規律,把語音和嘯叫完全分開。
  • 下面就是相關係數的公式在這裏插入圖片描述
  • 一開始選擇最簡單的方法就是移頻法去嘯叫,我們還嘗試做了移頻操作,曾經試過256點(8000/256=31.25Hz)、512點(15.6Hz)、1024點(7.8Hz)、2048點(運算量太大)的FFT。移動3到8Hz不會對聲音產生影響,但是抑制嘯叫的效果不明顯。但是經過試驗發現如果移動的頻率大了,是明顯降低嘯叫了但是聲音卻破壞了。找不到一個平衡點。最好的效果就是1024個點但是達不到要求,嘯叫還是很明顯。
  • 第二個嘗試的方法查閱文獻瞭解到有一篇論文的實現,有兩個特徵來判斷。是在頻域上,通過計算子帶幅度佔全部子帶幅度的的比率(去掉直流0點和128點),因爲嘯叫的幅度一般都很大,佔的比重大一些,還有一個特性就是相位(matlab有直接求相角的函數),嘯叫的相位應該差別不大但是在matlab上實驗的時候發現相位並沒有什麼很大的用處。然而在仿真上幅度佔比是有用的,但是移植到板子上結果不是很好,因爲語音有時候也會有能量特別高的時候想送氣的音P,所以在只有一個條件的情況下是不可以的。
  • 最開始是馬敏師姐做了回聲消除(做一堆的噪聲估計還要估計延遲等等,不適合板子上覆雜的環境),在PC上是可以的,但是如果移植到板子上的話運算量太大了。

現在開始講整個的過程:數據進來之後緩存三幀,每幀是80個點,5ms爲什麼是80個點呢?因爲信號最高是 8K,然後採樣率是16K,1/16 *80=5ms。然後加窗以最後一幀爲中心,從前面幀取88個點,後面再補88個零總共256個點,然後做FFT。FFT是對稱的,取0-128點就好了,做完FFT然後做平滑,每相鄰兩點相加然後除2,剩下65個點。然後就做維納濾波了,爲什麼維納濾波是65個點呢?因爲爲了減少運算量。

嘯叫抑制

用到了三個特徵:
1、 相關性 這個用處是最大的,效果最好的
2、 位置 800hz以下肯定是沒有嘯叫的
在這裏插入圖片描述
800Hz的波長=340/800=0.425m,這個波長已經很長了,是形成不了反饋的。
3、 幅度佔比 嘯叫的佔比會大一些。

降低主頻

即減少運算量:1、 在程序中的公式用STM32F4的固件庫函數代替:如開方、平方、最大值、最小值、累加、累乘、卷積等等。
2、 傅里葉變換和反傅里葉變換是最花運算量的,總共用了6M,所以就把傅里葉變換中的浮點數運算改成整數運算,後續的算法還是使用浮點數運算。這裏遇到了一個很詭異的事情,定點運算反而比浮點運算運算量大了。

代碼結構的優化

1、 緩存幾幀的調整,一幀移多少個點的調整,(爲了減少時間的考慮,後面的FFT要分幀補零,處理完一幀要往前移動兩幀所以要看時間的延遲防止掉幀)
2、 調整順序,FFT只做一次,已經做過的函數儘量複用,FFT的數據用了三次
**3、**先做VAD聲音活動檢測,AGC,HAD,維納然後逆FFT回去

聲音質量的優化----瞬噪問題是對於維納濾波中的卷積濾波器的係數的修正。

解決瞬噪問題:瞬噪就是突然產生很大的尖銳的聲音的時候如果被助聽器放大了的話會讓人更加的不舒服。檢測幀間增加或者下降的幅度,在相鄰的幾幀內用一個線性函數修正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章