IFR、IIR滤波器,一阶二阶滤波器(高通、低通、带通、带阻)

IIR滤波器,FIR滤波器

  FIR,全称Finite Impulse Response filter,有限脉冲响应滤波器。对于脉冲输入信号,其输出响应是有限的,经特定时间后,输出结果变为零。该类型滤波器的输出表达式,往往只对输入信号及其历史信号进行了包含,一般表达式: y ( k ) = c 0 x ( k ) + c 1 x ( k − 1 ) + c 2 x ( k − 2 ) + . . . + c n x ( k − n ) y(k)=c_0x(k) + c_1x(k-1)+c_2x(k-2)+...+c_nx(k-n) y(k)=c0x(k)+c1x(k1)+c2x(k2)+...+cnx(kn)

  IIR,全称Infinite Impulse Response filter,无限脉冲响应滤波器。对于脉冲输入信号,其输出响应是无限延续的。该类型滤波器的输出表达式,不仅对输入信号及其历史信号进行包含,还会对历史输出信号进行包含,一般表达式: y ( k ) = a 0 x ( k ) + a 1 x ( k − 1 ) + a 2 x ( k − 2 ) + . . . + b 1 y ( k − 1 ) + b 2 y ( k − 2 ) + . . . y(k)=a_0x(k) + a_1x(k-1)+a_2x(k-2)+...+b_1y(k-1)+b_2y(k-2)+... y(k)=a0x(k)+a1x(k1)+a2x(k2)+...+b1y(k1)+b2y(k2)+...

一阶滤波器、二阶滤波器传递函数

  以传递函数的形式,对一滤波器和二阶滤波器进行描述,如需进行离散化处理,请参考:传递函数离散化方法

类型传递函数
一阶低通滤波器 F ( s ) = ω 0 s + ω 0 F\left( s \right) = \frac{{{\omega _0}}}{{s + {\omega _0}}} F(s)=s+ω0ω0
一阶高通滤波器 F ( s ) = s s + ω 0 F\left( s \right) = \frac{s}{{s + {\omega _0}}} F(s)=s+ω0s
二阶低通滤波器 F ( s ) = ω 0 2 s 2 + 2 ξ ω 0 s + ω 0 2 F\left( s \right) = \frac{{{\omega _0}^2}}{{{s^2} + 2\xi {\omega _0}s + {\omega _0}^2}} F(s)=s2+2ξω0s+ω02ω02
二阶高通滤波器 F ( s ) = s 2 s 2 + 2 ξ ω 0 s + ω 0 2 F\left( s \right) = \frac{{{s^2}}}{{{s^2} + 2\xi {\omega _0}s + {\omega _0}^2}} F(s)=s2+2ξω0s+ω02s2
二阶带通滤波器 F ( s ) = 2 ξ ω 0 s s 2 + 2 ξ ω 0 s + ω 0 2 F\left( s \right) = \frac{{2\xi {\omega _0}s}}{{{s^2} + 2\xi {\omega _0}s + {\omega _0}^2}} F(s)=s2+2ξω0s+ω022ξω0s
二阶带阻滤波器 F ( s ) = s 2 + ω 0 2 s 2 + 2 ξ ω 0 s + ω 0 2 F\left( s \right) = \frac{{{s^2} + {\omega _0}^2}}{{{s^2} + 2\xi {\omega _0}s + {\omega _0}^2}} F(s)=s2+2ξω0s+ω02s2+ω02

一阶滤波器、二阶滤波器波特图

一阶滤波器波特图

  代码如下:

% 定义截止频率
omega_0 = 10;

% 创建一阶低通滤波器传递函数模型
H_lowpass = tf(omega_0, [1, omega_0]);

% 创建一阶高通滤波器传递函数模型
H_highpass = tf([1, 0], [1, omega_0]);

% 使用 bode 函数绘制频率响应曲线
figure;
bode(H_lowpass, 'b', H_highpass, 'r');
grid on;
legend('Lowpass', 'Highpass');
title('一阶滤波器');

  结果如下:
在这里插入图片描述

二阶滤波器波特图

  代码如下:

% 定义截止频率和阻尼比
omega_0 = 10;
xi = 0.707;

% 创建二阶低通滤波器传递函数模型
H_second_order_lowpass = tf(omega_0^2, [1, 2*xi*omega_0, omega_0^2]);

% 创建二阶高通滤波器传递函数模型
H_second_order_highpass = tf([1, 0, 0], [1, 2*xi*omega_0, omega_0^2]);

% 创建二阶带通滤波器传递函数模型
H_second_order_bandpass = tf([2*xi*omega_0, 0], [1, 2*xi*omega_0, omega_0^2]);

% 创建二阶带阻滤波器传递函数模型
H_second_order_bandstop = tf([1, 0, omega_0^2], [1, 2*xi*omega_0, omega_0^2]);

% 创建第一个图:对比二阶低通和高通滤波器的频率响应曲线
figure;
subplot(1,2,1);
bode(H_second_order_lowpass, 'b', H_second_order_highpass, 'r');
grid on;
legend('Lowpass', 'Highpass');
title('二阶滤波器:低通、高通');

