字濾波器核心原理與工程實(shí)現(xiàn):從FIR/IIR到實(shí)戰(zhàn)設(shè)計(jì)指南)
1. 項(xiàng)目概述從“信號(hào)”到“信息”的必經(jīng)之路在電子工程、通信、音頻處理乃至生物醫(yī)學(xué)信號(hào)分析這些領(lǐng)域里我們每天打交道最多的可能就是那些看不見(jiàn)摸不著的“信號(hào)”。無(wú)論是手機(jī)接收的無(wú)線波、麥克風(fēng)捕捉的聲波還是心電圖機(jī)記錄的心跳電信號(hào)它們最初都是以連續(xù)變化的模擬形式存在的。但計(jì)算機(jī)和現(xiàn)代數(shù)字芯片只認(rèn)識(shí)0和1所以第一步就是通過(guò)ADC模數(shù)轉(zhuǎn)換器把這些連續(xù)信號(hào)“拍”成一系列離散的數(shù)字點(diǎn)這個(gè)過(guò)程就是采樣。然而采樣得到的數(shù)字序列往往不是我們想要的“純凈”信息它里面混雜著各種“雜質(zhì)”——可能是50Hz的工頻干擾可能是采集電路自身的熱噪聲也可能是我們根本不關(guān)心的某個(gè)頻段的無(wú)用信號(hào)。這時(shí)候數(shù)字濾波器就登場(chǎng)了。你可以把它想象成一個(gè)極其智能的“篩子”或“調(diào)音臺(tái)”。它的任務(wù)就是從這一長(zhǎng)串?dāng)?shù)字序列中精準(zhǔn)地剔除我們不想要的成分保留或增強(qiáng)我們關(guān)心的部分。與需要電阻、電容、電感等實(shí)體元件搭建的模擬濾波器不同數(shù)字濾波器完全由算法和數(shù)學(xué)公式構(gòu)成在處理器CPU、DSP、FPGA中通過(guò)執(zhí)行一段程序來(lái)實(shí)現(xiàn)。這種“軟”實(shí)現(xiàn)方式帶來(lái)了巨大的靈活性一個(gè)硬件電路板焊好了其濾波特性基本就固定了但數(shù)字濾波器你改幾行代碼或幾個(gè)參數(shù)就能瞬間從低通變成高通從溫和變得銳利這種可編程性是革命性的。今天我們就深入幾種最核心、最常用的數(shù)字濾波器實(shí)現(xiàn)原理內(nèi)部看看。無(wú)論是剛接觸信號(hào)處理的學(xué)生還是需要快速實(shí)現(xiàn)濾波功能的工程師理解這些基礎(chǔ)的“積木塊”都能讓你在面對(duì)雜亂的信號(hào)時(shí)心里有譜手上有招。我們不止講公式更會(huì)拆解它們?yōu)楹稳绱嗽O(shè)計(jì)在實(shí)際代碼或硬件描述語(yǔ)言中如何實(shí)現(xiàn)以及最容易在哪個(gè)環(huán)節(jié)“踩坑”。2. 核心原理差分方程與系統(tǒng)函數(shù)——濾波器的“DNA”在深入具體濾波器之前我們必須先建立兩個(gè)貫穿始終的核心概念差分方程和系統(tǒng)函數(shù)傳遞函數(shù)。這是所有數(shù)字濾波器的通用“語(yǔ)言”和“身份證”。2.1 差分方程在時(shí)間域描述濾波行為差分方程直接描述了濾波器輸出序列 y[n] 與輸入序列 x[n] 之間的關(guān)系。一個(gè)通用的形式如下y[n] b0*x[n] b1*x[n-1] ... bM*x[n-M] - a1*y[n-1] - a2*y[n-2] - ... - aN*y[n-N]這個(gè)方程看起來(lái)有點(diǎn)復(fù)雜但我們可以分兩部分理解加權(quán)求和當(dāng)前及過(guò)去的輸入b系數(shù)部分這部分體現(xiàn)了濾波器對(duì)輸入信號(hào)當(dāng)前值和歷史值的“關(guān)注”。例如b0*x[n]是當(dāng)前輸入的直接貢獻(xiàn)b1*x[n-1]是上一個(gè)采樣點(diǎn)輸入的影響以此類推。b系數(shù)決定了濾波器如何“觀察”輸入信號(hào)。加權(quán)求和過(guò)去的輸出a系數(shù)部分這是數(shù)字濾波器區(qū)別于簡(jiǎn)單移動(dòng)平均的關(guān)鍵它引入了“反饋”。當(dāng)前的輸出y[n]不僅取決于輸入還取決于自己過(guò)去的值y[n-1],y[n-2]等。正是這種反饋機(jī)制使得濾波器能夠產(chǎn)生無(wú)限長(zhǎng)的脈沖響應(yīng)IIR實(shí)現(xiàn)非常陡峭的濾波特性。a系數(shù)決定了系統(tǒng)的“記憶”和反饋特性。注意方程中的減號(hào)是約定俗成的寫(xiě)法。a1,a2... 本身是帶有符號(hào)的系數(shù)。當(dāng)這些系數(shù)為0時(shí)濾波器就退化為沒(méi)有反饋的 FIR 濾波器。實(shí)操心得在編程實(shí)現(xiàn)時(shí)差分方程就是你的直接算法。你需要維護(hù)兩個(gè)數(shù)組或隊(duì)列來(lái)存儲(chǔ)最近的 M 個(gè)輸入x和 N 個(gè)輸出y。每次新的采樣x[n]到來(lái)就按照這個(gè)公式計(jì)算y[n]然后更新歷史數(shù)據(jù)緩沖區(qū)。這是最直接的實(shí)現(xiàn)方式也稱為直接 I 型實(shí)現(xiàn)。2.2 系統(tǒng)函數(shù) H(z)在頻率域揭示濾波本質(zhì)如果差分方程是“時(shí)間域的操作手冊(cè)”那么系統(tǒng)函數(shù)H(z)就是“頻率域的設(shè)計(jì)藍(lán)圖”。它通過(guò)對(duì)差分方程進(jìn)行 Z 變換得到通常表示為H(z) Y(z)/X(z) (b0 b1*z^{-1} ... bM*z^{-M}) / (1 a1*z^{-1} ... aN*z^{-N})分母多項(xiàng)式a系數(shù)相關(guān)決定了系統(tǒng)的“極點(diǎn)”。極點(diǎn)影響著濾波器的頻率選擇性和穩(wěn)定性。極點(diǎn)必須在 Z 平面的單位圓內(nèi)系統(tǒng)才是穩(wěn)定的。分子多項(xiàng)式b系數(shù)相關(guān)決定了系統(tǒng)的“零點(diǎn)”。零點(diǎn)影響著濾波器在哪些頻率上產(chǎn)生陷波完全衰減。通過(guò)分析H(z)的零極點(diǎn)分布我們可以直觀地預(yù)測(cè)濾波器的頻率響應(yīng)是低通、高通、帶通還是帶阻以及其相位特性。通過(guò)將z e^{jω}代入H(z)其中 ω 是數(shù)字角頻率我們就能得到具體的幅頻響應(yīng)|H(ω)|和相頻響應(yīng)∠H(ω)。為什么需要兩個(gè)視角差分方程告訴你“如何一步一步計(jì)算”適合編程實(shí)現(xiàn)和實(shí)時(shí)處理。系統(tǒng)函數(shù)告訴你“整體性能如何”適合濾波器設(shè)計(jì)、分析和理論推導(dǎo)。兩者相輔相成。3. 有限脈沖響應(yīng)濾波器穩(wěn)定與線性的首選FIR 濾波器的核心特征就是其差分方程中不包含輸出的反饋?lái)?xiàng)即所有a系數(shù)為0。它的輸出僅由當(dāng)前和過(guò)去的有限個(gè)輸入加權(quán)求和得到y(tǒng)[n] b0*x[n] b1*x[n-1] ... bM*x[n-M]這個(gè)M就是濾波器的階數(shù)其脈沖響應(yīng)的長(zhǎng)度是M1并且是有限長(zhǎng)的故名 FIR。3.1 實(shí)現(xiàn)原理卷積與滑動(dòng)窗口FIR 濾波器的操作在時(shí)域上就是輸入信號(hào)與濾波器系數(shù)也稱為抽頭權(quán)重或脈沖響應(yīng)的卷積運(yùn)算。你可以把系數(shù)數(shù)組b [b0, b1, ..., bM]想象成一個(gè)固定模板把它在輸入信號(hào)x上從左到右滑動(dòng)。每到一個(gè)位置就將模板與覆蓋的信號(hào)片段逐點(diǎn)相乘后求和得到該時(shí)刻的輸出y。在軟件實(shí)現(xiàn)中這通常通過(guò)一個(gè)循環(huán)緩沖區(qū)來(lái)完成初始化一個(gè)長(zhǎng)度為M1的緩沖區(qū)buffer用于存放最新的M1個(gè)輸入樣本。每次新的樣本x_new到來(lái)將其放入buffer的頭部最老的數(shù)據(jù)被擠出。計(jì)算buffer與系數(shù)數(shù)組b的點(diǎn)積結(jié)果即為當(dāng)前輸出y。輸出y并等待下一個(gè)輸入樣本。C語(yǔ)言代碼片段示例非最優(yōu)但最直觀float fir_filter(float x_new, float *buffer, float *coefficients, int order) { // 1. 更新緩沖區(qū)將舊數(shù)據(jù)向后移新數(shù)據(jù)放入頭部 for (int i order; i 0; i--) { buffer[i] buffer[i-1]; } buffer[0] x_new; // 2. 計(jì)算卷積和點(diǎn)積 float y 0.0f; for (int i 0; i order; i) { y coefficients[i] * buffer[i]; } return y; }更高效的實(shí)現(xiàn)會(huì)使用循環(huán)緩沖區(qū)環(huán)形緩沖區(qū)來(lái)避免數(shù)據(jù)的物理移動(dòng)。3.2 核心優(yōu)勢(shì)與設(shè)計(jì)方法FIR 濾波器最大的兩個(gè)優(yōu)點(diǎn)是絕對(duì)穩(wěn)定因?yàn)闆](méi)有反饋回路其極點(diǎn)全部位于 Z 平面的原點(diǎn)無(wú)論系數(shù)如何系統(tǒng)都是穩(wěn)定的。可實(shí)現(xiàn)嚴(yán)格線性相位這意味著濾波器對(duì)所有頻率成分的延遲時(shí)間是相同的不會(huì)引起相位失真。這對(duì)于需要保持波形形狀的應(yīng)用至關(guān)重要如音頻處理、心電圖分析等。設(shè)計(jì) FIR 濾波器的主要方法是窗函數(shù)法和頻率采樣法。窗函數(shù)法思路直接先設(shè)定一個(gè)理想的頻率響應(yīng)如理想的低通然后對(duì)其進(jìn)行逆傅里葉變換得到無(wú)限長(zhǎng)的脈沖響應(yīng)最后用一個(gè)有限長(zhǎng)的窗函數(shù)如漢明窗、漢寧窗、凱澤窗將其截?cái)嗟玫娇捎玫?FIR 系數(shù)。窗函數(shù)的選擇決定了通帶波紋、阻帶衰減和過(guò)渡帶寬度之間的權(quán)衡。常見(jiàn)問(wèn)題與排查問(wèn)題濾波后信號(hào)幅度異常衰減或增益。排查檢查濾波器系數(shù)之和。對(duì)于低通濾波器系數(shù)和通常應(yīng)接近1直流增益為1。如果系數(shù)和遠(yuǎn)小于1會(huì)導(dǎo)致信號(hào)幅度被過(guò)度衰減。這通常是在設(shè)計(jì)時(shí)未對(duì)系數(shù)進(jìn)行歸一化導(dǎo)致的。問(wèn)題濾波后信號(hào)出現(xiàn)“振鈴”或吉布斯現(xiàn)象。排查這通常是由于使用矩形窗等銳利截?cái)嘁鸬?。嘗試使用更平滑的窗函數(shù)如凱澤窗或者增加濾波器階數(shù)M來(lái)獲得更陡的過(guò)渡帶但同時(shí)也會(huì)增加計(jì)算量。4. 無(wú)限脈沖響應(yīng)濾波器高效率實(shí)現(xiàn)銳利濾波IIR 濾波器利用了反饋其差分方程包含輸出項(xiàng)。正是這些反饋?lái)?xiàng)使得一個(gè)脈沖輸入能產(chǎn)生理論上無(wú)限長(zhǎng)的響應(yīng)盡管實(shí)際會(huì)衰減因此得名 IIR。它的最大優(yōu)勢(shì)是用較低的階數(shù)就能實(shí)現(xiàn)非常陡峭的頻率選擇性計(jì)算效率通常遠(yuǎn)高于同等性能的 FIR 濾波器。4.1 實(shí)現(xiàn)原理直接型與級(jí)聯(lián)型最直觀的實(shí)現(xiàn)是直接根據(jù)差分方程實(shí)現(xiàn)的直接 I 型或直接 II 型典范型。直接 II 型更為常用因?yàn)樗璧膬?nèi)存單元最少。其結(jié)構(gòu)清晰地分為兩部分前饋部分計(jì)算輸入與b系數(shù)的加權(quán)和產(chǎn)生一個(gè)中間信號(hào)。反饋部分將中間信號(hào)與過(guò)去的輸出經(jīng)a系數(shù)加權(quán)后的值相加得到當(dāng)前輸出同時(shí)更新反饋延遲線。然而直接型結(jié)構(gòu)有一個(gè)致命缺點(diǎn)對(duì)系數(shù)量化誤差非常敏感。當(dāng)濾波器階數(shù)較高或特性非常陡峭時(shí)系數(shù)的微小誤差由于處理器字長(zhǎng)有限可能導(dǎo)致頻率響應(yīng)嚴(yán)重偏離設(shè)計(jì)甚至使系統(tǒng)不穩(wěn)定。因此在實(shí)際工程中尤其是高階濾波器普遍采用級(jí)聯(lián)型或并聯(lián)型實(shí)現(xiàn)。其思路是將高階的系統(tǒng)函數(shù)H(z)分解為多個(gè)一階或二階小節(jié)稱為二階節(jié)Biquad的乘積或和。每個(gè)二階節(jié)獨(dú)立實(shí)現(xiàn)一個(gè)簡(jiǎn)單的濾波功能然后將它們串聯(lián)或并聯(lián)起來(lái)。一個(gè)二階節(jié)Biquad的差分方程y[n] b0*x[n] b1*x[n-1] b2*x[n-2] - a1*y[n-1] - a2*y[n-2]幾乎所有復(fù)雜的 IIR 濾波器如巴特沃斯、切比雪夫、橢圓濾波器都可以用多個(gè)這樣的二階節(jié)級(jí)聯(lián)來(lái)實(shí)現(xiàn)。實(shí)操心得在嵌入式 DSP 或?qū)崟r(shí)音頻處理中Biquad 二階節(jié)是黃金標(biāo)準(zhǔn)。它的代碼規(guī)整易于用循環(huán)實(shí)現(xiàn)對(duì)系數(shù)量化誤差的敏感度遠(yuǎn)低于直接型。在修改濾波器參數(shù)時(shí)你只需要重新計(jì)算并更新每個(gè) Biquad 節(jié)的5個(gè)系數(shù)b0, b1, b2, a1, a2即可。很多芯片廠商提供的庫(kù)函數(shù)也是以 Biquad 為基本單元。4.2 經(jīng)典設(shè)計(jì)模擬濾波器的數(shù)字化身IIR 濾波器的設(shè)計(jì)通常借鑒了成熟的模擬濾波器理論通過(guò)“雙線性變換”等映射方法將模擬濾波器如巴特沃斯、切比雪夫、橢圓濾波器的傳遞函數(shù)H(s)轉(zhuǎn)換為數(shù)字域的H(z)。巴特沃斯型通帶和阻帶都最平坦但過(guò)渡帶最寬。追求平滑性時(shí)的首選。切比雪夫I型通帶內(nèi)有等波紋波動(dòng)但過(guò)渡帶比巴特沃斯更窄。允許通帶內(nèi)有一定波紋以換取更好的選擇性。切比雪夫II型阻帶內(nèi)有等波紋波動(dòng)通帶平坦。橢圓型通帶和阻帶都有波紋但過(guò)渡帶最窄。在給定階數(shù)下能提供最銳利的截止特性。選擇指南需要最大平坦度不介意過(guò)渡帶寬 -巴特沃斯。需要較窄過(guò)渡帶能容忍通帶微小波動(dòng) -切比雪夫I型。需要最銳利的截止能容忍通帶和阻帶波紋 -橢圓型。常見(jiàn)問(wèn)題與排查問(wèn)題濾波器輸出出現(xiàn)不穩(wěn)定、飽和或溢出數(shù)值非常大。排查這是 IIR 濾波器最典型的問(wèn)題。首先檢查所有極點(diǎn)是否在單位圓內(nèi)可通過(guò)計(jì)算或使用zplane函數(shù)可視化。其次檢查反饋系數(shù)a1,a2等是否在合理范圍內(nèi)。最實(shí)用的技巧在定點(diǎn) DSP 或 FPGA 中實(shí)現(xiàn)時(shí)必須進(jìn)行充分的定標(biāo)分析和飽和處理。為每個(gè)二階節(jié)的輸出設(shè)置飽和限幅防止溢出傳播??梢試L試將高階濾波器轉(zhuǎn)換為級(jí)聯(lián)型并可能需要對(duì)各節(jié)進(jìn)行增益調(diào)整以優(yōu)化動(dòng)態(tài)范圍。問(wèn)題濾波后的信號(hào)相位嚴(yán)重扭曲。排查IIR 濾波器通常具有非線性相位。這是其固有特性。如果你的應(yīng)用對(duì)相位敏感如圖像處理、某些通信系統(tǒng)IIR 可能不是最佳選擇或者你需要考慮使用“零相位濾波”技術(shù)如filtfilt函數(shù)通過(guò)前向-后向?yàn)V波來(lái)實(shí)現(xiàn)零相位延遲但會(huì)引入因果性問(wèn)題和處理延遲。5. 特殊成員滑動(dòng)平均濾波器與梳狀濾波器除了通用的 FIR 和 IIR還有兩種結(jié)構(gòu)簡(jiǎn)單但極其有用的特殊濾波器。5.1 滑動(dòng)平均濾波器最簡(jiǎn)單的低通滑動(dòng)平均濾波器是 FIR 濾波器的一個(gè)特例其所有系數(shù)都相等b0 b1 ... bM 1/(M1)。它的功能是求取最近M1個(gè)采樣點(diǎn)的算術(shù)平均值。實(shí)現(xiàn)原理y[n] (x[n] x[n-1] ... x[n-M]) / (M1)高效實(shí)現(xiàn)技巧直接累加再除法的計(jì)算量是 O(M)??梢圆捎眠f歸實(shí)現(xiàn)將計(jì)算量降至 O(1)y[n] y[n-1] (x[n] - x[n-M-1]) / (M1)你只需要保存上一個(gè)輸出y[n-1]和最舊的那個(gè)輸入x[n-M-1]每次更新時(shí)做一次加法、一次減法和一次除法即可。應(yīng)用場(chǎng)景主要用于抑制隨機(jī)白噪聲平滑數(shù)據(jù)。它的頻率響應(yīng)是一個(gè)sinc函數(shù)主瓣寬度與M成反比旁瓣衰減較慢。因此它雖然簡(jiǎn)單但阻帶性能一般常用于對(duì)性能要求不高的初步濾波或降采樣前的抗混疊濾波。5.2 梳狀濾波器周期性頻譜的雕刻刀梳狀濾波器的頻率響應(yīng)像一把梳子在頻譜上產(chǎn)生一系列周期性的通帶和阻帶。它通常由簡(jiǎn)單的延時(shí)和加減法構(gòu)成。一個(gè)最簡(jiǎn)單的反饋梳狀濾波器IIR型的差分方程為y[n] x[n] α * y[n - L]其中L是延遲的采樣點(diǎn)數(shù)。它的系統(tǒng)函數(shù)為H(z) 1 / (1 - α * z^{-L})其零點(diǎn)/極點(diǎn)在單位圓上等間隔分布形成了“梳齒”。當(dāng)α接近1時(shí)在基頻Fs/L的整數(shù)倍處形成尖銳的諧振峰通帶當(dāng)α接近 -1 時(shí)則形成深陷的谷阻帶。應(yīng)用場(chǎng)景消除周期性干擾例如消除音頻或電源測(cè)量中固定的50Hz/60Hz工頻干擾及其諧波。通過(guò)將L設(shè)置為工頻周期對(duì)應(yīng)的采樣點(diǎn)數(shù)可以精準(zhǔn)地在這些頻率點(diǎn)形成陷波。產(chǎn)生特殊音效在音頻處理中用于制造“鑲邊”、“合唱”等效果。多速率信號(hào)處理在采樣率轉(zhuǎn)換抽取和插值系統(tǒng)中作為抗混疊或鏡像抑制濾波器的一部分。實(shí)操心得設(shè)計(jì)梳狀濾波器時(shí)關(guān)鍵參數(shù)是延遲長(zhǎng)度L它直接決定了梳齒的間隔頻率F_comb Fs / L。你需要精確計(jì)算干擾信號(hào)的周期對(duì)應(yīng)的采樣點(diǎn)數(shù)。α的絕對(duì)值大小決定了諧振峰或陷波的銳利程度Q值越接近1越銳利但穩(wěn)定性也越需要關(guān)注需確保|α| 1以保持穩(wěn)定。6. 從理論到實(shí)現(xiàn)設(shè)計(jì)流程與參數(shù)選擇實(shí)戰(zhàn)理解了原理我們來(lái)看看如何從頭到尾完成一個(gè)數(shù)字濾波器的設(shè)計(jì)與實(shí)現(xiàn)。這里以一個(gè)“濾除音頻信號(hào)中1kHz以上頻率成分”的低通濾波器為例。6.1 第一步確定技術(shù)指標(biāo)這是最重要的一步模糊的需求會(huì)導(dǎo)致反復(fù)修改。指標(biāo)必須量化通帶截止頻率 F_pass例如 1 kHz。通常允許信號(hào)在低于此頻率時(shí)衰減很小如 -3dB 點(diǎn)定義通帶邊。阻帶起始頻率 F_stop例如 1.2 kHz。希望信號(hào)高于此頻率時(shí)被顯著抑制。通帶最大衰減 A_pass例如 1 dB。在通帶內(nèi)信號(hào)衰減不能超過(guò)這個(gè)值。阻帶最小衰減 A_stop例如 40 dB。在阻帶內(nèi)信號(hào)至少要被衰減到這個(gè)程度。采樣頻率 Fs例如 44.1 kHz音頻CD標(biāo)準(zhǔn)。這決定了數(shù)字頻率范圍0 到 Fs/2即 22.05 kHz。6.2 第二步選擇濾波器類型FIR vs IIR根據(jù)指標(biāo)和系統(tǒng)約束做權(quán)衡需要線性相位嗎如果需要如多通道音頻對(duì)齊、生物信號(hào)分析首選 FIR。計(jì)算資源MIPS/功耗緊張嗎如果緊張且相位非線性可接受首選 IIR。要達(dá)到同樣的過(guò)渡帶1kHz到1.2kHz和阻帶衰減40dBIIR所需的階數(shù)可能只有 FIR 的十分之一甚至更低。對(duì)穩(wěn)定性要求極度苛刻嗎如果是首選 FIR。允許通帶/阻帶有波紋嗎如果追求平坦選巴特沃斯IIR或使用凱澤窗設(shè)計(jì)的 FIR。如果能容忍波紋以換取更窄過(guò)渡帶考慮切比雪夫或橢圓 IIR。假設(shè)我們選擇 IIR 巴特沃斯低通濾波器以兼顧較好的平坦度和適中的計(jì)算量。6.3 第三步計(jì)算濾波器階數(shù)與系數(shù)我們可以使用工具如 MATLAB 的buttord和butter函數(shù)Python SciPy 的scipy.signal.buttord和scipy.signal.butter來(lái)自動(dòng)完成這個(gè)復(fù)雜的計(jì)算。Python示例import scipy.signal as signal import numpy as np Fs 44100.0 F_pass 1000.0 F_stop 1200.0 A_pass 1.0 # dB A_stop 40.0 # dB # 將模擬頻率轉(zhuǎn)換為數(shù)字歸一化頻率 (0到1, 1對(duì)應(yīng)Fs/2) W_pass F_pass / (Fs / 2) W_stop F_stop / (Fs / 2) # 計(jì)算最小所需階數(shù) N 和自然頻率 Wn N, Wn signal.buttord(W_pass, W_stop, A_pass, A_stop, analogFalse) # 設(shè)計(jì)巴特沃斯濾波器系數(shù)輸出為二階節(jié)SOS形式最穩(wěn)定 sos signal.butter(N, Wn, btypelow, analogFalse, outputsos) print(f濾波器階數(shù): {N}) print(f二階節(jié)系數(shù)形狀: {sos.shape}) # 形狀為 (k, 6)k個(gè)二階節(jié)outputsos選項(xiàng)直接生成級(jí)聯(lián)的二階節(jié)系數(shù)這是推薦的、用于實(shí)際實(shí)現(xiàn)的格式。每個(gè)二階節(jié)包含6個(gè)系數(shù)[b0, b1, b2, a0, a1, a2]其中a0通常為1。6.4 第四步實(shí)現(xiàn)與驗(yàn)證實(shí)現(xiàn)根據(jù)得到的二階節(jié)系數(shù)數(shù)組sos編寫(xiě)一個(gè)通用的二階節(jié)級(jí)聯(lián)濾波函數(shù)。def sosfilter(sos, x): y x.copy() for section in sos: # 遍歷每個(gè)二階節(jié) b section[:3] # [b0, b1, b2] a section[3:] # [a0, a1, a2] (a01) # 實(shí)現(xiàn)直接II型轉(zhuǎn)置結(jié)構(gòu)數(shù)值上更優(yōu) y signal.lfilter(b, a, y) return y在實(shí)際的 C 或嵌入式代碼中你需要手動(dòng)實(shí)現(xiàn)每個(gè)二階節(jié)的差分方程并注意中間狀態(tài)的保存。驗(yàn)證設(shè)計(jì)完成后必須驗(yàn)證頻率響應(yīng)驗(yàn)證使用signal.freqz繪制幅頻和相頻響應(yīng)圖檢查是否滿足通帶、阻帶指標(biāo)。時(shí)域測(cè)試輸入一個(gè)單位脈沖觀察脈沖響應(yīng)是否穩(wěn)定衰減對(duì)IIR。輸入一個(gè)正弦掃頻信號(hào)觀察輸出幅度變化是否符合預(yù)期。實(shí)際信號(hào)測(cè)試用一段包含高頻和低頻成分的真實(shí)音頻信號(hào)進(jìn)行濾波聽(tīng)感上高頻應(yīng)被明顯削弱用頻譜圖觀察1kHz以上成分是否被有效抑制。參數(shù)選擇避坑指南過(guò)渡帶不要太窄過(guò)于陡峭的過(guò)渡帶如 F_pass1000Hz, F_stop1005Hz會(huì)導(dǎo)致濾波器階數(shù)劇增對(duì)FIR或系數(shù)敏感度極高、穩(wěn)定性變差對(duì)IIR。務(wù)必根據(jù)實(shí)際需求留出合理的過(guò)渡帶。注意采樣頻率 Fs所有頻率指標(biāo)都必須基于同一個(gè) Fs。如果信號(hào)經(jīng)過(guò)重采樣濾波器指標(biāo)也需要重新計(jì)算。IIR濾波器的初始狀態(tài)對(duì)于分段處理的數(shù)據(jù)流要注意濾波器狀態(tài)延遲單元中的值的保存和傳遞。如果每幀數(shù)據(jù)獨(dú)立濾波會(huì)在幀與幀之間引入瞬態(tài)失真。正確的做法是處理完一幀后將最終的濾波器內(nèi)部狀態(tài)保存下來(lái)作為下一幀濾波的初始狀態(tài)。許多庫(kù)函數(shù)如scipy.signal.lfilter的zi參數(shù)都支持這個(gè)功能。定點(diǎn)實(shí)現(xiàn)的量化噪聲在單片機(jī)或FPGA中用定點(diǎn)數(shù)實(shí)現(xiàn)時(shí)系數(shù)量化和運(yùn)算舍入會(huì)產(chǎn)生噪聲可能在高階IIR濾波器的阻帶內(nèi)形成“噪聲底棚”。需要通過(guò)仿真確定足夠的字長(zhǎng)如16位、24位并考慮使用噪聲整形技術(shù)。