matlab实现信号滤波有很多种方法,本文采用filter函数,先由butter函数生成数字滤波器分子、分母多项式,然后将这些参数传给filter函数,便可实现滤波的功能。
知识点如下:
1、[b,a] = butter(N,wc);
其中,b和a分别为滤波器分子、分母多项式,N为滤波器阶数,wc为3dB截止频率,巴特沃斯低通滤波器的特点为:整个频带内单调下降,且非常光滑,并且阶数越高,阻带内下降的越陡峭、越干脆。无论阶数多高,都在经过(wc,3dB)一点。
2、y = filter(b,a,x);
y为滤波后的信号,x为输入信号,b和a分别为分子、分母多项式,由butter函数获得。
3、滤波器的阶数和3dB截止频率可以通过函数butterd()获取,当然,如果没有那么多要求,直接设定也可以。
[N,wc] = butterd(wp,ws,Rp,Rs);
N为阶数,wc为3dB截止频率,wp和ws位通带截止频率和阻带截止频率,Rp和Rs为通带最大衰减和阻带最小衰减,这些参数挺讲究的,新手容易被搞懵逼,多看看课本。
4、本例程,生成的信号为两个正弦信号之和,频率分被为1KHz和3KHz,采样频率为10KHz,巴特沃斯低通滤波器8阶、3dB截止带宽2000Hz。
%%--------------------------------
%%巴特沃斯低通滤波对信号进行滤波
%%2020,10.07 12:35
%%-------------------------------
close all;clc;clear all;
Fs = 10000;%采样频率为10Khz
dt = 1/Fs;%采样时间间隔
L = 1000;%采样点数
t = (0:L-1)*dt;%生成时间向量
wc = 2000;%3dB截止频率
y = cos(2*pi*1000*t)+cos(2*pi*3000*t);%1000Hz和3000Hz
plot(t(1:100),y(1:100));
title('y=cos(2*pi*1000*t)+cos(2*pi*3000*t)');
figure;
Fy = fft(y)/L;
stem((0:L/2-1)*10,abs(Fy(1:L/2)));
title('y的频谱图')
[b a] = butter(8,wc*2/Fs);%3db截止频率为wc,最高频率为采样频率的一般,此时需要将0-wc/2映射到0-1上
y_lowpass = filter(b,a,y);%滤波
figure;
plot(t(1:100),y_lowpass(1:100));%绘制滤波后的信号波形
title('滤波后信号曲线');
Fy_low = fft(y_lowpass)/L;
stem((0:L/2-1)*(Fs/L),abs(Fy_low(1:L/2)));%Fs/L为频谱分辨度
title('滤波后频谱图');
[H W] = freqz(b,a);%获取数字低通滤波器的幅频特性曲线
figure;
plot(W*wc,abs(H));
xlabel('频率/Hz');ylabel('|H(jw)|');title('低通滤波器幅频特性曲线');