用MATLAB设计FIR滤波器

滤波器

滤波器定义

“滤波器(filter),是一种用来消除干扰杂讯的器件,将输入或输出经过过滤而得到纯净的直流电。对特定频率的频点或该频点以外的频率进行有效滤除的电路,就是滤波器,其功能就是得到一个特定频率或消除一个特定频率。”

滤波器种类

滤波器按照频率来分类,可分为高通、低通、带通、带阻以及全通滤波器,根据所需选择合适滤波器。

滤波器种类

滤波器设计

滤波器的设计方法可分为两大类,一类是IIR,另一类是FIR。对于FIR的设计,一般可以采用等波纹以及窗的方法。

滤波器设计要求

采样频率50khz,带通滤波器,通带15KHz,阻带20KHz,阻带衰减50dB,用凯撒窗设计带通滤波器。

Matlab程序设计滤波器

首先在Matlab中设置所需参数:

fs = 50000;
T = 1/fs;
L = 4000;
t = (0:L-1)*T;

然后从r32文件中读取信号数据:

filename=['文件路径'];
fid=fopen(filename,'r');
Na=4000;
dat=fread(fid,[32,Na],'float');
data=dat(1,:); %data即为所导入信号

绘制信号时域图:

plot(t,data)

得到:
滤波前信号时域图
再对其进行FFT:

NFFT = 2^nextpow2(L);
Y = fft(data,NFFT)/L;
f=fs/2*linspace(0,1,NFFT/2+1);
figure
plot(f,2*abs(Y(1:NFFT/2+1)))
title('Single-sided Amplitude Spectrum of y(t)')
xlabel('Frequency(Hz)')
ylabel('|Y(f)|')

得到:
滤波前信号的单面振幅频谱图
设计滤波器:

fs = 50000;
f = [13000 15000 20000 22000];
dev = [0.01 0.02 0.01];
a = [0 1 0];
[n,wn,beta,ftype] = kaiserord(f,a,dev,fs);
b = fir1(n,wn,'bandpass');
freqz(b)

得到滤波器的幅值相位图:
滤波器的幅值相位图
所设计滤波器的分子系数存于b中,使所给信号通过所设计的滤波器,所用程序如下:

d=filter(b,1,data);
plot(t,d)

得到滤波后的信号时域图:
滤波后的信号时域图
对其进行FFT:

Y _af= fft(d,NFFT)/L;
f_af=fs/2*linspace(0,1,NFFT/2+1);
figure
plot(f_af,2*abs(Y_af(1:NFFT/2+1)))
xlabel('Frequency(Hz)')

得到:
滤波后信号的单面振幅频谱图

利用Matlab工具箱设计滤波器

另外,还有一种更加快捷的设计方法,即使用Matlab自带的工具箱filterDesigner来设计滤波器:
在Matlab的命令行窗口中输入filterDesigner,得到如下窗口:
filterDesigner界面
通过选择设置,可以得到滤波器的系数,以本题为例:
利用filterDesigner设计滤波器
其系数如下:
滤波器系数
可对其到处头文件,进行数据处理。

总结

本人对于数字信号处理这门课的学习比较冲忙,对于很多知识点都是比较模糊,希望在后续所需时能够进一步的加深理解。
在FIR滤波器设计的过程中,遇到一个比较困惑的点是,根据其他的案例,滤波器系数是包含分子系数以及分母系数,但本例产生的滤波器仅含分母系数,比较困惑,请大佬们指教!

### 使用MATLAB设计FIR滤波器进行去噪处理 为了有效去除信号中的噪声,可以采用基于窗函数方法来设计有限冲击响应(FIR)滤波器。具体过程如下: #### 设计目标 定义所需的滤波特性,例如通带范围、阻带起始频率以及期望的衰减程度。 #### 计算理想低通滤波器的单位脉冲响应 对于理想的低通滤波器,其单位脉冲响应可以通过逆傅里叶变换获得[^2]: \[ h[n]=\frac{1}{2 \pi} \int_{-\pi}^{\pi} H(e^{j w}) e^{jwn} dw \] 然而,在实际应用中,这种理想化的无限长度序列不可实现,因此需要截断并加权以形成有限长的离散时间序列。 #### 应用窗口技术 通过乘上一个合适的窗函数(如汉宁窗、海明窗等),可以在一定程度上减少吉布斯现象带来的振荡效应,并使最终得到的 FIR 滤波器具有更好的过渡带性能和更少的旁瓣电平。常用的窗函数有矩形窗(Rectangular Window),巴特利特窗(Bartlett Window),汉宁窗(Hann Window),布莱克曼窗(Blackman Window)[^1]。 下面是一个简单的 MATLAB 实现例子用于创建一个低通 FIR 滤波器来进行去噪操作: ```matlab % 参数设定 Fs = 8000; % 假设采样率为8kHz Fcutoff = 1000; % 切除高于1kHz以上的成分作为截止频率 Ntaps = 51; % 敲定滤波器阶数/抽头数量 winType = 'hamming'; % 选用Hamming window % 创建理想型LPF原型 lpf_ideal = fir1(Ntaps-1, Fcutoff/(Fs/2)); % 加入选定类型的window h_fir = lpf_ideal .* hamming(length(lpf_ideal))'; % 绘制频响图 figure; [h,w] = freqz(h_fir); plot(w/pi*Fs/2,abs(h)); xlabel('Frequency (Hz)'); ylabel('|H(f)|'); title(['Magnitude Response of the Lowpass Filter with ', num2str(Ntaps), '-tap']); grid on; % 对含噪音频文件执行过滤动作 [y,Fs_y] = audioread('noisy_signal.wav'); % 导入含有噪音的声音档案 y_filtered = filter(h_fir,1,y); % 进行卷积运算完成滤波工作 audiowrite('cleaned_signal.wav', y_filtered, Fs_y); % 输出净化后的音档 ``` 此段代码展示了如何构建一个基本的低通 FIR 数字滤波器,并将其应用于清理语音或其他形式的时间域数据流内的高频干扰项。值得注意的是,这里选择了 Hamming 窗作为权重因子之一,这有助于改善所得滤波器在过渡区域的表现效果。
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值