目录
滤波器设计是一个创建满足指定滤波要求的滤波器参数的过程。滤波器的实现包括滤波器结构的选择和滤波器参数的计算。只有完成了滤波器的设计和实现,才能最终完成数据的滤波。
滤波器设计的目标是实现数据序列的频率成分变更。严格的设计规格需要指定通带波纹数、阻带衰减、过渡带宽度等。更准确的指定可能需要实现最小阶数的滤波器、需要实现任意形状的滤波器形状或者需要用fir滤波器实现。
1 设计混合测试信号
指标:采样率 1000;
长度 500;
频率成分 100Hz 300Hz 随机噪声
fs = 1000;
t = 0:1/fs:0.5;
n = length(t);
x = sin(2*pi*100*t) + sin(2*pi*300*t);
y = x + 2*randn(size(t));
plot(x);
未加噪声的混合信号:
加入随机噪声的信号:
2 频谱分析
在对未知信号滤波前要设计合适的滤波器,必须要知道混合信号的频率成分才能选择合适的滤波器和滤波器参数。利用傅里叶变就可以很方便的得到混合信号的频率成分。注释掉的代码没有进行平移对称前的傅里叶变换后数据。
Y = fft(y);
% f = (0:length(Y)-1)*fs/length(Y);
% figure;
% plot(f,abs(Y));
n = length(y);
fshift = (-n/2:n/2-1)*(fs/n);
yshift = fftshift(Y);
figure;
plot(fshift,abs(yshift));
频谱图:
3 利用fdatool设计滤波器
matlab 输入 fdatool 命令打开滤波器设计工具
在此界面选择合适滤波器类型和填入合适数据,可以实时看到滤波器的相应。比如前面的混合信号有100Hz和300Hz的频率成分,现在我需要保留100Hz的频率分量,去掉300Hz的频率分量。选择低通滤波器。
本次设计的滤波器参数:
设计滤波器时,不能光考虑滤波器效果,还要考虑处理器的处理能力。阶数越高的滤波器滤波效果越好,数据也更加平滑,但是同时也会增加处理器的计算量,增加处理时间,实时效果差。设计时应在滤波效果和滤波器的计算量之间做一个平衡。
4 导出滤波器参数
在滤波器设计页面执行file->Generate Matlab Code->Filter Design Function,输入函数名字保存。
5 滤波
mypass是第4步保存的滤波器参数文件的名字,保存注意将文件保存到当前的工程文件夹下。
hd = mypass;
yfilter = filter(hd,y);
figure;
plot(yfilter);
滤波效果:
全部代码:
clc
clear
close all
fs = 1000;
t = 0:1/fs:0.5;
n = length(t);
x = sin(2*pi*100*t) + sin(2*pi*300*t);
y = x + 0.2*randn(size(t));
plot(x);
figure;
plot(y);
Y = fft(y);
% f = (0:length(Y)-1)*fs/length(Y);
% figure;
% plot(f,abs(Y));
n = length(y);
fshift = (-n/2:n/2-1)*(fs/n);
yshift = fftshift(Y);
figure;
plot(fshift,abs(yshift));
hd = mypass;
yfilter = filter(hd,y);
figure;
plot(yfilter);
mybass.m(fadtool设计生成)
function Hd = mypass
%MYPASS Returns a discrete-time filter object.
% MATLAB Code
% Generated by MATLAB(R) 9.0 and the DSP System Toolbox 9.2.
% Generated on: 18-Jun-2020 16:40:50
% Equiripple Lowpass filter designed using the FIRPM function.
% All frequency values are in Hz.
Fs = 1000; % Sampling Frequency
Fpass = 100; % Passband Frequency
Fstop = 150; % Stopband Frequency
Dpass = 0.057501127785; % Passband Ripple
Dstop = 0.0001; % Stopband Attenuation
dens = 20; % Density Factor
% Calculate the order from the parameters using FIRPMORD.
[N, Fo, Ao, W] = firpmord([Fpass, Fstop]/(Fs/2), [1 0], [Dpass, Dstop]);
% Calculate the coefficients using the FIRPM function.
b = firpm(N, Fo, Ao, W, {dens});
Hd = dfilt.dffir(b);
% [EOF]