陷波器的离散化及仿真验证

这篇具有很好参考价值的文章主要介绍了陷波器的离散化及仿真验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、陷波器在连续域的传递函数

1、最基本的陷波器传函

matlab陷波器传递函数,硬件工程                             (1)

其中,wo​是所谓“中心频率”,也就是你想要“陷掉”的频率。而 ζ 则是“陷阱”的宽度。

根据公式可以发现,当输入信号频率很小(s=0)或者很大( s=+∞)的时候,上面式子的值是1;当输入信号频率刚好等于 s=jωo的时候,分子是0,所以增益变成0,那这个频率的信号当然就全都被衰减掉了。

matlab陷波器传递函数,硬件工程

 由上图可见,ζ越大,则弦波带宽越宽,但弦波频率处的衰减越小。

2、三参数陷波器传函

matlab陷波器传递函数,硬件工程                     (2)

其中,ωo是陷波频率(即凹陷的中心频率),ζ1和ζ2是陷波系数

陷波滤波器重点关注的参数一般有三个:

(1)陷波频率(ωo rad/s可转换Hz)

(2)陷波深度(depth为衰减倍数)

        例如对于100Hz频率处的衰减深度是100,那经过该滤波器后,幅值衰减100倍。

(3)陷波宽度(△f单位Hz)

        即中心频率两侧,幅值衰减-3dB时,对应的两个频率的差值。

 ζ1和ζ2与陷波深度depth和陷波宽度△f(Hz)的关系表示如下:

matlab陷波器传递函数,硬件工程

 

二、陷波器传函在MATLAB中的表达及其离散化

1、以最基本的陷波器传函为例

a、MATLAB中编写如下m文件:

syms w0  s Ts z zeta                   % 定义符号变量
G1 =(s^2+w0^2)/(s^2+2*w0*zeta*s+w0^2)  %传递函数
sys_s2c = 2*(z-1)/Ts/(z+1);
G2 = subs(G1,s,sys_s2c)                %离散化  tustin变换
G3 = collect(G2,z)                     % 将表达式G2中的以z为变量合并相同次幂;

得到连续域和Z域的传递函数如下:

G1 =(s^2 + w0^2)/(s^2 + 2*zeta*s*w0 + w0^2)


G2 =(w0^2 + (2*z - 2)^2/(Ts^2*(z + 1)^2))/(w0^2 + (2*z - 2)^2/(Ts^2*(z + 1)^2) + (2*w0*zeta*(2*z - 2))/(Ts*(z + 1)))
 
G3 =((Ts^2*w0^2 + 4)*z^2 + (2*Ts^2*w0^2 - 8)*z + Ts^2*w0^2 + 4)/((Ts^2*w0^2 + 4*zeta*Ts*w0 + 4)*z^2 + (2*Ts^2*w0^2 - 8)*z + Ts^2*w0^2 - 4*zeta*Ts*w0 + 4)

根据离散化的方法:

matlab陷波器传递函数,硬件工程

分子分母同时除以A0,得到差分方程系数 

matlab陷波器传递函数,硬件工程

 差分方程为:

y(k) = b0*x(k) + b1*x(k-1) +b2*x(k-2) - a1*y(k-1) - a2*y(k-2);


B0 = Ts^2*w0^2 + 4;
B1 = 2*Ts^2*w0^2 - 8;
B2 = B0;                                                                                                        (3)
A0 = Ts^2*w0^2 + 4*zeta*Ts*w0 + 4;
A1 = B1;
A2 = Ts^2*w0^2 - 4*zeta*Ts*w0 + 4;

 可得差分方程系数
a0 = 1
b0 = B0/A0
b1 = B1/A0                                                                                                     (4)
b2 = B2/A0
a1 = A1/A0
a2 = A2/A0

b、代入实际参数,求得差分方程系数

f0 = 100;       %目标频率
w0 = 2*pi*f0;
Ts = 10e-6;     %离散化周期
zeta = 0.5;     %带宽

% Control object funciton 
gxnum2 = [1 0 w0^2];           % 传函分子
gxden3 = [1 2*w0*zeta w0^2];   % 传函分母
sys2 = tf(gxnum2, gxden3)      % 传函
zpk(sys2, 's');                % 将传函用零极点格式表示
dsys2 = c2d(sys2, Ts, 'tustin')   % s到z,即,连续到离散域的变换
zpk(dsys2, 'z');               % 将传函用零极点格式表示
[num2, den2] = tfdata(dsys2, 'v'); % 提取传递函数分子、分母的z次幂的系数,并保存到数组

得到传递函数如下:

matlab陷波器传递函数,硬件工程

 需要注意的是,在上图Z域传递函数dsys2的各项系数是经四舍五入的,如果直接用这些系数到Simulink或编写程序进行仿真,得到的结果是错误的!!!需要使用更加精确的系数。这些系数可以将式3和式4代入MATLAB中直接求解得到。

