基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)
?
1 設(shè)計(jì)內(nèi)容
??????? 本設(shè)計(jì)是基于FPGA的音頻信號(hào)FIR低通濾波,根據(jù)要求,采用Matlab對(duì)WAV音頻文件進(jìn)行讀取和添加噪聲信號(hào)、FFT分析、FIR濾波處理,并分析濾波的效果。通過Matlab的分析驗(yàn)證濾波效果后,將疊加噪聲信號(hào)的音頻信號(hào)輸出到txt文件里。然后使用Matlab語言編寫濾波器模塊和測(cè)試模塊,通過Modelsim軟件讀取txt文件的數(shù)據(jù),將數(shù)據(jù)送入濾波模塊,最后將濾波的結(jié)果輸出到txt文件里,最后用Matlab將處理的結(jié)果從txt文件讀出、顯示、FFT分析用Verilog設(shè)計(jì)的FIR濾波器的處理效果。
?
2 設(shè)計(jì)原理
2.1 語音信號(hào)概述
?????? 語言是人類創(chuàng)造的,是人類區(qū)別于其他地球生命的本質(zhì)特征之一。人類用語言交流的過程可以看成是一個(gè)復(fù)雜的通信過程,為了獲取便于分析和處理的語音信源,必須將在空氣中傳播的聲波轉(zhuǎn)變?yōu)榘Z音信息并且記載著聲波物理性質(zhì)的模擬(或數(shù)字)電信號(hào),即語音信號(hào),因此語音信號(hào)就成為語音的表現(xiàn)形式或載體。
?????? 語音學(xué)和數(shù)字信號(hào)處理的交叉結(jié)合便形成了語音信號(hào)處理。語音信號(hào)處理是建立在語音學(xué)和數(shù)字信號(hào)處理基礎(chǔ)之上的,對(duì)語音信號(hào)模型進(jìn)行分析、存儲(chǔ)、傳輸、識(shí)別和合成等方面的一門綜合性學(xué)科。
?????? 本設(shè)計(jì)中,從WAV音頻文件用Matlab讀取音頻信號(hào)進(jìn)行分析、處理。
2.2 數(shù)字濾波器原理
?????? 若濾波器的輸入、輸出都是離散時(shí)間信號(hào),那么該濾波器的單位沖激響應(yīng)h(n)也必然是離散的,這種濾波器稱為數(shù)字濾波器(DF)。數(shù)字濾波器實(shí)質(zhì)上是一種運(yùn)算過程——用來描述離散系統(tǒng)輸入與輸出關(guān)系的差分方程的計(jì)算或卷積計(jì)算。數(shù)字濾波器的實(shí)質(zhì)是用一有限精度算法實(shí)現(xiàn)的離散時(shí)間線性時(shí)不變系統(tǒng),以完成對(duì)信號(hào)進(jìn)行濾波處理的過程。它是數(shù)字信號(hào)處理的一個(gè)重要分支,具有穩(wěn)定性好、精度高、靈活性強(qiáng)、體積小、質(zhì)量輕等諸多優(yōu)點(diǎn)。
????? 根據(jù)單位沖激響應(yīng)h(n)的時(shí)間特性分類
(1) 無限沖激響應(yīng)(IIR)數(shù)字濾波器
(2) 有限沖激響應(yīng)(FIR)數(shù)字濾波器
????? 本設(shè)計(jì)中選擇FIR低通濾波器對(duì)音頻信號(hào)進(jìn)行濾波處理。
????? FIR濾波器響應(yīng)(簡(jiǎn)稱FIR)系統(tǒng)的單位脈沖響應(yīng)h(n)為有限長(zhǎng)序列,系統(tǒng)函數(shù)H(z)在有限z平面上不存在極點(diǎn),其運(yùn)算結(jié)構(gòu)中不存在反饋支路,即沒有環(huán)路。如果h(n)的長(zhǎng)度為N,則它的系統(tǒng)函數(shù)和差分方程一般具有如下形式:
????? FIR濾波器的結(jié)果主要有:直接型、級(jí)聯(lián)型、線性相位型。
????? 設(shè)計(jì)中采用線性相位型,FIR濾波器最主要的特性就是它可以具備線性相位的特性。所謂線性相位特性,是指濾波器對(duì)不同頻率的正弦波所產(chǎn)生的相移和正弦波的頻率成直線關(guān)系。因此,在濾波器通帶內(nèi)的信號(hào)通過濾波器后,除了由相移特性的斜率決定的延時(shí)外,可以不失真地保留通帶內(nèi)的全部信號(hào)。這一點(diǎn)很重要,在很多的應(yīng)用場(chǎng)合都有所需求。
????? 當(dāng)系統(tǒng)的單位抽樣響應(yīng)h(n)滿足下列對(duì)稱條件時(shí),即
偶對(duì)稱條件:h(n)=h(N-1-n)0<n<N-1
奇對(duì)稱條件:h(n)=-h(N-1-n)0<n<N-1
????? 系統(tǒng)的相頻特性是線性的。其對(duì)稱中心為(N-1)/2。采用線性相位型可以比直接型少用(N-1)/2個(gè)乘法器。下圖為N為偶數(shù)和奇數(shù)的情形,a圖為N=7, b圖為N=6。
圖 1 N為偶數(shù)和奇數(shù)的FIR濾波器結(jié)構(gòu)
3. 設(shè)計(jì)思路
????? 本設(shè)計(jì)主要分為兩個(gè)部分,一個(gè)是Matlab的設(shè)計(jì)驗(yàn)證和音頻信號(hào)提取,另一個(gè)為Modelsim平臺(tái)上基于Verilog的FIR濾波器的設(shè)計(jì)和testbench的編寫。
????? Matlab的設(shè)計(jì)驗(yàn)證和音頻信號(hào)提取:在MATLAB中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于讀取語音,采樣值放在向量y中,fs表示采樣頻率(Hz),bits表示采樣位數(shù)。[N1 N2]表示讀取的值從N1點(diǎn)到N2點(diǎn)的值。采用此函數(shù)對(duì)WAV音頻信號(hào)進(jìn)行讀取,然后對(duì)該信號(hào)進(jìn)行FFT分析,再在原始的音頻信號(hào)上疊加一個(gè)6K的正弦波信號(hào),并進(jìn)行FFT分析。
????? 此過程中需要對(duì)疊加了噪聲信號(hào)的音頻信號(hào)寫入TXT文件作為Modelsim平臺(tái)的信號(hào)源,同時(shí)將FIR的抽頭參數(shù)進(jìn)行提取,用于Verilog編寫FIR濾波器。
????? 在Modelsim平臺(tái)上,采用Verilog編寫線性相位型的FIR濾波器,然后編寫testbench代碼,testbench的主要功能是提供時(shí)鐘、復(fù)位、信號(hào)源,同時(shí)將FIR模塊的處理結(jié)果讀出并寫入到TXT文件中。
????? 最后將Modelsim處理的結(jié)果用Matlab進(jìn)行分析,并與Matlab處理的結(jié)果進(jìn)行對(duì)比。
具體流程如下圖:
圖 2 本設(shè)計(jì)的流程
?
4. 設(shè)計(jì)過程
4.1 Matlab平臺(tái)
4.1.1 Matlab讀取音頻文件
???? 在MATLAB中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于讀取語音,采樣值放在向量y中,fs表示采樣頻率(Hz),bits表示采樣位數(shù)。[N1 N2]表示讀取的值從N1點(diǎn)到N2點(diǎn)的值。
???? 采樣頻率為100K,讀取點(diǎn)數(shù)為4096個(gè)信號(hào)。
4.1.2 疊加噪聲信號(hào)
????? 疊加一個(gè)頻率為6K,點(diǎn)數(shù)為4096,幅值為0.003的正弦波,并對(duì)疊加前后的信號(hào)進(jìn)行FFT分析。
????? 由于讀取出來的音頻信號(hào)幅值很小,由于FPGA處理整數(shù)比較方便,所以需要將疊加的噪聲的音頻信號(hào)進(jìn)行放大,然后將負(fù)數(shù)轉(zhuǎn)為正整數(shù),最后寫入到TXT文件中。
寫入的TXT文件如下:
圖 3 音頻信號(hào)的TXT文件
?????? 同時(shí),為了將此信號(hào)源作為FPGA內(nèi)部的信號(hào)源,還需要將信號(hào)數(shù)據(jù)寫入到MIF文件中,然后調(diào)用一個(gè)ROM模塊,存放此數(shù)據(jù)。在Matlab中將語音信號(hào)數(shù)據(jù)寫入MIF文件的代碼如下:
產(chǎn)生的MIF文件數(shù)據(jù)如下:
圖 4 MIF文件
4.1.3 FIR濾波
?????? 本設(shè)計(jì)中采用的FIR濾波器為8階,采樣頻率為100K,截至頻率為6K。
?????? 在Matlab中采用fir1函數(shù)提取抽頭系統(tǒng),然后將抽頭系數(shù)和帶噪聲的音頻信號(hào)進(jìn)行卷積,然后對(duì)FIR處理的結(jié)果進(jìn)行FFT分析。
提取抽頭系數(shù),系數(shù)如下:
????? 由于提取的系數(shù)為浮點(diǎn)數(shù),所以需要對(duì)系數(shù)進(jìn)行移位變換,作為整數(shù)用于FPGA設(shè)計(jì)的FIR濾波器中,然后最后再將處理的結(jié)果進(jìn)行反向移位變換,得取正確的結(jié)果。
轉(zhuǎn)換后的系數(shù)如下:
4.1.4 分析濾波效果
????? 將疊加噪聲前后、FIR處理后的信號(hào)進(jìn)行FFT分析,并顯示出來進(jìn)行對(duì)比:
4.1
4.2 Modelsim與QuartusII平臺(tái)
4.2.1 FIR模塊的編寫
?????? 本設(shè)計(jì)中FIR模塊主要分為信號(hào)源模塊和FIR濾波器模塊,信號(hào)源模塊采用ROM存儲(chǔ)帶有噪聲信號(hào)的語音信號(hào),存儲(chǔ)的位寬為8bit,深度為4096。由于采用Altera的FPGA中內(nèi)嵌有一定數(shù)量的M4K塊,所以可以直接調(diào)用這些模塊用于存儲(chǔ)信號(hào)。
ROM模塊中MIF文件存儲(chǔ)的信號(hào)數(shù)據(jù)如下:
圖 5 ROM模塊中的數(shù)據(jù)
????? 采用線性相位型結(jié)構(gòu)的FIR濾波器進(jìn)行設(shè)計(jì),由此可以將乘法器的個(gè)數(shù)減少一半,本設(shè)計(jì)中采用4個(gè)乘法器,由于FPGA中內(nèi)嵌了一定數(shù)量的硬件乘法器,由此可以直接調(diào)用這些乘法器將抽頭參數(shù)和信號(hào)數(shù)據(jù)進(jìn)行乘法運(yùn)算,以減少邏輯單元的調(diào)用和減少一定的延遲。
????? 抽頭參數(shù)分別為19、65、170、256,是通過將Matlab輸出的參數(shù)左移10位得到的。
濾波器的結(jié)構(gòu)如下:
由于抽頭系數(shù)左移了10位,所以在得到最終處理結(jié)果后,需要將結(jié)果右移10位,如下所示:
FIR模塊頂層設(shè)計(jì)如下:
4.2.2 Testbench編寫
????? Testbench的主要的功能是讀取TXT文件中的信號(hào)數(shù)據(jù),作為FIR濾波模塊的信號(hào)源,同時(shí)將為FIR濾波模塊提供時(shí)鐘和復(fù)位信號(hào),最后將FIR濾波模塊處理后數(shù)據(jù)寫入到TXT文件中。
5 分析驗(yàn)證
5.1 QUARTUS II設(shè)計(jì)
在設(shè)計(jì)完成各個(gè)模塊和頂層封裝之后,通過編譯綜合。
圖 6 綜合結(jié)果
整體設(shè)計(jì)的RTL視圖如下:
圖 7 RTL視圖
其中,clk信號(hào)為100K,同時(shí)也是FIR模塊的采樣信號(hào)。
5.2 Modelsim仿真結(jié)果分析
????? Modelsim仿真結(jié)果如下,其中data_in為從txt文件讀入的疊加了噪聲的語音信號(hào),fir_data為經(jīng)過FIR濾波處理后輸出的信號(hào),由于截至頻率為6K,從中可以看出,大部分的噪聲信號(hào)已被濾除,為了更好的分析處理的結(jié)果,將FIR處理的結(jié)果寫入到TXT文件中,然后用Matlab進(jìn)行FFT分析。
圖 8 Modelsim仿真波形
FIR處理輸出的結(jié)果如下:
圖 9 Modelsim仿真結(jié)果數(shù)據(jù)輸出
5.3 Matlab設(shè)計(jì)分析驗(yàn)證
?????? 采用Matlab將原始語音信號(hào)、疊加噪聲的語音信號(hào)、FIR濾波后的信號(hào)分別顯示如下,從下圖可以看出,采用8階的FIR濾波器可以較好的將噪聲信號(hào)濾除掉。
圖 10 時(shí)域圖對(duì)比
???????? 為了更好的地分析信號(hào)的頻譜,原始語音信號(hào)、疊加噪聲的語音信號(hào)、FIR濾波后的信號(hào)的頻譜如下,對(duì)比可以更加確定地得出,通過FIR濾波,6K以上的信號(hào)基本被濾除掉了,由于10K的噪聲信號(hào)的頻率功能相對(duì)較大,FIR濾波器的階數(shù)比較少,10K的噪聲信號(hào)還是未能完全濾除,不過這個(gè)可以通過增加階數(shù)將其完全濾除。
圖 11 頻譜對(duì)比
?????? 通過Matlab將Modelsim仿真結(jié)果的數(shù)據(jù)讀出,并將處理后的語音信號(hào)進(jìn)行顯示,并與原始語音信號(hào)對(duì)比。
圖 12 原始語音、Modelsim仿真的語音信號(hào)對(duì)比
??????? 將原始語音信號(hào)、采用Matlab進(jìn)行 FIR濾波后的信號(hào)、Modelsim仿真處理后的語音信號(hào)進(jìn)行FFT分析、對(duì)比,結(jié)果如下:
圖 13 疊加噪聲的信號(hào)與Modelsim仿真后信號(hào)頻譜對(duì)比
圖 14 Matlab濾波效果與Modelsim仿真效果對(duì)比
?????? 通過以上的分析、驗(yàn)證,采用Verilog設(shè)計(jì)的FIR濾波器能夠?qū)崿F(xiàn)預(yù)定的功能,能過將6K以上的噪聲信號(hào)基本濾除掉,由于10K的噪聲信號(hào)幅值較大,所以要完全濾波可以通過增加FIR濾波器的階數(shù)。
大西瓜FPGA-->https://daxiguafpga.taobao.com
博客資料、代碼、圖片、文字等屬大西瓜FPGA所有,切勿用于商業(yè)! 若引用資料、代碼、圖片、文字等等請(qǐng)注明出處,謝謝!
每日推送不同科技解讀,原創(chuàng)深耕解讀當(dāng)下科技,敬請(qǐng)關(guān)注“科乎”。
轉(zhuǎn)載于:https://www.cnblogs.com/logic3/p/5228764.html
總結(jié)
以上是生活随笔為你收集整理的基于FPGA的音频信号的FIR滤波(Matlab+Modelsim验证)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区块链开发(一)Windows平台搭建基
- 下一篇: [推荐]案例精选:殡仪馆用地评估