作者:桂。
時間:2017-08-15 20:28:11
鏈接:http://www.cnblogs.com/xingshansi/p/7367738.html
前言
本文主要記錄濾波器設計的基本流程,涉及到定點/浮點的轉化。
一、Fdatool基本操作
Command輸入fdatool,例如FIR采用窗函數法設計16階低通filter,fc(frequency cutoff) = 10800Hz,fs = 48000Hz,輸入參數:
需要注意的是由於存在常數項,N階Filter用N-1階設計即可。
設計完濾波器並不是直接導出,通常需要兩個后處理操作:
1)驗證濾波器是否符合要求:幅頻響應、相頻響應,零極點圖、群延遲等等,都可以通過上方的Analysis點擊查看。
2)系數量化。通常DSP/FPGA需要定點操作,點擊左方的量化,進行位數設定。
設計完成之后,可以File——Export,將濾波器參數導出,導出的濾波器格式可以自行選擇。
左方的圖標功能依次(自上而下)為:
1)Create a multi-rate filter:創建多速率濾波器;
2)Transform filter:濾波器轉換;
3)Set quantization parameters:設置量化參數;
4)Realize Model:實現模型;
5)Pole-zero editor:零極點編輯器;
6)import filter:導入濾波器;
7)Design filter:設計濾波器;
二、定點/浮點轉化
定點就是位數固定,浮點通常表示為:2.2e8,即xyz的形式,x:常數,y:基底,z:指數。浮點轉換為定點在MATLAB中稱為量化,使用quantizer和quantize兩個函數完成,通常為了便於表示,也會使用num2bin,num2int,num2hex等指令。
1-quantizer
用於定義數據的量化屬性,具體可doc fixedpoint/quantizer,參數詳細設定可參考描述:
2-quantize
按照quantizer定義的量化屬性量化浮點數據。
以上文的16階濾波器為例:
有符號數,先放大100倍,整數最大為41:2^6 > 41,最小需要6位整數,又希望擴大100倍后的數據,小數點后精確到0.01(即原數據精度:1e-4),2^-7 < 0.01,即需要7位小數。
共需要位數N = 1符號位+6整數位+7小數位 = 14位,
其中小數m = 7位。
N = 14; m = 7; q = quantizer('fixed','round','saturate',[N,m]); fix_fir = quantize(q,fir_coef*100); [fix_fir;fir_coef*100]
結果可以看出,量化的數據達到了精度要求(上為量化數據,下為原始數據):
有時候為了表示方便,習慣了二進制的表達方式(有符號數,負數用補碼表示):
num2bin(q,fix_fir)
這一操作也為含有小數的負數求解補碼提供了思路,打印信息如下(類似指令num2int,num2hex類似):