b0 =   0.996868276853708                         b1 =  -1.993697199313698

b2 =   0.996868276853708                         a1 =  -1.993697199313698

a2 =   0.993736553707416

2、以三参数陷波器为例

三、仿真验证

1、使用经四舍五入的系数仿真        

matlab陷波器传递函数,硬件工程

 结果错误

matlab陷波器传递函数,硬件工程

 2、使用正确的系数

matlab陷波器传递函数,硬件工程

 结果正确:

matlab陷波器传递函数,硬件工程

 四、C程序验证

1、方式一

直接将差分方程用代码呈现:

double ADValue;

//Notching Filter Coefficient 
#define Notching_filter_100Hz_a0      1
#define Notching_filter_100Hz_a1      -1.998704711158930
#define Notching_filter_100Hz_a2      0.998744164397945
#define Notching_filter_100Hz_b0      0.999372082198973
#define Notching_filter_100Hz_b1      -1.998704711158930
#define Notching_filter_100Hz_b2      0.999372082198973

// Control law 2p2z data define
typedef struct IIR_2OR_DATA_TAG{
    double coeff_a0;
    double coeff_a1;
    double coeff_a2;
    double coeff_b0;
    double coeff_b1;
    double coeff_b2;

    double filter_out;
    double filter_y1;
    double filter_y2;
    double filter_u1;
    double filter_u2;    
} IIR_2OR_DATA_DEF;

IIR_2OR_DATA_DEF notching_data = {
    Notching_filter_100Hz_a0,
    Notching_filter_100Hz_a1,       
    Notching_filter_100Hz_a2,       
    Notching_filter_100Hz_b0,       
    Notching_filter_100Hz_b1,        
    Notching_filter_100Hz_b2,  
    0, 0, 0, 0 ,0
};

double iir_2or_func(IIR_2OR_DATA_DEF *filter_date, double target)
{
     //
     //y(out) = b0*x(k) + b1*x(k-1) +b2*x(k-2) - a1*y(k-1) - a2*y(k-2);
     //
    filter_date->filter_out = (filter_date->coeff_b0 * (target)) \
                            + (filter_date->coeff_b1 * filter_date->filter_u1) \
                            + (filter_date->coeff_b2 * filter_date->filter_u2) \
                            - (filter_date->coeff_a1 * filter_date->filter_y1) \
                            - (filter_date->coeff_a2 * filter_date->filter_y2);

    //
    // Update last data
    //
    filter_date->filter_y2 = filter_date->filter_y1;
    filter_date->filter_y1 = filter_date->filter_out;
    filter_date->filter_u2 = filter_date->filter_u1;
    filter_date->filter_u1 = target;

    //
    // Return Value
    //
    return(filter_date->filter_out);
}

得到结果正确:

matlab陷波器传递函数,硬件工程

 2、方式二

参考文献3中的方法,增加一个中间变量w,来实现。

double ADValue;

//Notching Filter Coefficient 

#define Notching_filter_100Hz_GAIN      1
#define Notching_filter_100Hz_A1      -1.998704711158930
#define Notching_filter_100Hz_A2      0.998744164397945
#define Notching_filter_100Hz_B0      0.999372082198973
#define Notching_filter_100Hz_B1      -1.998704711158930
#define Notching_filter_100Hz_B2      0.999372082198973


// Control law 2p2z data define
typedef struct IIR_2OR_DATA_TAG{
    double coeff_GAIN;
    double coeff_B0;
    double coeff_B1;
    double coeff_B2;
    double coeff_A1;
    double coeff_A2;

    double filter_out;
    double filter_W0;
    double filter_W1;
    double filter_W2;
} IIR_2OR_DATA_DEF;

IIR_2OR_DATA_DEF notching_data = {
    Notching_filter_100Hz_GAIN,
    Notching_filter_100Hz_B0,       
    Notching_filter_100Hz_B1,       
    Notching_filter_100Hz_B2,       
    Notching_filter_100Hz_A1,        
    Notching_filter_100Hz_A2,  
    0, 0, 0, 0 
};

double iir_2or_func(IIR_2OR_DATA_DEF *filter_date, double target)
{
     //
     // w0 = x(0) - A1 * W1 - A2 * W2
     //
    filter_date->filter_W0 = (target) - filter_date->coeff_A1 * filter_date->filter_W1 \
                           - filter_date->coeff_A2 * filter_date->filter_W2;

    //
    // Y(0) = Gain * (B0 * W0 + B1 * W1 + B2 * W2)
    //
    filter_date->filter_out = filter_date->coeff_GAIN * ( filter_date->coeff_B0 * filter_date->filter_W0 \
                            + filter_date->coeff_B1 * filter_date->filter_W1 \
                            + filter_date->coeff_B2 * filter_date->filter_W2 );

    //
    // Update last data
    //
    filter_date->filter_W2 = filter_date->filter_W1;
    filter_date->filter_W1 = filter_date->filter_W0;

    //
    // Return Value
    //
    return(filter_date->filter_out);
}

