詳解C/C++使用MATLAB設計的濾波器係數

應原先轉載的一篇文章有好多朋友看的不是很明白,主要原因在於數字信號處理專業功底稍有欠缺,對於濾波器各種結構模型不是太清楚,導致對轉載的文章有些異議,這裏我重新根據我自己的應用場景,重新編輯一份關於MATLAB中涉及濾波器,生成C語言風格頭文件,並在C語言中對信號進行濾波的描述。

  • 1、 首先在MATLAB workspace控制檯輸入fdatool或者sptool中都有濾波器設計版塊,如圖1、圖2所示。
  • 2、 我的應用場景主要是由於在接收機採集的音頻數據採樣率不一樣,導致上層軟件對於數據存儲的協議格式衝突,同時該型號接收機返回音頻數據量較大等,需要對音頻數據進行下采樣,由於採樣率之間的關係,導致了混疊噪聲的出現,音頻中混雜了“滋滋滋”的高頻噪音信號,因此需要設計帶阻濾波器將其濾除。
  • 3、 一般來說信號濾波可以在時域或者頻域進行,對於數據量小的場景可以直接fft,然後對於頻域數據進行相應處理,比如將噪音譜線直接置零或者置零之後與鄰近頻率分量進行合成等,在ifft反變換到時域,這樣一定程度上精度會大一點,不會對其他分量造成影響,因爲濾波器處於理論狀態,但是增加了運算量;另一種方式就是預先進行信號分析,設計好濾波器,在根據濾波器係數進行時域直接濾波,這樣運算量相對小,採用合適的階數運算效率也快。本文采用後一種方式。
  • 4、 由下圖的譜分析可以在fdatool中設計如下圖所示頻響的濾波器,爲了降低階數我們採用IIR響應濾波器,設計buttorworth帶阻濾波器,如下圖。
  • 5、 直接設計出來的濾波器是Direct-Form II型濾波器,這樣當我們直接導出濾波器係數時,MATLAB默認導出爲分部組合的形式,也就是類似分子係數是一維,分母是多維,就類似於多項式分解後的形式,這樣的係數對於程序猿編程來說不太方便,我們需要直接轉換成float[]的一位數組,例如濾波器分子,分母系數爲float NUM[],float DEN[],這樣使用濾波器對信號進行濾波就方便多了。
  • 6、 導出濾波器。選擇FDATool->File->Export,將濾波器係數導出到workspace,係數爲SOS,G濾波器類型爲直節型,需要使用[NUM,DEN] = sos2tf(sos,g),轉換得到我們需要的濾波器係數,可以手動保存爲C語言頭文件。
  • 7、 導出濾波器(2)。直接在FDATool中設計濾波器不能很好的對信號用設計好的濾波器進行驗證,所以我通常推薦使用sptool,主要分爲三塊,信號、濾波器、頻譜。
  • 信號中可以導入工作空間加載的信號,濾波器也都可以從工作空間導入,頻譜可以用已導入的信號進行生成;其中,濾波器設計一欄點擊apply可以對選中信號與選中濾波器進行濾波。
  • 選中設計好的濾波器,如FIRbp[design],使用sptool->File->Export,就可以將選中的濾波器導出到workspace,具體可以參見圖3,然後雙擊導出的濾波器對象,如圖4所示,tf字段裏面包含的就是濾波器的係數NUM,DEN了,其中NUM是濾波器的分子係數,DEN是濾波器的分母系數。設計濾波器一定要觀察stable是否爲yes,否則,濾波後的信號可能失真或者錯誤!
  • 8、 上面主要講到IIR因果濾波器的設計以及導出,因果濾波器由於存在反饋因此直接導出的C語言頭文件不能直接供我們程序使用,需要在MATLAB調用sos2tf函數進行轉換,但是設計FIR非因果濾波器,由於結構簡單,係數只存在NUM,而DEN=1,因此我們可以直接使用Targets->Generate C header導出C語言頭文件。而在sptool中導出FIR濾波器係數的方式和前面完全一樣,因此,在sptool中設計濾波器及導出係數更爲方便。
  • 9、 FIR和IIR濾波器區別簡述。簡單來說FIR是有限長脈衝響應濾波器,IIR是無限長脈衝響應濾波器,FIR是非因果濾波器,線性相位,濾波結果在相位上沒有失真,相反IIR一般相位非線性,因此濾波結果在相位上會有一定失真。
  • 階數而言,相同濾波效果時,FIR階數較高,運算性能稍差,而IIR濾波器能用較低階數完成同樣的濾波效果,性能較高,但是不能保證信號相位,因此一般對相位敏感的場景使用FIR濾波器。
  • 10、 另外,對於音頻數據濾波的C++工程實例請下載我的資源“TestAudioFilter”。WindowsSDK版本:10.0.17134.0,編譯環境vs2017.
  • 歡迎大家拍磚,互相學習,共同進步!
/* * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool * Generated by MATLAB(R) 9.1 and the Signal Processing Toolbox 7.3. * Generated on: 31-Jul-2019 14:35:56 *//* * Discrete-Time FIR Filter (real) 
* ------------------------------- *
 Filter Structure  : Direct-Form FIR
 * Filter Length     : 21 
* Stable            : Yes 
* Linear Phase      : Yes 
(Type 1) *//* General type conversion for MATLAB generated C-code  */
#include "tmwtypes.h"
/*  * Expected path to tmwtypes.h  */
const int BL = 21;
const real64_T B[21] = {   
 0.01959891419375,-0.000850799850284, -0.02092128872455, -0.02627519991705, 
  -0.01295563766471, 0.009686426254659,  0.02557484212732,   0.0233544670549,  
 0.004528582084577, -0.01755960715521,   0.9727891156463, -0.01755960715521, 
  0.004528582084577,   0.0233544670549,  0.02557484212732, 0.009686426254659, 
  -0.01295563766471, -0.02627519991705, -0.02092128872455,-0.000850799850284, 
   0.01959891419375};


 
圖1 sptool工具箱界面

圖2 濾波器設計界面
      
圖3 濾波器係數導出界面 

 
圖4 濾波器係數導出

      
圖5 音頻信號濾波前後譜分析

 

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