滤波器原理及设计实现

本文介绍了滤波器的基础知识,包括模拟滤波器如RC电路的工作原理,以及数字滤波器的类型,如IIR和FIR滤波器的设计方法。通过Z变换和MATLAB仿真,详细阐述了IIR滤波器的冲激响应不变法和双线性变换法,以及FIR滤波器的直接设计。最后,通过MATLAB代码展示了FIR滤波器的仿真过程。
摘要由CSDN通过智能技术生成

目录

1. 基础介绍

2. 模拟滤波器

3. 数字滤波器

3.1介绍

3.2IIR滤波器的设计

3.3FIR滤波器的设计

4. FIR滤波器仿真

5. 完整matlab仿真代码


 1. 基础介绍

1、滤波器的种类:按照实现方式分为模拟滤波器和数字滤波器,按照功能分,又可以分成低通滤波器、高通滤波器、带通滤波器、带阻滤波器,还有匹配滤波器等。

2、滤波器的实质:滤波器实质就是选频,所以首先要在频域角度理解,但通常只能在时域操作。傅里叶变换指明时域频域是有某种关联的。因此我们要在时域进行操作,而这种操作需对应频域一个曲线【选频部分的曲线值大,其他部分值小】,通过与信号频域相乘既可选频。频域相乘时域卷积。而卷积正是滤波器核心。

2. 模拟滤波器

低通滤波器与高通滤波器可用电阻与电容的组合形式实现即RC电路,下图为一阶RC滤波器:

其中时间常数T=RC单位秒;截至频率f=1/(2PiRC)单位hz。

低通滤波器时域分析:

电容电流:Ic=dq/dt=d(C*Uo)/dt=C*dUo/dt;[电荷增长曲线的微分]

基尔霍夫电压定律:Ui=RC* dUo/dt+Uo;[输出电压+电阻电压=输入电压]

解上诉微分方程得:Uo(t)=Ui(1-e^(-t/RC))。

低通滤波器的频域分析:

系统频率响应:H(jw)=Uo/Ui=1/(1+jwRC)à拉普拉斯变换-传递换算:G(s)=1/(1+RCs),其中s=jw,w=2Pif,当w=1/RC时,w为截至角频率。因此:

截至频率:f=1/(2PiRC)

截至输出:由Uo/Ui=1/(1+jwRC)—>|A(f)|=Uo=Ui/[(2PifRC)^2+1]^0.5。

幅频特性:A(f)=1/(j2PifRC+1)

相频特性:theat(f)=180arg(A(f))/Pi

3. 数字滤波器

3.1介绍

数字滤波器是具有一定传输选择特性的数字信号处理装置。例如:

一离散时间系统的输出x(n)是输入a(n)的3点移动平均值,即为:

x(n)=(a(n+1)+a(n)+a(n-1))/3。对其进行Z变换【将时域离散时间序列变换为在复频域的表达式】

式中 

【复频率】,σ为实变数,ω为实变量,所以Z是一个幅度为 e^ σ,相位为ω的复变量。x[n]和X(Z)构成一个Z变换对。

得到:H(Z)=(1+Z+Z^-1)/3。【Z变换级数的闭合形式】

则系统的频率响应:H(e^jw)=(1+2cosw)/3;幅频特性如下图:

由图可以看出该系统x(n)的频率响应具有低通滤波器的特性。

由以上例子推导数字滤波器的原理:

数字滤波器是一个离散时间系统,可以用差分方程,单位抽样响应h(n),系统响应H(z),频率响应H(e^jw)。其中单位抽样响应h(n)为无限长时为IIR滤波器;有限长时为FIR滤波器。

由上描述:一般离散时间系统差分方程表达式为:

即y(n)的输出只与历史输入和当前输入有关,与历史输出无关。

系统响应函数H(z):

即差分方程表达的系统的输入,输出的Z变换相除。

当bk为全0时有:

单位抽样响应h(n)为:

即M为一个固定有限值为FIR,反之为IIR。

3.2IIR滤波器的设计

IIR滤波器是对模拟滤波器的模仿,即先设计模拟原型滤波器,然后再变换为数字滤波器,具体有冲激响应不变法和双线性变换法。

如第二章中或者一阶RC滤波器的传递函数G(s)=1/(1+RCs),将该传递函数通过Z变换获得其差分方程【方法有双线性变换法,一阶前向差分,一阶后向差分等】

Y(n)=(T/T+RC)*X(n)+(RC/RC+T)*Y(n-1),令a=T/RC【称为滤波系数】,有:

Y(n)=a*x(n)+(1-a)*Y(n-1);截至频率=1/2PiRC=a/2PiT。【T为输入信号的周期】

3.3FIR滤波器的设计

FIR滤波器是直接设计,具有线性相位特性,可以无相位失真,具体设计有窗口法和频率抽样法。

