1. 程式人生 > >濾波器設計(2):經典FIR數字濾波器的設計

濾波器設計(2):經典FIR數字濾波器的設計

引言

以前有一篇IIR濾波器設計的文章。與IIR相對應,這篇文章主要講FIR濾波器的設計。

以下一段摘自百度百科。

FIR(Finite Impulse Response)濾波器:有限長單位衝激響應濾波器,又稱為非遞迴型濾波器,是數字訊號處理系統中最基本的元件,它可以在保證任意幅頻特性的同時具有嚴格的線性相頻特性,同時其單位抽樣響應是有限長的,因而濾波器是穩定的系統。因此,FIR濾波器在通訊、影象處理、模式識別等領域都有著廣泛的應用。

FIR濾波器的優點,一定是穩定的(極點都在0的位置),可以做到線性相位,而IIR的相位是非線性的(摘自鄭君裡《訊號與系統》)。

按奇偶節數、奇偶對稱,把實h(n)的FIR分為四類。


從Hg(w)可以看出,有些就不能做低通,有些就不能做高通,等。

其他詳細內容,可自行查閱資料。

窗函式法

FIR濾波器設計方法“據說”有很多種。本科上課的時候,就教過一種,窗函式法。大致意思就是,要設計什麼,就用那種對應的理想濾波器去乘以一個窗函式。假設要設計一個LPF。理想LPF最好理解。但由於xxxx原因,不能物理實現。上海交大(SJTU)某一年考研題目問的就是“為什麼理想LPF物理不可實現”,以及什麼是Gibbs(吉布斯)現象。理想LPF的單位脈衝相應h(n)是無限長的,實際中不可能做到無限長的,所以希望用有限長的h1(n)去逼近h(n),實現最小均方誤差意義下的最優。有人證明了,把理想的h(n)截斷,就可以得到最小均方誤差意義下的最優。截斷的意思就是,加矩形窗w(n)。時域相乘,頻域就是拿著H(jw)和窗函式的W(jw)卷積。後來在有些場合下,發現矩形窗不能滿足需求,於是有了三角窗、Hanning窗、Hamming窗、Blackman窗、Kaiser窗等。一個理解就是拿主瓣寬度和旁瓣衰減互換。魚和熊掌不可兼得。e.g. 矩形窗,主瓣窄,旁瓣大,過渡帶頻寬寬,旁瓣衰減不夠大。總之,需要根據需求,選擇窗函式。

設計步驟

用maltab設計FIR線性相位濾波器的步驟大致如下。1. 根據需求,提出指標。2. 把指標化成數字的。3. 按照指標,選窗函式。4. 按過渡帶頻寬,定階數。但是,要注意階數是否滿足頻率特性。比如,有些線性相位FIR濾波器就不能實現低通……5. 呼叫fir1確定係數。6. 檢驗其頻率響應。又是一個反覆試驗,反覆修正的過程。注意,千萬小心,matlab裡,zplane對FIR濾波器,慎用!慎用!不要輕易對FIR的係數求零極點。階數很高的時候,電腦要算死的。

窗函式



設計例項

%% 內容:設計FIR濾波器
% 作者:qcy
% 版本:v1.0
% 時間:2016年10月27日22:34:24

clear;
close all;
clc

%%

Fs = 8000; % 取樣率

fp = 1000; % Hz 通帶截止頻率 起伏小於xxx dB
fs = 1500; % Hz 阻帶截止頻率 衰減大於xxx dB
wp = 2*pi * fp / Fs; % 對應的數字角頻率
ws = 2*pi * fs / Fs; % xxx
fc = (fp+fs)/2; % 要設計的FIR的截止頻率 -_-! 幾個概念容易搞混
% 就LPF來講,fc按理說可能可以取為 fc = fp + (fs-fp) * theta, theta在0~1之間
w_bw = (ws-wp); % 過渡帶頻寬

% 如果要求阻帶最小的衰減為 50 dB,查表發現hamming窗就可以滿足條件
N = ceil(3.3 * 2*pi /w_bw); % 濾波器長度 3.3為Hamming窗過渡段的引數,用來求濾波器長度
win = hamming(N+1);

Fs2 = Fs/2;
Wn = fc/Fs2;

b = fir1(N,Wn,win);

[H,w] = freqz(b,1,1e4);
figure(1);
subplot(211);
stem(b);
title('單位脈衝響應');
grid on;
subplot(212);
plot(w/2/pi*Fs,20*log10(abs(H)+eps));
title('幅頻特性');
xlabel('頻率(Hz)');
grid on;
figure(2);
subplot(311);
plot(w/2/pi*Fs,20*log10(abs(H)+eps));
title('幅頻特性');

grid on;
subplot(312);
plot(w/2/pi*Fs,angle(H));
title('相頻特性');

grid on;
subplot(313);
plot(w/2/pi*Fs,unwrap(angle(H)));
grid on;
title('相頻特性(解卷繞後)');
xlabel('頻率(Hz)');


最後一張圖中,相頻特性進行了解卷繞(unwrap)。可以看出,相位確實是線性的。

FIR與IIR簡單的對比

摘自鄭君裡《訊號與系統》。