基礎(chǔ)知識:
什么叫濾波器?
簡單的說,就像篩米,留下你需要的米,濾掉不需要的米頭。過濾的功能。
什么叫數(shù)字濾波器?
用數(shù)字芯片做的濾波器,而不是rc搭的,輸入是離散的序列,輸出也是離散的序列;
快速了解時(shí)域頻域:
https://zhuanlan.zhihu.com/p/19763358?from=singlemessage&isappinstalled=1
什么叫時(shí)域?
信號隨時(shí)間的變化。
什么叫頻域?
曾經(jīng)有個(gè)通俗的解釋是:彈鋼琴,琴鍵1234等表示的就是頻域,產(chǎn)生的各種音樂就是時(shí)域,你以為的萬變其實(shí)是永恒的不變。
什么叫fir與iir濾波器?
FIR(Finite Impulse Response)濾波器:有限長單位沖激響應(yīng)濾波器,又稱為非遞歸型濾波器,是數(shù)字信號處理系統(tǒng)中最基本的元件,它可以在保證任意幅頻特性的同時(shí)具有嚴(yán)格的線性相頻特性,同時(shí)其單位抽樣響應(yīng)是有限長的,因而濾波器是穩(wěn)定的系統(tǒng)。
無限脈沖響應(yīng)。遞歸濾波器,也就是IIR數(shù)字濾波器,顧名思義,具有反饋。
fir和iir有啥異同(important)?
根據(jù)沖激響應(yīng)的不同,將數(shù)字濾波器分為有限沖激響應(yīng)(FIR)濾波器和無限沖激響應(yīng)(IIR)濾波器。對于FIR濾波器,沖激響應(yīng)在有限時(shí)間內(nèi)衰減為零,其輸出僅取決于當(dāng)前和過去的輸入信號值。對于IIR濾波器,沖激響應(yīng)理論上應(yīng)會無限持續(xù),其輸出不僅取決于當(dāng)前和過去的輸入信號值,也取決于過去的信號輸出值。
1. 在相同技術(shù)指標(biāo)下,IIR濾波器由于存在著輸出對輸入的反饋,因而可用比FIR濾波器較少的階數(shù)來滿足指標(biāo)的要求,這樣一來所用的存儲單元少,運(yùn)算次數(shù)少,較為經(jīng)濟(jì)。例如用頻率抽樣法設(shè)計(jì)阻帶衰減為-20db的FIR濾波器,其階數(shù)要33階才能達(dá)到,而如果用雙線性變換法設(shè)計(jì)只需4-5階的切貝雪夫?yàn)V波器,即可達(dá)到指標(biāo)要求,所以FIR濾波器的階數(shù)要高5-10倍左右。
2. FIR濾波器可得到嚴(yán)格的線性相位,而IIR濾波器則做不到這一點(diǎn),IIR濾波器選擇性愈好,則相位的非線性愈嚴(yán)重,困而,如果IIR濾波器要得到線性相位,又要滿足幅度濾波的技術(shù)要求,必須加全通網(wǎng)絡(luò)進(jìn)行相位校正,這同樣會大大增加濾波器的階數(shù),從這一點(diǎn)上看,F(xiàn)IR濾波器又優(yōu)于IIR濾波器。
3. FIR濾波器主要采用非遞歸結(jié)構(gòu),因而從理論上到實(shí)際的有限精度的運(yùn)算中,都是穩(wěn)定的。有限精度運(yùn)算誤差也較小,IIR濾波器必須采用遞歸的結(jié)構(gòu),極點(diǎn)必須在Z平面單位圓內(nèi),才能穩(wěn)定,這種結(jié)構(gòu),運(yùn)算中的四舍五入處理,有時(shí)會引起寄生振蕩。
4. FIR濾波器,由于沖激響應(yīng)是有限長的,因而可以用快速傅里葉變換算法,這樣運(yùn)算速度可以快得多,IIR濾波器則不能這樣運(yùn)算。
5. 從設(shè)計(jì)上看,IIR濾波器可以利用模擬濾波器設(shè)計(jì)的現(xiàn)成閉合公式、數(shù)據(jù)和表格,因而計(jì)算工作量較小,對計(jì)算工具要求不高。FIR濾波器則一般沒有現(xiàn)成的設(shè)計(jì)公式,窗函數(shù)法只給出窗函數(shù)的計(jì)算工式,但計(jì)算通帶、阻帶衰衰減仍無顯示表達(dá)式。一般FIR濾波器設(shè)計(jì)只有計(jì)算機(jī)程序可資利用,因而要借助于計(jì)算機(jī)。
6. IIR濾波器主要是設(shè)計(jì)規(guī)格化的、頻率特性為分段常數(shù)的標(biāo)準(zhǔn)低通、高通、帶通、帶阻、全通濾波器,而FIR濾波器則要靈活得多,例如頻率抽樣設(shè)計(jì)法,可適應(yīng)各種幅度特性的要求,因而FIR濾波器則要靈活得多,例如頻率器可設(shè)計(jì)出理想正交變換器、理想微分器、線性調(diào)頻器等各種網(wǎng)絡(luò),適應(yīng)性較廣。而且,目前已有許多FIR濾波器的計(jì)算機(jī)程序可供使用。
什么叫定點(diǎn)數(shù)?
計(jì)算機(jī)中采用的一種數(shù)的表示方法。參與運(yùn)算的數(shù)的小數(shù)點(diǎn)位置固定不變。
什么叫濾波器的零點(diǎn)極點(diǎn)?
濾波器可以看成是一個(gè)信號處理的系統(tǒng),其輸入輸出之間存在一定的關(guān)系,這種關(guān)系無論在時(shí)域還是頻域都可以用數(shù)學(xué)表達(dá)式來表示.而這數(shù)學(xué)表達(dá)式又是分子分母都是多項(xiàng)式的表達(dá)式(稱為傳輸函數(shù)),這樣滿足使傳輸函數(shù)的分子為零的是零點(diǎn),滿足使傳輸函數(shù)分母為零的就是其極點(diǎn).
iir濾波器的種類:很多啊,直接一型,直接二型,級聯(lián)型,并聯(lián)型。
對于matlab的fdatool工具中二階節(jié)默認(rèn)結(jié)構(gòu)為:
對于這個(gè)結(jié)構(gòu)用圖表示為:
差分方程表示為:
零極點(diǎn)表示為:零點(diǎn)就是差分方程的前面三項(xiàng),極點(diǎn)就是后面兩項(xiàng)。用FPGA實(shí)現(xiàn)主要就是實(shí)現(xiàn)濾波器的差分方程。
流程:
任務(wù)要求:
16階二階級聯(lián)IIR數(shù)字濾波器設(shè)計(jì),16bit有符號整數(shù)連續(xù)輸入,采樣率80khz,通帶頻率1k-8khz。系數(shù)為16bit有符號整數(shù)。
1.系數(shù)產(chǎn)生:通過matlab中的fdatool軟件生成所需系數(shù)。(當(dāng)然可以用各種函數(shù)生成,太難工科生表示要陣亡了,還是默默用fdatooll吧)
把需求放入fdatool中:生成的架構(gòu)就是直接二型二階節(jié)結(jié)構(gòu)。
零極點(diǎn)圖:
未量化的系數(shù):
未量化的系數(shù)導(dǎo)出:生成一個(gè)c文件。
那么問題來了,這個(gè)c文件中的內(nèi)容是啥子意思呢,一開始我也是一臉懵逼,而且網(wǎng)上的資料少之又少,文件如下所示,含義已注釋:
系數(shù)量化選項(xiàng):系數(shù)量化你可以自己量化也可以讓軟件量化,不過它量化出來的數(shù)據(jù)零點(diǎn)并不是乘完增益后再進(jìn)行量化的。最好還是乘完增益后再量化,所以還是自己用excel慢慢量化吧,眼淚掉下來。
未量化excel表:
excel中計(jì)算單元格方便到不行:零點(diǎn)乘完增益放大16384;極點(diǎn)直接放大16384;下圖gain請無視。
新的b0=b0*gain1*16384;新的a0=a0*16384;放大16384倍方便FPGA實(shí)現(xiàn)除法截位。
2.編碼實(shí)現(xiàn):
先看一下16階iir濾波器架構(gòu):級聯(lián)8個(gè)二階節(jié)。
一個(gè)二階節(jié):
現(xiàn)在就可以編碼實(shí)現(xiàn)它了,這是第一版代碼,尚未優(yōu)化,仿真ok,不要邏輯綜合,會占用成噸的資源。
由于技術(shù)垃圾,不做十分精確輸出位控制,輸出都為16bit數(shù)據(jù)。
兩個(gè)n位的加法結(jié)果需要n+1位;兩個(gè)n位的乘法結(jié)果需要2n位。
matalb生成modelsim仿真文件向量:
生成1500hz,采樣80khz波形向量文件。生成其他hz的波形文件類似。
1 f1=1500; %頻率1500hz;
2 Fs=80000; %采樣80khz;
3 N=16; %16bit量化;
4 t=0:1/Fs:0.01; %采樣時(shí)長0.01;
5 c2=2*pi*f1*t;
6 s2=sin(c2); %正弦波產(chǎn)生;
7 s2=s2/max(abs(s2));
8 Q_s=round(s2*(2^(N-1)-1));
9 plot(t,s2,'r*-'); %畫圖;
10
11 fid=fopen('D:\data\data_1500\data_1500.txt','w'); %采樣點(diǎn)保存為10進(jìn)制;
12 fprintf(fid,'%8d\r\n',s2);
13 fprintf(fid,';');
14 fclose(fid);
15
16 fid=fopen('D:\data\data_1500\data_1500_B.txt','w'); %采樣點(diǎn)保存為2進(jìn)制;
17 for i=1:length(Q_s)
18 B_s=dec2bin(Q_s(i)+(Q_s(i)<0)*2^N,N)
19 for j=1:N
20 if B_s(j)=='1'
21 tb=1;
22 else
23 tb=0;
24 end
25 fprintf(fid,'%d',tb);
26 end
27 fprintf(fid,'\r\n');
28 end
29 fprintf(fid,';');
30 fclose(fid);
仿真測試:
對600hz正弦波濾波結(jié)果:600hz波形被濾除。
對5000hz正弦波濾波結(jié)果:5000hz波形通過。
對9000hz波形濾波結(jié)果:開始有點(diǎn)點(diǎn)迷之振蕩,基本濾除9000hz的波。
最開始的結(jié)果經(jīng)過多久出來到out?(特么上次面試還問這個(gè)了,十臉懵逼,根本沒注意這啊。。。emmm很氣)
可以看到是復(fù)位拉高后的9個(gè)時(shí)鐘周期后yout數(shù)據(jù)產(chǎn)生,因?yàn)榱魉€啊,emmm。
初版代碼綜合上板子:通過rom輸出5khz的數(shù)據(jù)。
所以優(yōu)化很重要,這是未優(yōu)化版本。
signaltapII抓下波:
優(yōu)化版以及未優(yōu)化版比較:只包含iir部分,不含pll以及rom。系統(tǒng)時(shí)鐘跟采樣時(shí)鐘一樣,80khz。
未優(yōu)化版:直接采用*(乘)的方式。
優(yōu)化版:采用內(nèi)置乘法器,以及采用移位相加的方法。資源少的可憐啊,一共才30個(gè)9bit乘法器。。。。,若再增加乘法器,le使用量又會往上漲。未來優(yōu)化方向:提高時(shí)鐘頻率,復(fù)用乘法器。
其他:
怎么優(yōu)雅的分解系數(shù)用來移位相加:
直接寫了個(gè)c程序,來看看效果:
c源代碼:看看就好啦,很久沒寫c,完全沒有代碼style了emmm。
以上。
歡迎通信工程師和FPGA工程師關(guān)注公眾號
FPGA微信技術(shù)群
歡迎大家加入全國FPGA微信技術(shù)群,這里有一群熱愛技術(shù)的工程師,在這里可以一起交流討論技術(shù)!
用手指按住就可以加入FPGA全國技術(shù)群哦
FPGA IP核服務(wù):各類優(yōu)質(zhì)IP核服務(wù)商,服務(wù)到位,有保障!有需求的可以直接聯(lián)系群主!