陷波器的差分方程

            <div id="content_views" class="htmledit_views">
                <p id="main-toc"><strong>目录</strong></p> 

窄带陷波滤波器(Notch filter)原理

设计一个Notch filter

生成代码

离散传递函数生成代码配置

差分方程生成代码

方程推导

构建差分方程模型

总结


窄带陷波滤波器(Notch filter)原理

陷波滤波器指的是可以将某一频率迅速衰减的滤波器,直接上效果图,如下图所示在常数100的信号上叠加了一个幅值为10的100Hz的频率,通过Notch filter后就得到了稳定的信号100,相当于抑制了振荡。可以用来抑制系统的共振点或者消除周期性的振荡等。

蓝色滤波前的信号,黄色滤波后的信号

设计一个Notch filter

传递函数如下:

 

 传递函数的伯德图:

从伯德图可以看出在某一个频率点会衰减,我们需要根据振荡的频率去调整w0=2*pi*f  (这里f是振荡频率),达到过滤掉振荡的效果。Q的值影响的是稳定的速度。

Q=1.9的伯德图和仿真效果

Q= 0.9的伯德图和仿真效果(衰减变小): 

 

 

生成代码

前面是s域的仿真,要能生成代码在硬件里面运行,需要把s域转成z域。这里生成代码的方式有以下两种,一种直接用离散传递函数,一种把离散传递函数转成差分方程。经对比,离散域传递函数会涉及到除法计算,有些单片机执行效率可能不高,而差分方法只有乘加,不涉及除法,计算效率会更高

离散传递函数生成代码配置

通过.m脚本实现s的传递函数转z. 15e-006是采样频率。

G_z = c2d(G_s,15e-006,'tustin');

这里有个小坑,Matlab的命令窗口只显示小数点后4位,可能会因为数据的精度影响到滤波效果,还需要对Matlab进行数据小数位数的设置,设置如下:

设置好后一般的除法可以显示到小数位后15位,但是传递函数形式的数据还是只显示4位。因此用如下指令取到传递函数的分子和分母的系数。
G_z_Numerator= G_z.Numerator{1};
G_z_Denominator=G_z.Denominator{1};

 display(G_z_Numerator);
display(G_z_Denominator);

 这样就得到了离散传递函数的参数,我们把得到的分子和分母的系数放到模型中仿真

差分方程生成代码

方程推导

差分方程只需要把离散传递函数转一下就好了,转的步骤如下:

 传递函数转差分方程步骤:

1. 改写成如下形式

Y(z)X(z)=0.9948z21.989z+0.9948z21.989z+0.9896Y(z)X(z)=0.9948z2−1.989z+0.9948z2−1.989z+0.9896

构建差分方程模型

通过Simulink构建方程模型。

 离散传递函数和差分方程仿真效果一样(这里Q值有些不同)

总结

总结下学习心得,通过对Notch filter的学习

1.了解Notch filter的工程意义应用场合和参数调试

2. 实际工程利用Matlab如何把s传递函数转为z传递函数再转成差分方程,方便生成代码

参考模型:

NotchFilter陷波滤波器仿真-快应用文档类资源-CSDN下载

以下是一个用C语言编写的50Hz陷波器程序的示例代码: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265 #define SAMPLE_RATE 1000 // 采样率为1000Hz int main() { double f = 50; // 陷波器中心频率为50Hz double w = 2 * PI * f / SAMPLE_RATE; double Q = 1 / sqrt(2); // 陷波器品质因数为1/根号2 double b0 = 1 - Q * w; double b1 = -2 * cos(w); double b2 = 1 + Q * w; double a0 = b2; double a1 = b1; double a2 = b0; double x[3] = {0}; // 输入信号和中间变量 double y[3] = {0}; double input_signal[1000] = {0}; // 输入信号为1000个采样点的正弦波 for (int i = 0; i < 1000; i++) { input_signal[i] = sin(2 * PI * f * i / SAMPLE_RATE); } double output_signal[1000] = {0}; // 输出信号 for (int i = 0; i < 1000; i++) { x[2] = x[1]; x[1] = x[0]; x[0] = input_signal[i]; y[2] = y[1]; y[1] = y[0]; y[0] = (b0 * x[0] + b1 * x[1] + b2 * x[2] - a1 * y[1] - a2 * y[2]) / a0; output_signal[i] = y[0]; } // 输出前10个采样点的值 for (int i = 0; i < 10; i++) { printf("%f\n", output_signal[i]); } return 0; } ``` 该程序使用了二阶IIR滤波器的差分方程实现了一个50Hz的陷波器。程序中的陷波器品质因数为1/根号2,中心频率为50Hz,采样率为1000Hz。输入信号为一个1000个采样点的正弦波,输出为经过陷波器处理后的信号。 需要注意的是,该程序中没有对滤波器的性能进行优化,仅作为一个示例程序供参考。实际应用中,需要根据具体需求对滤波器进行设计和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值