仿真结果:

        与方法一完全一样。

参考文献:

1、Simulink 窄带陷波滤波器(Notch filter)仿真到代码生成

2、温故知新(五)——三参数陷波滤波器离散化推导及MATLAB实现

3、陷波器及其算法(基于C语言)

PLECS仿真:notch_filter.plecs文章来源地址https://www.toymoban.com/news/detail-648234.html

到了这里,关于陷波器的离散化及仿真验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++基础算法离散化及区间合并篇

    📟作者主页:慢热的陕西人 🌴专栏链接:C++算法 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要讲解了双指针,位运算,离散化以及区间合并。 是一种 利用单调规律 将二重循环的时间复杂度降为O(N)的算法; 例如:剑指 Offer 48. 最长不含重复字符的子字符串 - 力扣

    2024年02月16日
    浏览(29)
  • 非线性质量弹簧阻尼器的神经网络仿真研究(Matlab代码&Simulink仿真实现)

      目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、Simulink仿真实现 非线性质量弹簧阻尼器(Nonlinear Mass-Spring-Damper,NMSD)是一种常见的振动控制装置,广泛应用于工程结构的减震和振动控制中。为了进行NMSD的神经网络仿真研究,以下步骤进行: 1. 数据收集:收集

    2024年02月16日
    浏览(35)
  • 多相滤波器MATLAB仿真---抽取&插值

    多相滤波器MATLAB仿真---抽取插值 目录 前言 一、什么是多相滤波器? 二、抽取 1.不考虑滤波器延时下的抽取 2.考虑滤波器延时下的抽取 三、插值 参考文献 总结    语音信号多相滤波器是我上学期末做的一个课设,过了许久,在此仅仅简单记录一下,以特定的D值和I值展示一

    2024年02月01日
    浏览(52)
  • 【Python 算法】信号处理通过陷波滤波器准确去除工频干扰

    对于一个信号来说通常汇入工频噪声往往是因为交流电产生的电泳,影响了我们信号采集导致信号上存在工频干扰。 那么matlab去除工频干扰可以通过陷波滤波器实现。 在python中通常使用scipy.signal实现信号的处理。 Scipy的信号处理模块(scipy.signal)来创建自定义的陷波滤波器

    2024年02月08日
    浏览(48)
  • CIC滤波器的matlab仿真与实现

    在数字信号处理中,由于后级硬件如FPGA的处理速度无法跟上前级ADC的采样速度,因此需要对ADC的采样数据进行降速处理,也就是对采样数据进行 抽取 ,简单的抽取描述就是对其中连续几个点取一个点进行处理。 由抽取理论知识可以知道,抽取相当于对时域做压缩,相应的就

    2024年02月09日
    浏览(32)
  • 滤波器之matlab与vivado的联合仿真

    一、目录     1、matlab产生滤波器     2、matlab进行仿真     3、搭建vivado测试电路     4、vivado仿真 二、matlab产生滤波器     本文采用FIR低通滤波器,在命令行输入fdatool进入滤波器配置页面,如下配置                   导出滤波器函数              设置名字为filter

    2024年02月09日
    浏览(50)
  • MATLAB Simulink PID仿真图像分析(单双环、连续与离散时间)

    1、概述 我们以电赛题板球控制系统为例,对多种PID系统的仿真结果图像进行分析,分析PID相关结构和参数对于仿真图像的影响。 基本控制思路是:PID计算出给小球的加速度,通过舵机改变小球所在平面的角度,从而赋予小球相应的加速度,改变小球的速度,从而达到间接控

    2024年02月08日
    浏览(49)
  • 信号处理之FIR数字滤波器(Matlab仿真)

            数字滤波器的作用是滤除不感兴趣的信号,留下想要的信号。数字滤波器可分为无限脉冲响应(IIR)数字滤波器、有限脉冲响应(FIR)数字滤波器两种,两者各有优缺点,其中FIR数字滤波器因其具有良好的线性相位特性受到广泛应用,线性相位是指信号中各频率成分的相对

    2024年02月03日
    浏览(49)
  • 基于正交滤波器组的语音DPCM编解码算法matlab仿真

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程           matlab2022a        在语音信号处理中,一种常见的编解码技术是差分脉冲编码调制(DPCM)。DPCM是一种无损或有损压缩技术,通过利用信号中的冗余性来减少数据传

    2024年02月15日
    浏览(47)
  • 用MATLAB/Simulink对实验/仿真示波器保存的数据进行THD分析、MATLAB自定义横纵坐标轴绘图

    最近年底和师兄交流了数据分析、波形处理问题。一个是将示波器导出的csv数据放到MATLAB中进行THD分析,另一个是自定义横纵坐标轴进行绘图,就这两个问题记录一下。 不需要背代码,简单、易于理解,使用过程中截个图就行了。 1、导入数据至MATLAB,修改变量名和数据类型

    2024年01月22日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包