- 目标
用Kaiser窗设计一个FIR数字带阻滤波器,对模拟信号 x a ( t ) = c o s ( 2 π f a t ) + c o s ( 2 π f b t ) + c o s ( 2 π f c t ) x_a(t) = cos (2\pi f_at) + cos (2\pi f_bt) + cos (2\pi f_ct) xa(t)=cos(2πfat)+cos(2πfbt)+cos(2πfct),
f a = 6500 H z , f b = 7000 H z , f c = 9000 H z f_a = 6500 Hz,f_b = 7000 Hz,f_c = 9000 Hz fa=6500Hz,fb=7000Hz,fc=9000Hz 滤波,要求滤去7000Hz 的频率成分。 - 参数
系统采样频率为 f s f_s fs = 32000 Hz,采样点数 N=4096,滤波器的 通带衰减 R p R_p Rp = 0.25 dB,阻带衰减 α \alpha α = 50 dB,过渡带宽可以用模拟频率(例如200Hz)也可以用数字频率指定。
【 1. 具体实现 】
- 旁瓣衰减为 α dB 且表示 FIR 滤波器的凯塞窗,此时的形状因子为:
β = { 0.1102 ( α − 8.7 ) , α > 50 0.5842 ( α − 21 ) 0.4 + 0.07886 ( α − 21 ) , 50 ≥ α ≥ 21 0 , α < 21 \left.\beta=\left\{\begin{array}{ll}0.1102(\alpha-8.7),&\alpha>50\\ 0.5842(\alpha-21)^{0.4}+0.07886(\alpha-21),&50\geq\alpha\geq21\\ 0,&\alpha<21\end{array}\right.\right. β=⎩ ⎨ ⎧0.1102(α−8.7),0.5842(α−21)0.4+0.07886(α−21),0,α>5050≥α≥21α<21 - 阶数
n = α s − 8 2.285 × Δ w n=\frac{\alpha _s-8}{2.285\times \Delta w} n=2.285×Δwαs−8 - MATLAB实现代码
clc;
clear;
close all;
%% 【1. 设定参数】
%%% 采样参数
fs = 32000; %采样频率
Ts = 1/fs; %采样周期
N = 4096; %采样点数
t = 0:Ts:(N-1)*Ts; %时间刻度
%%% 原信号参数
fa = 6500;
fb = 7000;
fc = 9000;
xa = cos(2*pi*fa*t)+cos(2*pi*fb*t)+cos(2*pi*fc*t);
%% 【3. 滤波前:fft频谱】
%%% FFT
M = 4096; %FFT的运算点数
Xa = fft(xa,M); %FFT输出值
Xa = [Xa(1)/M,Xa(2:M)*2/M]; %幅度轴
Xa_fftshift = fftshift(Xa); %频域搬移
k = -M/2:M/2-1; %频率点索引
f = fs*k/M; %频率轴
%%% 画图
figure;
stem(f,abs(Xa_fftshift));
xlabel('频率');
ylabel('幅度');
title('滤波前的频谱');
grid;
%% 【4. 滤波器设计:加Kasier窗的FIR滤波器】
%%% 滤波器参数
Rp = 0.25; %通带衰减,单位dB,(未用到)
alpha = 50; %阻带衰减,单位dB
fstart = 6900; % 阻带起始频率
fstop = 7100; % 阻带终止频率
beta = 0.1102*(alpha-8.7); % 形状因子beta
Wn = [2*fstart/fs 2*fstop/fs];% 阻带带宽,两个截止角频率(归一化),截至范围:6900hz-7100hz
Wfs = 2*pi*(fstop-fstart)/2/fs; % 归一化过渡带宽
n = (alpha-8)/(2.285*Wfs); %阶数
n = ceil(n); % 向上取整
n = n + mod(n,2); % 取偶
%%% 生成凯塞窗
Windows = kaiser(n+1,beta); %凯撒窗
KasierFilter = fir1(n,Wn, 'stop', Windows);
%%% 画图
[H, W] = freqz(KasierFilter,1,4096,fs); %返回凯塞窗滤波器的频率响应H,角频率W
figure;
freqzplot(H,W); %频率响应
title("滤波器的频率响应");
ylabel('dB');
%% 【5. 信号输入滤波器:最终效果】
After_filter = filter(KasierFilter,1,xa);%把信号输入滤波器
Xa1 = fft(After_filter,M); %FFT输出值
Xa1 = [Xa1(1)/M,Xa1(2:M)*2/M]; %幅度轴
Xa1_fftshift = fftshift(Xa1); %频域搬移
k = -M/2:M/2-1; %频率点索引
f = fs*k/M; %频率轴
%%% 画图
figure;
stem(f,abs(Xa1_fftshift));
xlabel('频率');
ylabel('幅度');
title('滤波后的频谱');
grid;
【 2. 参考 】
MATLAB 官方对 kaiser() 凯塞窗函数的描述文章来源:https://www.toymoban.com/news/detail-820972.html
MATLAB 官方对 fir1() FIR滤波器函数的描述文章来源地址https://www.toymoban.com/news/detail-820972.html
到了这里,关于FIR数字滤波器设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!