% 创建第二个图:对比二阶带通和带阻滤波器的频率响应曲线
subplot(1,2,2);
bode(H_second_order_bandpass, 'g', H_second_order_bandstop, 'm');
grid on;
legend('Bandpass', 'Bandstop');
title('二阶滤波器:带通、带阻');

  结果如下:
在这里插入图片描述

巴特沃斯、切比雪夫、贝塞尔滤波器

  相比较于理想滤波器,上述一阶、二阶滤波器足以满足大多数应用需求。如对滤波器特性有更高的需求,包括幅频特性或相频特性,可考虑理想滤波器的其他逼近,如巴特沃斯滤波器贝塞尔滤波器

在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的可以在CCS运行的c程序,实现了一个3阶FIR以及3阶IIR滤波器对信号的处理,并比较了它们的性能: ``` #include "DSP28x_Project.h" #include "DSP2803x_Adc.h" #include "DSP2803x_GlobalPrototypes.h" #include "DSP2803x_CpuTimers.h" #include "DSP2803x_XIntrupt.h" #include "DSP2803x_SysCtrl.h" #include "DSP2803x_DevEmu.h" #include "DSP2803x_EPwm_defines.h" #include "math.h" #define SAMPLES 1024 #define PI 3.1415926 interrupt void TimerISR(void); Uint16 adc_sample; Uint16 adc_buffer[SAMPLES]; float fir_filter[3] = {0.25, 0.5, 0.25}; float iir_filter[3] = {0.25, 0.5, 0.25}; float iir_buffer[3] = {0, 0, 0}; float input_buffer[SAMPLES]; float fir_output[SAMPLES]; float iir_output[SAMPLES]; void main(void) { InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.TINT0 = &TimerISR; EDIS; InitCpuTimers(); ConfigCpuTimer(&CpuTimer0, 150, 1000000); IER |= M_INT1; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; EINT; ERTM; while(1) { // Do nothing } } interrupt void TimerISR(void) { static Uint16 sample_count = 0; adc_sample = AdcResult.ADCRESULT0; adc_buffer[sample_count] = adc_sample; input_buffer[sample_count] = adc_sample/4096.0; fir_output[sample_count] = 0; iir_output[sample_count] = 0; for(int i = 0; i < 3; i++) { if(sample_count >= i) { fir_output[sample_count] += input_buffer[sample_count-i]*fir_filter[i]; iir_output[sample_count] += iir_buffer[i]*iir_filter[i]; } } for(int i = 2; i >= 1; i--) { iir_buffer[i] = iir_buffer[i-1]; } iir_buffer[0] = fir_output[sample_count]; sample_count++; if(sample_count == SAMPLES) { sample_count = 0; // Plot time domain waveform of input signal for(int i = 0; i < SAMPLES; i++) { printf("%f,", input_buffer[i]); } printf("\n"); // Plot frequency domain spectrum of input signal float input_spectrum[SAMPLES]; for(int i = 0; i < SAMPLES; i++) { input_spectrum[i] = 20*log10f(fabsf(input_buffer[i])); } for(int i = 0; i < SAMPLES/2; i++) { printf("%f,", input_spectrum[i]); } printf("\n"); // Plot time domain waveform of FIR output for(int i = 0; i < SAMPLES; i++) { printf("%f,", fir_output[i]); } printf("\n"); // Plot frequency domain spectrum of FIR output float fir_spectrum[SAMPLES]; for(int i = 0; i < SAMPLES; i++) { fir_spectrum[i] = 20*log10f(fabsf(fir_output[i])); } for(int i = 0; i < SAMPLES/2; i++) { printf("%f,", fir_spectrum[i]); } printf("\n"); // Plot time domain waveform of IIR output for(int i = 0; i < SAMPLES; i++) { printf("%f,", iir_output[i]); } printf("\n"); // Plot frequency domain spectrum of IIR output float iir_spectrum[SAMPLES]; for(int i = 0; i < SAMPLES; i++) { iir_spectrum[i] = 20*log10f(fabsf(iir_output[i])); } for(int i = 0; i < SAMPLES/2; i++) { printf("%f,", iir_spectrum[i]); } printf("\n"); } PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } ``` 在主函数中,我们初始化了系统控制器、定时器、ADC等硬件,并通过定时器中断来获取采样数据。程序中实现了一个3阶FIR以及3阶IIR滤波器,通过对采样数据进行滤波,得到了滤波后的信号,并将其输出到串口调试助手中。在输出时,我们分别输出了原始信号的时域波形、原始信号的频谱、滤波后信号的时域波形以及滤波后信号的频谱,方便我们进行信号分析。 在CCS中,我们可以通过串口调试助手或者Scope窗口来查看输出的信号波形。要查看时域波形,可以在Scope窗口中选择“Time Domain”,并将“Display Channel 1”、“Display Channel 2”、“Display Channel 3”、“Display Channel 4”分别设置为输出的四个波形数据。要查看频谱,可以在Scope窗口中选择“Frequency Domain”,并将相应的频谱数据设置为输出的数据。此外,CCS还提供了一些其他的窗口和工具,例如FFT窗口、Spectrum Analyzer窗口等,可以更方便地进行信号分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值