FIR系统的差分方程为:

即单位抽样响应h(n)与输入x(n)的卷积;频率响应函数H(e^jw):

FIR直接型结构的信号流图:

 h(0)……h(N-1)为滤波器的系数,L=N为滤波器的阶数。

4. FIR滤波器仿真

1、设计一个以12M采样率的1MHz频率的正弦信号sin_f0和一个3MHz的正弦信号sin_f1,将两者相加得到包含两个频率的信号y。

2、对y进行FFT运算,观察其频谱,在1MHz处和3MHz处各有一个尖峰。

3、使用matlab的app工具下的filter designer设计一个低通滤波器,采样率为12M,通带频率为1MHz,截至频率2.5MHz,带外抑制60db。设计好参数之后生成matlab的function文件fir_test.m和以double float格式生成C语言的系数头文件。

  

4、将y信号输入生成的滤波器进行滤波,观察滤波后的频谱结果,3MHz信号被滤除。

5、用生成的系数头文件中的系数,根据差分方程实现滤波器代码,将y输入实现的滤波器进行滤波,观察滤波后的结果,3MHz信号同样被滤除。

5. 完整matlab仿真代码

%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
close all;
clc;
%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
sin_f0=1000000;%构造一个1MHz频率的正弦信号y0
sin_f1=3000000;%构造一个3MHz频率的正弦信号y1
Fs=12000000;%采样率为12MSPS
N=2^9*2^5;
n=0:N-1;
time=n/Fs;
y0=sin(2*pi*sin_f0*time);
y1=sin(2*pi*sin_f1*time);
y=y0+y1;%将1MHz的信号3MHz的信号相加,生成包含两个频率分量的原始信号
%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
base_len = length(y);
f_label = zeros(1,base_len);%将采样点换算频域横坐标轴--频率
for i = 1:base_len
    f_label(i) = i*Fs/base_len;
end
%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
base_sig = y;
base_fft = abs(fft(base_sig));
subplot(4,1,1);
plot(base_sig(1:1000),'b');grid;%观察原始信号的时域波形
title('原始时域信号');
subplot(4,1,2);
plot(f_label,base_fft,'b');grid;%观察原始信号的频域波形
title('原始频域信号');
%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
fir_test_h = fir_test;%filter
fir_out = filter(fir_test_h,base_sig);%将原始信号通过APP设计的滤波器函数
fir_offt = abs(fft(fir_out));
subplot(4,1,3);
plot(f_label,fir_offt,'b');grid;%观察通过滤波器后的输出信号的频谱
title('过app滤波器频域信号');
%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
%const real64_T B[16] = {
%  -0.005700421513832, -0.01556471278631, -0.02228444839447,-0.009828311948894,
%    0.03587721977257,   0.1130425780429,   0.1976989051341,   0.2535440082061,
%     0.2535440082061,   0.1976989051341,   0.1130425780429,  0.03587721977257,
%  -0.009828311948894, -0.02228444839447, -0.01556471278631,-0.005700421513832
%};%通过APP设计的滤波器生成的滤波器系数
ltr_coe = [-0.005700421513832, -0.01556471278631, -0.02228444839447,-0.009828311948894,...
    0.03587721977257,   0.1130425780429,   0.1976989051341,   0.2535440082061,...
     0.2535440082061,   0.1976989051341,   0.1130425780429,  0.03587721977257,...
  -0.009828311948894, -0.02228444839447, -0.01556471278631,-0.005700421513832];
ltr_out = zeros(1,base_len);%使用滤波器系数和差分方程实现滤波器
for i = 17:base_len
    ltr_out(i) = base_sig(i-16)*ltr_coe(16)+base_sig(i-15)*ltr_coe(15)+...
        base_sig(i-14)*ltr_coe(14)+base_sig(i-13)*ltr_coe(13)+base_sig(i-12)*ltr_coe(12)+...
        base_sig(i-11)*ltr_coe(11)+base_sig(i-10)*ltr_coe(10)+base_sig(i-9)*ltr_coe(9)+...
        base_sig(i-8)*ltr_coe(8)+base_sig(i-7)*ltr_coe(7)+base_sig(i-6)*ltr_coe(6)+...
        base_sig(i-5)*ltr_coe(5)+base_sig(i-4)*ltr_coe(4)+base_sig(i-3)*ltr_coe(3)+...
        base_sig(i-2)*ltr_coe(2)+base_sig(i-1)*ltr_coe(1);
end%将原始信号通过实现的滤波器
%-----------------------------------------
%-----------------------------------------
%-----------------------------------------
ltr_offt = abs(fft(ltr_out));
subplot(4,1,4);
plot(f_label,ltr_offt,'b');grid;%观察通过滤波器后的输出信号的频谱
title('自写滤波器频域信号');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积文致远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值