精华内容
下载资源
问答
  • 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范...

    二阶有源带通滤波器设计

    1、背景

    对于微弱的信号的处理方式一般是:放大和滤波,这个过程中就涉及到放大电路的选取、滤波器的选择以及偏置电路的设计。本例以实例的方式讲解并附带参数计算、仿真、实物测试三个环节。

    假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。

    2、滤波器定义

    滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,而且其他频率的信号大大衰减即阻止其通过。按滤波器工作频率范围的不同,可分为:

    • 低通滤波器(Low-pass Filter,LPF)
    • 高通滤波器(High-pass Filter,HPF)
    • 带通滤波器(Band-pass Filter,BPF)
    • 带阻滤波器(Band-rejection Filter,BRF)
    • 全通滤波器(All-pass Filter,APF)

    仅由电阻、电容、电感这些无源器件组成的滤波电路称为无源滤波器。如果滤波电路中含有有源元件,如集成运放等,则称为有源滤波器。与无源滤波器相比,有源滤波器具有效率高、带负载能力强、频率特性好,而且在滤波的同时还可以将有用信号放大等一系列有点而得到广泛应用。

    2.1、滤波器种类

    2.1.1、低通滤波器

    f0~f2频率之间,幅频特性平直,它可以使信号中低于f2的频率成分几乎不受衰减地通过,而高于f2的频率成分受到极大地衰减。

    9fbce1aff53584ffaffbda73d8a60b27.png

    图 1低通滤波器

    2.1.2、高通滤波器

      与低通滤波相反,从频率f1~∞,其幅频特性平直。它使信号中高于f1的频率成分几乎不受衰减地通过,而低于f1的频率成分将受到极大地衰减。

    65b1ea26dc27427aa64fcf3cd9b4dd4a.png

    图 2高通滤波器

    2.1.3、带通滤波器

      它的通频带在f1~f2之间。它使信号中高于f1而低于f2的频率成分可以不受衰减地通过,而其它成分受到衰减。

    6f500695a856ebf7f21bf3bdf0fcab4b.png

    图 3带通滤波器

    实际上将低通滤波器和高通滤波器串联,即可构成带通滤波器,此处需要注意高通滤波器的截止频率一定要小于低通滤波器的截止频率即fH<fL,否则新构成的滤波器就会变成全频滤波器。

    3e66c8f7703f47d89f23fd21324be24f.png

    图 4低通滤波器与高通滤波器的串联

    2.1.4、带阻滤波器

      与带通滤波相反,阻带在频率f1~f2之间。它使信号中高于f1而低于f2的频率成分受到衰减,其余频率成分的信号几乎不受衰减地通过。

    c68cbc44d2c29267bdd75ab9c8b59596.png

    图 5带阻滤波器

    实际上将低通滤波器和高通滤波器并联,即可构成带通滤波器带阻滤波器。此处需要注意高通滤波器的截止频率一定要大于低通滤波器的截止频率即fH>fL, 否则新构成的滤波器就会变成全通滤波器。

    67a37ea11c9fdb8ab8b9ae67f81fed80.png

    图 6低通滤波器与高通滤波器的并联

    2.2、滤波器的基本参数

    理想滤波器是不存在的,在实际滤波器的幅频特性图中,通带和阻带之间应没有严格的界限。在通带和阻带之间存在一个过渡带。在过渡带内的频率成分不会被完全抑制,只会受到不同程度的衰减。当然,希望过渡带越窄越好,也就是希望对通带外的频率成分衰减得越快、越多越好。因此,在设计实际滤波器时,总是通过各种方法使其尽量逼近理想滤波器。

    如图所示为理想带通(虚线)和实际带通(实线)滤波器的幅频特性。由图中可见,理想滤波器的特性只需用截止频率描述,而实际滤波器的特性曲线无明显的转折点,两截止频率之间的幅频特性也非常数,故需用更多参数来描述。

    de99bb593cfb298a5e4e72230cf48a60.png

    图 7实际滤波器

    2.2.1、纹波幅度d

    在一定频率范围内,实际滤波器的幅频特性可能呈波纹变化,其波动幅度d与幅频特性的平均值A0相比,越小越好,一般应远小于-3dB。

    2.2.2、截止频率fc

    截止频率(Cutoff Frequency):指低通滤波器的通带右边频点或高通滤波器的通带左边频点。通常以1dB或3dB相对损耗点的标准定义。相对损耗的参考基准为:低通以DC处插入损耗为基准,高通则以未出现寄生阻带足够高的通带频率处插入损为基准。

    2.2.3、中心频率(Center Frequency):

    滤波器通带的中心频率f0,一般取f0=(f1+f2)/2,f1、f2为带通或带阻滤波器左、右相对下降1dB或3dB边频点。窄带滤波器常以插入损耗最小点为中心频率计算通带带宽。

    2.2.4、带宽B和品质因数Q值

    上下两截止频率之间的频率范围称为滤波器带宽,或-3dB带宽,单位为Hz。带宽决定着滤波器分离信号中相邻频率成分的能力——频率分辨力。在电工学中,通常用Q代表谐振回路的品质因数。在二阶振荡环节中,Q值相当于谐振点的幅值增益系数, Q=1/2ξ(ξ——阻尼率)。对于带通滤波器,通常把中心频率f0和带宽 B之比称为滤波器的品质因数Q。例如一个中心频率为500Hz的滤波器,若其中-3dB带宽为10Hz,则称其Q值为50。Q值越大,表明滤波器频率分辨力越高。

    2.2.5、倍频程选择性W

    在两截止频率外侧,实际滤波器有一个过渡带,这个过渡带幅频曲线的倾斜程度表明了幅频特性衰减的快慢,它决定着滤波器对带宽外频率成分衰阻的能力。通常用倍频程选择性来表征。所谓倍频程选择性,是指在上截止频率fc2与 2fc2之间,或者在下截止频率fc1与fc1/2之间幅频特性的衰减值,即频率变化一个倍频程时的衰减量或倍频程衰减量以dB/oct表示(octave,倍频程)。显然,衰减越快(即W值越大),滤波器的选择性越好。对于远离截止频率的衰减率也可用10倍频程衰减数表示之。即[dB/10oct]。

    2.2.6、滤波器因数(或矩形系数)

    滤波器因数是滤波器选择性的另一种表示方式 ,它是利用滤波器幅频特性的 -60dB带宽与-3dB带宽的比值来衡量滤波器选择性.即理想滤波器 =1,常用滤波器 =1~5,显然, 越接近于1,滤波器选择性越好。

    2.2.7、插入损耗(Insertion Loss):

    滤波器插入电路之前传播送到负载阻抗的功率与滤波器插入之后传送到负载阻抗的比值的对数,称为滤波器插入损耗。常以中心或截止频率处损耗表征。

    3、计算过程

    3.1、1.65V偏置电路计算

    抬升电路本质上是一个加法器,其原理是在输入信号的基础加一个偏置量。此处需要将被测信号抬升至0~3.3V范围内,假设信号为正弦信号,且在0V上下波动,因此需要将信号抬升1.65V。整个计算过程使用虚短、虚断的假设,列出如下两个方程,将②式化简并带入①式,可以求得③式。从化简后的③式可以看出:u0=ku2+gu1,其中k、g仅与电阻的大小有关,k为加法电路偏置,g为输入信号增益,此处仅实现1.65V偏置,因此k=2,g=1。如需在偏置的基础上增加对输入信号的放大,可以适当调节电阻阻值,此处不再赘述。为简化电阻选值,假设R1=R3,则、R2=2R1=2R3。该结论适用于同类的抬升电路。

    77146bb3846d9a31f30bdce222d24be9.png

    图 8偏置电路图

    e3b7750118fa2dc54b05f0897c381827.png

    图 9偏置电路

    根据虚短、虚断列出下面两个方程:

    f4260e79959cf2cefdc44b9f7434e1fe.png

    推导出下式:

    2971a02713246fd726ce08fa8e338d7d.png

    则是偏置电压的偏置常数,是闭环增益,此处希望,,带入可得:。即偏置电路中的二等分偏置电阻是反馈电阻的两倍,反馈端对地电阻和反馈电阻相等。对于有电容的电路,上式电阻(R)可以用阻抗(z)的形式表示。

    此处选择输入电阻为100KΩ,则偏置电路电阻为200KΩ。

    3.2、滤波器计算

    3.2.1、一阶有源滤波器

    c39cd61ad3ab728421070e86bcf870e4.png

    图 10一阶LPF

    3.2.2、二阶低通滤波器

      为改善滤波效果,使时,信号衰减的更快,一般在上图所示的一阶低通滤波器的基础上再增加一级RC电路就构成二阶有源低通滤波器,如下图所示。

    24b974f4c689d32edd99e92a4a9b15b0.png

    图 11二阶LPF

    3.2.3、二阶压控型低通滤波器

    二阶压控型低通有源滤波器中的一个电容器C1原来是接地的,现在改接到输出端。显然C1的改接不影响通带增益。

    e632244788644686d23b109ea4c9cae9.png

    图 12二阶压控型LPF

    二阶LPF传递函数:

    37d0dbc5540521983e350486eec3a271.png

    通带增益:

    027c6d41dce8706289550b3bdb180d11.png

    上式表明,该滤波器的通带增益应小于3,才能保障电路稳定工作。

    3.2.4、二阶高通滤波器

    高通滤波器电路与低通滤波器在电路上具备对偶性,通过把低通滤波器电路中的R、C互换位置即可得到高通滤波器,并且相应的截止频率也具备这种特性。

    00cf9edfcfa3d4de596ca291c0d9287e.png

    图 13二阶HPF

    二阶HPF传递函数:

    5527b5e17df2de3c060445fdfe157114.png

    通带增益:

    027c6d41dce8706289550b3bdb180d11.png

    3.2、二阶滤波器计算

    276154f8881283c2edbec49ac66e4793.png

    时,幅频特性曲线最平坦称为Butterworth滤波器;当Q=1时,称为Chebyshev滤波器;当Q>0.707时后,特性曲线将出现峰值,Q值越大,峰值越高

    LPF:假设待计算滤波器Q=0.7(读者可以根据实际情况取值,此处仅以0.7为例设计)、f0=35Hz。

    根据RC滤波器求解RC值:

    电容值一般取1uF以下,此处以1uF为例计算。

    7d773147370563028a82bfbea9a1f80c.png

    求得R=4.549kΩ,实际取值R=4.3 kΩ。

    根据值求解R1R2 ,当f=f0时,

    2caa59063449db9d7fb4a7fcf355f924.png

    则:

    7469c9420f162f80a2061f542a5196db.png

    解得:R1=25.06kΩ,R2=14.29kΩ

    实际取值:R1=24kΩ,R2=15kΩ(实际电阻值是离散数据,选取相近阻值即可)。

    HPF:由于同类型LPF和HPF具有对偶性,实际计算按照LPF计算,电路中替换RC位置即可。

    假设待计算滤波器Q=0.7(读者可以根据实际情况取值,此处仅以0.7为例设计)、。

    根据RC滤波器求解RC值:

    电容值一般取1uF以下,此处以1uF为例计算。

    952bf11c9efe07467db1d8839445f246.png

    求得R=10.615kΩ,实际取值R=10 kΩ。

    根据值求解R1R2 ,当f=f0时,

    4b88fef8a630006dd9b47455af6c159d.png

    则:

    be3e50916bfb2ba12c03d5490054cb74.png

    解得:R1=58.479kΩ,R2=33.333kΩ

    实际取值:R1=56kΩ,R2=33kΩ(实际电阻值是离散数据,选取相近阻值即可)。

    同理可以计算出Q=1

    LPF:R1=R2=18.19kΩ,实际取值R1=R2=18kΩ

    HPF:R1=R2=42.46 kΩ,R1=R2=43kΩ

    同理可以计算出Q=2.5

    LPF:R1=14.784kΩ,R2= 23.6548‬ kΩ,实际取值R1=15 kΩ、R2=24kΩ

    HPF:R1= 34.499 kΩ,R2= 55.198 kΩ,实际取值R1=33 kΩ、R2=56kΩ

    3.3、Matlab频谱相应仿真

    取Q=0.1~3,步长取0.2,绘制滤波器的波特图,其结果如下图所示,matlab绘图程序详见附录。

    2a92ef3ab266fa953065611bfeeb66a6.png

    图 14带通滤波器不同Q值下的波特图

    4、Multisim仿真

    4.1、搭建仿真电路图

    7c50d3edfee08483398cc23b7df6e4b1.png

    图 15仿真电路图

    4.2、仿真结果

    4.2.1、Q=0.7时

    波特图:

    176c70c477fec0a31706b0bccaa27840.png

    图 16 Q=0.7时幅频特性图

    2b2f80e42e1f1adfa47701fd240eb607.png

    图 17 Q=0.7时相频特性图

    各点波形输出:(注:紫色:LPF滤波后波形,蓝色:HPF滤波后波形,黄色:1.65V抬升后波形)

    f92012c9ff9280250218fa7236611083.png

    图 18仿真波形图

    4.2.2、Q=1时

    仿真图:

    5466548daf889856cdc0080af0f59488.png

    图 19仿真电路图

    波特图:

    01d9fc9f99a9b19397d141546ab3191d.png

    图 20 Q=1时幅频特性图

    e650a3f0aba20f33f11db6a2021fb3b9.png

    图 21 Q=1时相频特性图

    各点波形输出:(注:紫色:LPF滤波后波形,蓝色:HPF滤波后波形,黄色:1.65V抬升后波形)

    9690c9c8509ee3e45e5920758ac7e628.png

    图 22仿真波形图

    4.2.3、Q=2.5时

    仿真图:

    c5c637e59b738d10af499a1982f87bd6.png

    图 23仿真图

    波特图:(注意:此处F=50dB

    27f52b5038e5a18a0f0230e948d777ba.png

    图 24 Q=2.5幅频特性图

    ae3ac18c00a1b184d21bcbb55c767e70.png

    图 25 Q=2.5时相频特性图

    各点波形输出:((注:紫色:LPF滤波后波形,蓝色:HPF滤波后波形,黄色:1.65V抬升后波形)

    fcc5a1d4071d535ce3b4f6797bc2e1a0.png

    图 26仿真波形图

    从上面Q值的对比可以发现:Q 因子的值越低,滤波器的带宽越宽,因此 Q 因子越高,滤波器越窄,“选择性”越强。由于有源带通滤波器(二阶系统)的品质因数与滤波器响应在其中心谐振频率( fr ) 附近的“锐度”有关,因此它也可以被认为是“阻尼系数”。因为滤波器的阻尼越大,其响应越平坦,同样,滤波器的阻尼越小,其响应越敏锐。

    5、硬件设计

    此处使用Atium Designer软件设计原理图和PCB,该部分硬件源文件均开源,可以直接下载附件。

    5.1、原理图设计:

    由于LM358D不是轨到轨运放,用于1.65偏置电路时无法提供0~3.3V的动态范围,抬升电路部分先择LMV358。此处应当注意两款芯片的电压范围不同。从理论计算可知,修改输入端RC可以改变滤波器的截止频率,修改反馈端电阻会影响滤波器品质因数Q。该部分电路结构相同,仅需修改电路中电阻、电容参数,便可以实现不同的带通效果,另外修改高通和低通的截止频率还可以实现带阻。读者可以直接根据生产文件,打样、测试,在实际的测试中探索其中的奥妙。

    b66b338492cbc64ec26336ba177dc54e.png

    图 27硬件原理图

    5.2、PCB设计:

    PCB部分根据实际生产的需求制作了两种拼版文件:V-cut和邮票孔,此部分可以直接使用,读者也可以实际动手操作一遍,此处使用到高级粘贴功能,具体操作此处不再赘述没有兴趣的读者可以自行了解,另外在做V-cut拼版时需要注意各家板厂V-cut使用钻头的直径,实际拼板中需要根据V-cut钻头的直径预留两个相邻板间的间距,此处按照默认0.4mm设计。

    5.2.1、3D效果

    420ab27c6e97e7c849620c330353e2a3.png

    图 28PCBA渲染图

    5.2.2、

    abea6e962a7c45ded3dbeb2236396b59.png

    邮票孔拼版效果图:

    图 29邮票孔拼版图

    5.2.3、V-cut拼版效果图

    8bad7f71169ba7f2050250fb7522a5b9.png

    图 30V-Cut拼版图

    5.3、实际测试

    前一级AD620放大和滤波运放LM358耐压范围较高,测试时可以使用5V正负电源供电,后一级LMV358默认不与正5V电源相连,读者可以将P2与正5V相连,如果使用大于正负5V的电源供电,此处可以使用另一路5V电源单独供电。

    591d27167d5b7d6c854e5084731f6980.png

    图 31实物图

    5.3.1、测试结果

    示波器中蓝色为原始输入信号,第一级放大倍数G=20,黄色为滤波并偏置1.65V的信号。注意观察两个通道的刻度不同。

    f=12Hz时:

    c552ce0b07f7e3d0db76711372c7488e.png

    图 32 f=12Hz时的波形对比

    f=20Hz时

    adb57716a15c01fb21f17e5cb2a540fc.png

    图 33 f=20Hz时的波形对比

    f=60Hz时:

    097033941ab733d1e9bcb48e3180eb59.png

    图 34 f=60Hz时波形对比图

    注:此部分测试结果可以参见附件视频。

    至此整个论计算、设计、测试过程结束。

    附录

    Matlab 绘制bode图代码

    %有源二阶模拟带通滤波器

    %LPF 传递函数计算 f0=35Hz C = 1uF,R = R=4.549kΩ g1=k3/(s2+k1*s1+k2)

    c1 = 1e-6;

    r1 = 4549;

    %HPF 传递函数计算 f0=15Hz C = 1uF,R = R=4.549kΩ g2=k6*s2/(s2+k4*s1+k5)

    c2 = 1e-6;

    r2 = 10615;

    for q=0.1:0.2:3

    %LPF

    Avp1 = 3-(1/q);

    %R1 = 2*r1*Avp1/(Avp1-1);

    %R2 = 2*r1*Avp1;

    k1 = (3-Avp1)/(c1*r1);

    k2 = 1/(c1*c1*r1*r1);

    k3 = Avp1/(c1*c1*r1*r1);

    num1=[k3]; %传递函数分子

    den1=[1 k1 k2]; %传递函数分母式为:s2+k1s+k2

    G1=tf(num1,den1);

    %HPF

    Avp2 = 3-(1/q);

    %R1 = 2*r2*Avp2/(Avp2-1);

    %R2 = 2*r2*Avp2;

    k4 = (3-Avp2)/(c2*r2);

    k5 = 1/(c2*c2*r2*r2);

    k6 = Avp2;

    num2=[k6 0 0]; %传递函数分子,此处为s2需要特别注意

    den2=[1 k4 k5]; %传递函数分母格,式为:s2+k4s+k5

    G2=tf(num2,den2);

    p=bodeoptions;

    p.FreqUnits='Hz';

    p.Grid= 'on';

    [num,den] = series(num1,den1,num2,den2); %计算串联传递函数,串联传递函数需要相乘

    printsys(num,den) %显示串联后的总传递函数

    hold on;

    bode(num,den,p); %绘制波特图

    % hold on;

    % bode(G1,p);

    % hold on;

    % bode(G2,p);

    End

    legend('0.1','0.3','0.5','0.7','0.9','1.1','1.3','1.5','1.7','1.9','2.1','2.3','2.5','2.7','2.9');

    title('有源二阶模拟带通滤波器相频特性'); %标题

    测试视频:

    9ccba07049738bea3bd9ddabed33f1a5.png
    https://www.zhihu.com/video/1188012220288667648
    1211acbcc5b1474d9f2a8452cf6317d0.png
    https://www.zhihu.com/video/1188012458559549440

    454ca46bd7971cd78845defc1df4d5ae.png

    相关附件请到论坛下载:

    二阶有源带通滤波器设计 - dmBot开源硬件分享 - dmBot Techical Forum - Powered by dmBot!www.dmbot.cn
    展开全文
  • 看到一个带通滤波器设计如下,开始研究是如何设计的 代码: band_low = 0.3; band_high = 1.2; fs_origin = 25; hd_band = design(fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin),'...

    写在前面的话:

    由滤波器系数得到传输函数:

    使用matlab fdatool设计滤波器,得到幅频响应,得到滤波器系数,由系数如何得到滤波器的参数?

    我的方法是 使用:点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器或者在 simulink中设计滤波器,双击设计好的滤波器,可以参看其框图,根据框图可以将传输函数写出,即可得到滤波器的参数。

    看到一个带通滤波器的设计如下,开始研究是如何设计的

    带通滤波器设计matlab代码:

    band_low = 0.3;       
    band_high = 1.2;       
    fs_origin = 25; 
    hd_band = design(fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin),'butter'); %带通滤波器
    %fvtool(hd_band); % view
    measure(hd_band) %Measure the frequency response characteristics of the filter 
    %filtered = filter(hd_band,x);  % 滤波器的使用,输入数组x,输出数组filtered

    查看官网MathWorks,找到关于滤波器的设计design,带通滤波器的设计fdesign.bandpass

    The fdesign.bandpass function returns a bandpass filter design specification object that contains specifications for a filter such as passband frequency, stopband frequency, passband ripple, and filter order. Use the design function to design the filter from the filter design specifications object.

    本处只解析此处滤波器的设计参数,若查看更多,移至官网MathWorks

    • N:Filter order for FIR filters. Or both the numerator and denominator orders for IIR filters when Na and Nb are not provided. Specified using FilterOrder. 关于滤波其的阶数
    • F3dB1:Frequency of the 3 dB point below the passband value for the first cutoff, specified in normalized frequency units. Applies to IIR filters.
    • F3dB2:Frequency of the 3 dB point below the passband value for the second cutoff, specified in normalized frequency units. Applies to IIR filters.
    • Fs bandpassSpecs = fdesign.bandpass(___,Fs) provides the sample rate in Hz of the signal to be filtered. Fs must be specified as a scalar trailing the other numerical values provided. In this case, all frequencies in the specifications are in Hz as well. 

    上面这句话解释了传入采样频率的必要性。

    'N,F3dB1,F3dB2' butter

    以上参数的设置使用与IIR butter

    fdesign.bandpass('N,F3dB1,F3dB2',4,band_low,band_high,fs_origin)
    show:  
    bandpass (具有属性):
    
                   Response: 'Bandpass'
              Specification: 'N,F3dB1,F3dB2'
                Description: {3×1 cell}
        NormalizedFrequency: 0
                         Fs: 25
                FilterOrder: 4
                      F3dB1: 0.3000
                      F3dB2: 1.2000

    fvtool(hd_band)% 查看幅频特性

    measure(hd_band) %Measure the frequency response characteristics of the filter 

    Sample Rate             : 25 Hz       
    First Stopband Edge     : Unknown     
    First 6-dB Point        : 250.7041 mHz
    First 3-dB Point        : 300 mHz     
    First Passband Edge     : Unknown     
    Second Passband Edge    : Unknown     
    Second 3-dB Point       : 1.2 Hz      
    Second 6-dB Point       : 1.4315 Hz   
    Second Stopband Edge    : Unknown     
    First Stopband Atten.   : Unknown     
    Passband Ripple         : Unknown     
    Second Stopband Atten.  : Unknown     
    First Transition Width  : Unknown     
    Second Transition Width : Unknown  

    使用fdatool同样实现此滤波器的设计

    设计的滤波器通过File-Export导出到工作区;

    也可以在analysis中查看器信息,比如系数、幅频、相频特性。比如查看analysis中点击Filter Information中可以看到fdesign使用的内容:'N,F3dB1,F3dB2'

    完成了带通滤波器的设计,就在考虑如何转化为C语言代码,这里有个网站可以进行转化,设计滤波器转为C语言实现,但是结果并没有达到我想要的要求,我的目的是怎样将fdatool中设计的滤波器系数中得到其对应的传递函数H(Z),有了传递函数,就可以自己写C语言实现了

    在上面fdatool设计的滤波器中,两种方法查看设计的滤波器,任意一种都可以;

    1. 点击Filt-Export to simulink Model, simulink打开后,出现了简单的滤波器,
    2. 或者采用如下图操作,从左到右三个按键

       

    双击可以看到滤波器的内部结构,如图显示为两个二阶滤波器级联:

    放大其中一个滤波器如下

    简单作了标记如下

    并给出其对应的C语言实现,此代码无法直接运行只是提取了一部分带通滤波器实现部分

    /* IIR fourth-order filter coefficients */
    typedef struct 
    {
    	float(*a)[3];
    	float(*b)[3];
    	float* gain;
    } IIR_ORDER4_COEFF_T;
    
    /* Save the in-process' data of the second-order filter */
    typedef struct 
    {
    	float m1;
    	float m2;
    } FILTER_ORDER2_T;
    
    /*三轴信号处理前的滤波:四阶带通(0.3-1.2)Hz)滤波,由两个二阶滤波级联起来*/
    float a_raw[2][3] = {
    	{ 1.00, (float)-1.9175958145710057, (float)0.9246554650412394 },    //第一级二阶滤波,分母
    	{ 1.00, (float)-1.7227109782351659, (float)0.7854234338937474 }    //第二级二阶滤波,分母
    };//分母
    float b_raw[2][3] = {
    	{ 1.00, (float)0.00, (float)-1.00 },    //第一级二阶滤波,分子
    	{ 1.00, (float)0.00, (float)-1.00 }    //第二级二阶滤波,分子
    };//分子
    float gain_raw[2] = { (float)0.1048485643154691/*第一级增益*/, (float)0.1048485643154691/*第二级增益*/ };
    
    /******************************************************************************/
    /** Start, initialize the parameters
    * @param[in]
    *
    * @return
    *
    *//*
    * History        :
    * 1.Date         : 2020/8/28
    *   Author       : 
    *   Modification : Created function
    
    *******************************************************************************/
    void StartSwim(void) 
    {
    	/* signal filter parameter initialization */
    	IIR_Raw.a = a_raw;
    	IIR_Raw.b = b_raw;
    	IIR_Raw.gain = gain_raw;
    }
    
    /*
    x: input
    m1:保存中间滤波器数据
    m2:保存中间滤波器数据
    a:滤波器系数
    b:滤波器系数
    gain:增益,对于只支持定点小数运算的,需要把增益分配到每个二阶IIR滤波器的系数中,使得每次中间的结果都不溢出,即使其频率响应的最大值最接近0dB
    */
    float filterOrder2(float* x, float* m_1, float* m_2, float* a, float* b, float* gain){
    	float y, m;
    	//计算没有增益的滤波输出,存于y_
    	m = *x - a[1] * *m_1 - a[2] * *m_2;    //求当前m,同时作为求y_的中间步骤
    	y = m + b[1] * *m_1 + b[2] * *m_2;
    	//更新*m_1和*m_2
    	*m_2 = *m_1;
    	*m_1 = m;
    	//返回带增益的滤波输出
    	return y* *gain;
    }
    
    /******************************************************************************/
    /** filter: Fourth-order filter, direct type II
    * @param[in]
    * filter_state	:Store the middle state of the filter
    * @return
    *
    *//*
    * History        :
    * 1.Date         : 2020/8/28
    *   Author       : 
    *   Modification : Created function
    
    *******************************************************************************/
    float FilterOrder4(float data, FILTER_ORDER4_T* filter_state, IIR_ORDER4_COEFF_T* IIR_coeffs)
    {
    	float data_filtered;
    
    	filter_state->first_order2_out = filterOrder2(&data, &filter_state->first_order2.m1, &filter_state->first_order2.m2, IIR_coeffs->a[0], IIR_coeffs->b[0], IIR_coeffs->gain);  //第一级二阶滤波
    	data_filtered = filterOrder2(&filter_state->first_order2_out, &filter_state->second_order2.m1, &filter_state->second_order2.m2, IIR_coeffs->a[1], IIR_coeffs->b[1], &IIR_coeffs->gain[1]);  //第二级二阶滤波
    	
    	return data_filtered;
    }
    
    /******************************************************************************/
    /** Band-pass filtering for the norm data: 0.25-2Hz
    * @param[in] x:norm data
    *
    * @return filtered data
    *
    *//*
    * History        :
    * 1.Date         : 2020/8/28
    *   Author       : 
    *   Modification : Created function
    
    *******************************************************************************/
    float BandFilter(float x)
    {
    	float y = FilterOrder4(x, &xyz_filter, &IIR_vec);
    
    	return y;
    }

    关于fdatool设计的带通滤波器的系数使用

    使用Matlab的FDAtool工具可以很方便地设计IIR滤波器。使用File菜单中的export选项可以把滤波器的参数输出到Matlab的工作空间中。若滤波器为IIR型,则输出的变量名为G和SOS。它把高阶的IIR滤波器转换为一系列二阶IIR滤波器的级联。SOS为二阶IIR滤波器的系数(b,a),G为各级的增益系数,可用来调节各级通带的衰减。计算IIR滤波器的输出的时候,先将输入数据乘以G, 然后一一通过SOS中的每个IIR滤波器,就得到最终的结果了。

    SOS的每一行表示一级二阶IIR滤波器系[b0,b1,b2,a0,a1,a2],G的每个元素表示相应级的增益系数。也即将G乘上SOS的b0,b1,b2。得到一组新的滤波器系数SOS',可调用MATLAB滤波函数sosfilt对输入信号进行滤波。

    但是如果二阶IIR滤波器的程序只支持定点小数运算的话,那么就需要调整一下系数了。因为设计出来的G有时候很小(不知道会不会很大),这样一旦把输入数据乘以G后,就会使得二阶IIR滤波器的输入过小,造成很大的误差。我们需要把G分配到每个二阶IIR滤波器的系数中,使得每次得到的中间结果都刚好不会溢出。若以IIRi表示第i个二阶IIR滤波器的话,则我们需要保证IIR1, IIR1 * IIR2, IIR1 * IIR2 * IIR3, … 的频率响应都不超过0dB,*号表示级联。为了使得输出的精度最好,我们还需要让上面这些滤波器的频率响应中的最大值最接近0dB。

    级联型:将系统传递函数H(z)因式分解为多个二阶子系统,系统函数就可以表示为这些二阶子系统传递函数的乘积。实现时将每个二阶子系统用直接型实现,整个系统函数用二阶环节的级联实现。

    高阶IIR滤波器的实现是采用二阶滤波器级联的方式来实现的。默认情况下,Filter Coefficients把结果分成多个2阶Section显示,其中还有增益。增益的目的是为了保证计算的精度和系统的稳定性。

     

    简单介绍低通滤波器的使用,其函数参考fdesign官网

    如下

    简单设计了低通滤波

    %% 低通滤波
    function filtered = LowFilter(x)
    fs_origin=1;
    fc=0.03;
    N=4;
    hd_low = design(fdesign.lowpass('N,F3dB',N,fc, fs_origin),'butter');
    filtered = filter(hd_low,x); 
    end

    ..

     

    展开全文
  • 本文以工程师的角度,从介绍、特点、设计使用三方面出发,并结合代码介绍如何设计并应用FIR滤波器。同时本文也是个人的学习笔记,学习链接也放在了下面,如果不足,请多指导。介绍:What is FIR filter? 特点:Why...

    看了很多介绍设计FIR滤波器的,但鲜有告诉你如何应用的。本文以工程师的角度,从介绍、特点、设计使用三个方面出发,并结合代码介绍如何设计并应用FIR滤波器。同时本文也是个人的学习笔记,学习链接也放在了下面,如果不足,请多指导。

    1. 介绍:What is FIR filter?
    2. 特点:Why is FIR filter?
    3. 如何设计并使用:How to apply a designed FIR filter?

    一,介绍:What is FIR filter?

    线性时不变系统(LTI)冲激响应按照其是有限长还是无限长可分为FIR(Finite Impulse Response)有限长冲激响应系统以及无限长冲激响应IIR(Infinite Impulse Response)系统。

    关于有限长和无现长的理解,如下图的,该图的冲激响应有无限多个,所以就是无限长冲击响应系统;如果冲激响应是有限个,就是有限长冲击响应系统。

    01126150fee29057021663bb84ba0eb2.png

    二,特点:Why is FIR filter?

    1,传递函数:

    equation?tex=H%28Z%29%3D%5Csum_%7Bi%3D0%7D%5E%7BN-1%7Dh%28n%29Z%5E%7B-n%7D+%5C%5C

    2,差分方程

    equation?tex=y%5Bn%5D%3D%5Csum_%7Bi%3D0%7D%5E%7BN%7Dh_ix%5Bn-i%5D+%5C%5C

    其中N代表滤波器阶数,N越大,该滤波器的幅频响应就会越理想,过渡带就会越陡峭,但缺点是带来了更多的计算量。需要综合考量选择。

    FIR是全零点系统,也即在Z复平面上Z传递函数的极点全在Z=0处。
    FIR滤波器具有多种实现形式,比如直接型、二阶级联型、Lattice结构,都只是上述基本传递函数的不同数学表达形式,没有本质区别,只是在具体算法实现上各具特点。这里将二阶级联形式描述如下。

    357ef50544393455e9acf5f536b365d7.png
    二阶级联的意思是将上述传递函数分解为二阶多项式块连乘的形式,其数学表达如下:

    equation?tex=H%28Z%29%3D%5Cprod_%7Bk%3D0%7D%5EM%28b_%7B0k%7D%2Bb_%7B1k%7DZ%5E%7B-1%7D%2Bb_%7B2k%7DZ%5E%7B-2%7D%29+%5C%5C援引部分来自手把手教系列之FIR滤波器设计 @逸珺 ,如有侵权,立即删除。

    三,如何设计并使用:How to apply a designed FIR filter?

    设计方法

    FIR滤波器主要设计方法有窗函数法、“最优法”(切比雪夫逼近法、最小均方差)等。其中窗函数法使用最为广泛。“最优法”也比较常用。

    最优法”主要思路就是找到一组脉冲响应,让它的频域响应
    equation?tex=H%28e%5E%7Bj%5Comega%7D%29与期望的滤波器的频域响应
    equation?tex=H_d%28e%5E%7Bj%5Comega%7D%29尽可能的一致,主要通过两种方法来实现,一个是最小二乘法,另一个是切比雪夫法。

    关于最小二乘法(最小均方差法)和切比雪夫逼近法,以及窗函数方法设计原理和流程,已有大牛介绍的比较好,详见

    J Pan:如何快速设计一个FIR滤波器(二)zhuanlan.zhihu.com
    dc0c4308cc4b8a13399cf648bbb77148.png

    从工程师的角度看这篇文章,虽理论性特别强(有关于连续信号的介绍,个人建议不要太深究。),但是缺乏更贴切的实践和使用介绍。我当时读了几遍之后对实际应用还是有一些疑问。接下来我举个例子,重点从仿真和实际使用来介绍一下。所以这里就不得不提到matlab了。

    如何利用MATLAB设计FIR滤波器

    如何快速设计一个FIR滤波器(一) 也介绍到,可以通过一种简单设计FIR的方法——零极点法 设计FIR滤波器。

    这个方法非常简单,稍加培训,用笔和纸就能完成;当然缺点也很显而易见:零极点设计出的滤波器,只能给出大概的频率响应,对于一些要求较高的系统,显得无能为力。今天我们介绍一种更加严谨的方法。

    matlab可以很方便的设计各种滤波器。具体就是命令行输入‘filterDesigner’弹出设计框。如下图,图上方的几个小方框对应着幅频响应、相频响应等。左下方可选择滤波器类型和具体参数等。

    举个例子,实现采样频率2kHz,带宽为100Hz~300KHz带通滤波器。

    设计一个128阶的FIR带通滤波器,Fstop1为100Hz, Fpass1为110Hz,Fpass2为290Hz, Fstop2为300Hz,Wstop1 为30dB, Wstop2 为30dB。

    分析:从下图可以看出,FIR滤波器的相位是线性的。

    4ecb97a1d716cffcfee1c6f41ec29948.png

    然后可以拷贝其系数,根据差分方程,进行滤波。

    matlab code:

    Fs = 2000;                    % Sampling frequency
    T = 1/Fs;                     % Sample time
    L = Fs*1;                     % Length of signal
    t = (0:L-1)*T;                % Time vector
    % Sum of a 50 Hz , 5.8 , 500 , 120 Hz sinusoid
    y = 1*sin(2*pi*50*t) + sin(2*pi*120*t) +  sin(2*pi*5.8*t) +  sin(2*pi*500*t); 
    y_target = sin(2*pi*120*t)
    
    N             = 128;     % Order
    Fc1           = 100;    % First Cutoff Frequency
    Fc2           = 300;    % Second Cutoff Frequency
    flag          = 'scale';  % Sampling Flag
    SidelobeAtten = 100;      % Window Parameter
    % Create the window vector for the design algorithm.
    win = chebwin(N+1, SidelobeAtten);
    
    % Calculate the coefficients using the FIR1 function.
    b  = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag);
    Hd = dfilt.dffir(b);
    
    figure
    freqz(b)
    
    filteredSignal = filter(Hd.Numerator,1,y);
    % filteredSignal = filter(b,1,y);
    
    figure
    subplot(3,1,1)
    plot(t,y)
    title('Original Signal')
    ys = ylim;
     
    subplot(3,1,2)
    plot(t,filteredSignal)
    title('Target Bandpass Signal')
    xlabel('Time (s)'); ylim(ys)
    
    subplot(3,1,3)
    plot(t,y_target)
    title('Filtered BandPass Signal')
    xlabel('Time (s)'); ylim(ys)

    C code: 手把手教系列之FIR滤波器设计

    其实这部分,对工程师来说很关键啊。

    References:

    手把手教系列之FIR滤波器设计

    如何快速设计一个FIR滤波器(一)

    如何快速设计一个FIR滤波器(二)

    展开全文
  • MATLAB语言设计一个带通滤波器。给定抽样频率,通带起始频率,截止频率。阻带起始频率,截止频率。
  • 带通滤波器matlab程序设计

    千次阅读 2020-12-11 15:41:46
    最近初入信号处理,对带通滤波器的资料进行总结。 转载自: 如何在matlab用带通滤波器进行滤波? matlab中fdatool使用说明 ...自己编的一个带通滤波器的程序及解释 fs=500; % 采样率 n=length(data);

    最近初入信号处理,对带通滤波器的资料进行总结。
    转载自:

    1. 如何在matlab用带通滤波器进行滤波?

    2. matlab中fdatool使用说明

    3. Matlab fir滤波(conv)

    以上链接详细记录了带通滤波器的设计及matlab自带fdatool的使用步骤。

    自己编的一个带通滤波器的程序及解释

    fs=500;                                                 % 采样率
    n=length(data);                                         % 滤波数据长度
    t = 0:1/fs:(n-1)/fs;                                    % 横坐标刻度值
    lpass=100;
    hpass=200;                                              % 带通滤波的带宽
    filterorder =2;                                         % 滤波器阶数
    filtercutoff = [2*lpass/fs 2*hpass/fs];                 % 频率归一化 对应频率/nyquist频率,nyquist频率是采样率的一半 
    [f_b, f_a] = butter(filterorder,filtercutoff);          % 调用butter()函数返回巴特沃斯滤波器传递函数的零极点系数和增益
    sig= filtfilt(f_b,f_a,data);                            % 零相位数字滤波 通过x在正向和反向两个方向上处理输入数据来执行零相位数字滤波 。在向前过滤数据后,反转过滤后的序列,然后将其运回过滤器。
    noise=data-sig;                                         % 噪声为原始信号减去滤波后信号的剩余信号
    SNR=10*log((sig.^2)/(noise.^2));                        % 10lg(Ps/Pn),其中Ps和Pn分别代表信号和噪声的有效功率,也可以换算成电压幅值的比率关系:20Lg(Vs/Vn),Vs和Vn分别代表信号和噪声电压的“有效值”。用dB表示。
    

    有需要可以自行修改,不保证正确。

    展开全文
  • 在这种数字化解调器中需要设计一个合适的带通滤波器,以便尽可能地消除信号的旁瓣分量而不影响信号码元稳定区内的波形。本文介绍了上述带通滤波器的方案选择和基于Matlab的滤波器参数设计方法,以及仿真效果。关键词...
  • 在小平:如何快速设计应用一个FIR滤波器 中,我们讨论了如何设计一个FIR滤波器,接下来我们介绍IIR滤波器。和设计FIR滤波器一样,我们可以粗略的设计IIR滤波器(幅频响应不精确,设计简单),也可以设计具有精确的...
  • 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,...
  •  在H.Martinez et al撰写的文章(参考文献[1])中,描述了种具有可调品质因数、在谐振频率点具有恒定传输系数且采用三运放设计带通滤波器。这种滤波器的传输函数符合公式(1),其中K反比于品质因数Q...
  • 用SPTool设计一个数字带通FIR滤波器来抑制此宽带噪声,以增强所需要的2kHz正弦波。此带通滤波器是根据以下的指标要求进行设计的: (1). 此带通滤波器的截止频率约为1800Hz和2200Hz。 (2). 通带波纹约为1.5dB,阻带...
  • 这个电容实际上是一个高通滤波器,在某种意义上说,像这样的单电源运放电 路都有这样的电容。设计者必须确定这个电容的容量必须要比电路中的其他电容器的容量大 100倍以上。 这样才可以保证电路的幅频特性不会受到...
  • 带通滤波器——巴特沃斯滤波器为例matlab给出的代码如下:[n,Wn] = buttord(Wp,Ws,Rp,Rs)是不是显得很不人性化,即便是看了help中的英文解释,仍旧是对输入输出参数一知半解~那么我就用简单的语言来描述一下~首先...
  • 如何自己动手设计滤波器电路滤波器是电路最常涉及的模块之一,虽然现在有多种工具设计滤波器,...一阶有源滤波器是在运放和一个电阻和一个电容构成的。如图是一个一阶有源低通滤波器,电阻R1和电容C1组成的RC电路实...
  • FIR 带通滤波器设计

    万次阅读 2018-09-05 17:29:50
    %本文将针对一个含有 5Hz 、 15Hz 和 30Hz 的混和正弦波信号, 设计一个 FIR 带通滤波器, %给出利用 MATLAB 实现的三种方法: 程序设计法、 FDATool 设计法和 SPTool 设计法。 参 %数要求:采样频率 fs=100Hz ,...
  • 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范...
  • Matlab便是这样的一个软件,它集成了FDAtool(filter design & analysis tool)工具,这是Matlab信号处理工具箱里专用的滤波器设计分析工具。FDAtool可以设计几乎所有的常规滤波器,包括FIR 和IIR。它操作简单,...
  • 基于CCS的DSP的带通滤波器设计,网上低通的比较多,带通的比较少,上传个。里面有两个系数文件,一个是滤波器的,一个是信号的,这些系数用MATLAB产生。
  • 设计要求利用matlab设计一个线性相位FIR带通滤波器,并在FPGA上实现。1、滤波器指标:过渡带带宽分别为100~300HZ,500~700HZ,阻带允许误差为0.02,通带允许误差为0.01,采样频率为2000HZ,量化位数为12bit2、设计...
  • 优质解答% 用切比雪夫最佳一致逼近设计线性相位FIR带通滤波器;%信号为0.5hz, 0.9hz, 1.1hz和1.5hz的正统信号叠加组成%通带为[0.9,1.1]%频谱分辨率与信号实际长度N成正比clear all;f1=0.5;f2=0.9;f3=1.1;f4=1.5;t=0:...
  • matlab,产生一个宽带噪声,并设计N=100阶的带通滤波器。计算接收机输入端的信噪比,和通过滤波器以后的信号。文件中有输入信号、噪声信号、滤波器和输出信号的图以及其频谱图,并且附有源程序。
  • 带通滤波器——巴特沃斯滤波器为例matlab给出的代码如下:[n,Wn] = buttord(Wp,Ws,Rp,Rs)是不是显得很不人性化,即便是看了help中的英文解释,仍旧是对输入输出参数一知半解~那么我就用简单的语言来描述一下~首先...
  • 本资源内包含一个纯净的音乐信号、一个...针对余弦噪声设计巴特沃斯带通滤波器(butterworth bandpass filter),针对白噪声,用均值去噪的方法,最后程序输出一个去除各种噪声后纯净的音乐信号。(关键语句都附有注释)
  • Matlab一个强大的工具,可以用来做各种各样的仿真设计、数字信号处理和科学计算。 由于工作的需要,需要进行数字信号处理,首先就得做仿真,然后将仿真得到的结果再c++上面去实现。 1.先来看看fir滤波器是个啥...
  • 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,...
  • 设计一个f0=40K的带通滤波器 同相输入压控电压源二阶有源二阶带通滤波器 调信号发生器频率 示波器双踪比较看 中心频率怎么都不对 在35K左右 于是改用matlab仿真 结果为40K 改用频响分析 数据输出: "FREQ","Vout" ...
  • 利用MATLAB结合双线性变换法设计一个数字切比雪夫带通IIR滤波器课程设计,共19页!包括摘要、正文、个人总结。
  • 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,...
  • 假设需要处理一个20mV的正弦信号,该信号的频率范围是15~35Hz,经过处理后幅值不超过3.3V,且需要经过带通滤波器滤除杂波。2、滤波器定义滤波电路又称为滤波器,是一种选频电路,能够使特定频率范围的信号通过,...
  • 该工具可以将数字信号处理算法(DSP)系统表示成为一个高度抽象的模块,在不降低硬件性能的前提下,自动将系统映射为一个基于FPGA的硬件设计方案。即支持设计者在Matlab中完成算法设计,在Simulink软件中完成系统集成...

空空如也

空空如也

1 2 3 4 5 6
收藏数 106
精华内容 42
关键字:

matlab设计一个带通滤波器

matlab 订阅