IIR滤波器的结构比较(Direct I and Direct II Form)

在 IIR 滤波器的设计和实现中,直接 I 型和直接 II 型结构的主要区别在于计算顺序存储延迟项的方式。

直接I型结构

特点:
  1. 级联形式:直接I型结构的传递函数可以表示为两个级联部分:一个由分子系数组成的部分和一个由分母系数组成的部分。
  2. 计算顺序:输入信号首先通过分子多项式(零点多项式),然后通过分母多项式(极点多项式)。(本质上是同时计算)
  3. 存储需求:需要存储所有的延迟变量
结构:

H ( z ) = b 0 + b 1 z − 1 + ⋯ + b M z − M 1 + a 1 z − 1 + ⋯ + a N z − N H(z) = \frac{b_0 + b_1 z^{-1} + \cdots + b_M z^{-M}}{1 + a_1 z^{-1} + \cdots + a_N z^{-N}} H(z)=1+a1z1++aNzNb0+b1z1++bMzM
输出 (y[n]) 可以通过以下公式计算:
y [ n ] = b 0 x [ n ] + b 1 x [ n − 1 ] + ⋯ + b M x [ n − M ] − a 1 y [ n − 1 ] − ⋯ − a N y [ n − N ] y[n] = b_0 x[n] + b_1 x[n-1] + \cdots + b_M x[n-M] - a_1 y[n-1] - \cdots - a_N y[n-N] y[n]=b0x[n]+b1x[n1]++bMx[nM]a1y[n1]aNy[nN]
该结构中,直接实现了分子和分母多项式的差分方程。

优点:
  • 实现简单:实现结构直接,容易理解和设计。
  • 设计过程直观:适合初学者和简单滤波器设计。
缺点:
  1. 数值稳定性差:直接I型结构在一些情况下可能会有数值稳定性问题,特别是当滤波器阶数较高时。

    1. 极点与零点的分布
      在直接I型结构中,输入信号首先通过分子多项式,然后通过分母多项式。这种结构方式使得
      滤波器的极点和零点在一个计算过程中紧密地耦合在一起。如果滤波器的极点靠近单位圆,滤
      波器的输出可能会变得不稳定,因为任何数值误差都会被极点放大,导致系统不稳定。

    2. 数值误差的放大
      直接I型结构中的反馈路径容易引入并放大数值误差。特别是在高阶滤波器中,滤波器的系数
      可能有较大的范围差异,这会使得数值误差在计算过程中不断积累和放大,导致数值不稳定。
      这个问题在有限精度(例如浮点运算)的计算机系统中尤为明显。

    3. 系数量化误差
      直接I型结构中,滤波器的分子和分母多项式的系数直接参与计算,任何系数的量化误差都会对
      滤波器的频率响应和稳定性产生影响。高阶滤波器的系数范围较广,量化误差可能会导致显著
      的数值不稳定。

    4. 递归计算的累积误差
      直接I型结构的反馈部分(分母多项式部分)在计算时是递归的,这意味着当前输出不仅依赖于
      当前输入,还依赖于前几次的输出。因此,任何微小的误差都会在后续的计算中累积,导致数
      值不稳定。这种累积效应在高阶滤波器中尤为明显。

    5. 直接II型结构的优势
      相比之下,直接II型结构通过状态变量表示,将滤波器的分子和分母多项式的计算分开处理,
      减少了直接耦合的复杂度。直接II型结构通过共享的延迟单元减少了存储需求,并且在计算
      时,分子和分母的系数误差不会互相放大。这使得直接II型结构在数值稳定性方面通常优于直
      接I型结构。

    6. 总结
      直接I型结构数值稳定性差的原因主要在于极点与零点耦合导致的数值误差放大、递归计算的累
      积误差以及高阶滤波器系数范围较大导致的量化误差。而直接II型结构通过将分子和分母多项
      式计算分离、减少反馈路径上的误差放大,通常具有更好的数值稳定性。

  2. 存储开销大:由于需要存储全部的延迟单元,因为它需要存储输入和输出的延迟项,因此存储开销较大。

    1. 对于一个三阶 IIR 滤波器(N=3),需要存储 3 个输入延迟项:x[n-1], x[n-2], x[n-3] 和 3个输出延迟项
      y[n-1], y[n-2], y[n-3],总共 6 个状态变量

直接II型结构

特点:
  • 级联形式:直接II型结构的传递函数也是由两个级联部分组成,但它们是分离的部分。

  • 计算顺序:输入信号通过分母(极点)多项式,然后通过分子(零点)多项式。

  • 存储需求:存储需求减少,因为它只需要存储中间变量的延迟项。

    对于一个三阶 IIR 滤波器(N=3),需要存储 3 个延迟项 w[n-1], w[n-2], w[n-3],总共 3 个
    状态变量。

结构:

直接 II 型结构将传递函数分解为两个部分:分子部分和分母部分,并使用一个共享的延迟链。这种方式通过将滤波器的实现分成两步来减少存储需求。

  1. 计算中间变量 (w[n]):
    w [ n ] = x [ n ] − a 1 w [ n − 1 ] − a 2 w [ n − 2 ] − a 3 w [ n − 3 ] w[n] = x[n] - a_1 w[n-1] - a_2 w[n-2] - a_3 w[n-3] w[n]=x[n]a1w[n1]a2w[n2]a3w[n3]
  2. 计算最终输出 (y[n]):
    y [ n ] = b 0 w [ n ] + b 1 w [ n − 1 ] + b 2 w [ n − 2 ] + b 3 w [ n − 3 ] y[n] = b_0 w[n] + b_1 w[n-1] + b_2 w[n-2] + b_3 w[n-3] y[n]=b0w[n]+b1w[n1]+b2w[n2]+b3w[n3]

这种结构中,输入信号和输出信号分别通过两个部分进行处理。

优点:
  • 存储需求低:因为可以通过共享的延迟单元来实现,减少了存储需求。
  • 数值稳定性好:通常比直接I型结构更稳定,先计算极点多项式,再零点多项式。
缺点:
  • 实现复杂:实现过程稍微复杂一些,需要理解状态变量的概念。
  • 设计较为复杂:适合高级应用和高阶滤波器设计。
import numpy as np
import matplotlib.pyplot as plt

# 定义滤波器系数
b = [0.0675, 0.2025, 0.2025, 0.0675]
a = [1.0, -1.1430, 0.4128, -0.0951]

# 输入信号:单位脉冲信号
n = 100  # 信号长度
x = np.zeros(n)
x[0] = 1  # 单位脉冲

# 直接I型结构
y_direct1 = np.zeros(n)
for i in range(3, n):
    y_direct1[i] = (b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2] + b[3]*x[i-3] -
                    a[1]*y_direct1[i-1] - a[2]*y_direct1[i-2] - a[3]*y_direct1[i-3])

# 直接II型结构
w = np.zeros(n)
y_direct2 = np.zeros(n)
for i in range(3, n):
    w[i] = x[i] - a[1]*w[i-1] - a[2]*w[i-2] - a[3]*w[i-3]
    y_direct2[i] = b[0]*w[i] + b[1]*w[i-1] + b[2]*w[i-2] + b[3]*w[i-3]

# 绘制结果
plt.figure(figsize=(12, 6))
plt.plot(y_direct1, label='Direct I Structure')
plt.plot(y_direct2, label='Direct II Structure')
plt.legend()
plt.title('Comparison of Direct I and Direct II Structures')
plt.xlabel('Sample Index')
plt.ylabel('Amplitude')
plt.grid()
plt.show()

在这个例子中,我们会看到直接I型结构由于其数值误差的累积和放大,输出信号在某些情况下可能会出现不稳定或异常的情况。而直接II型结构通过分离分子和分母的计算,通常会表现出更好的数值稳定性,输出信号更接近预期的结果。
在这里插入图片描述

总结

存储需求

  • 直接 I 型结构需要更多的存储,因为它需要存储输入和输出的延迟项。
  • 直接 II 型结构需要较少的存储,因为它只需要存储中间变量的延迟项。

数值稳定性

  • 直接 II 型结构通常比直接 I 型结构具有更好的数值稳定性,特别是对于高阶滤波器。 这是因为直接 II
    型结构在计算过程中减少了中间变量的累积误差。

实现复杂度

  • 直接 I 型结构实现较为简单,直接根据传递函数进行计算。
  • 直接 II 型结构实现稍微复杂,需要将滤波器分解为两个部分来计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/697547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL高性能(MySQL锁)

MySQL性能系列 MySQL锁 前言1. 死锁机制2. 思维导图与锁划分介绍3. 粒度划分锁3.1. 全局锁3.2. 页级锁(Page-level locking)3.3. 表级锁(Tables-level lock)○ 共享锁(表级)○ 排他锁(表级&…

字节面试:CPU100% 如何处理?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的线上问题的场景题: 1.CPU100%,你是怎么处理的&…

HTML做成一个粒子漩涡特效页面

大家好,今天制作制作一个粒子漩涡特效的页面! 先看具体效果: 要在一个单一的 index.html 页面中实现粒子漩涡特效,我们可以使用HTML、CSS和JavaScript(不需要外部库)。下面是一个简单的例子,展…

OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装注意事项:包内有两个版本及圆形图片,请根据自身需要版本进行安装演示为:MacBook Pro M3芯片1、双击运行软件,将其从左侧拖入右侧文件夹中(最终目的:安装进…

【全网最简单的解决办法】vscode中点击运行出现仅当从 VS 开发人员命令提示符处运行 VS Code 时,cl.exe 生成和调试才可用

首先确保你是否下载好了gcc编译器!!! 检测方法: winR 打开cmd命令窗 输入where gcc(如果出现路径则说明gcc配置好啦!) where gcc 然后打开我们的vscode 把这个文件删除掉 再次点击运行代码,第一个出现…

强烈推荐 Setapp 上的 Mac 优质软件

Setapp 一款专为 macOS 设计的软件订阅平台,目前提供高达 240 款精心筛选的高品质应用程序,只需每月 9.9 美元的订阅费,即可畅享所有正版软件的使用权。让使用者无忧享受正版软件的稳定性和安全性,彻底告别盗版软件可能引发的风险…

LLVM 后端执行流程

异构计算程序工作流程 图4-1中的LLVM后端的主要功能是代码生成,其中包括若干指令生成分析转换pass,将LLVM IR 转换为特定目标架构的机器代码 LLVM 流水线结构 输入指令经过图4-2中的各个阶段,从最初的LLVM IR,逐步演化为Selectio…

【因果推断python】26_双重稳健估计1

目录 不要把所有的鸡蛋放在一个篮子里 双重稳健估计 关键思想 不要把所有的鸡蛋放在一个篮子里 我们已经学会了如何使用线性回归和倾向得分加权来估计 。但是我们应该在什么时候使用哪一个呢?在不明确的情况下,请同时使用两者!双重稳健估计…

MySQL8基于GTID以及VIP实现高可用主从架构

jdbc客户端配置高可用以及故障切换 jdbc客户端实现故障切换 MySQL Connector/J 支持服务器故障转移。当底层活动连接发生与连接相关的错误时,就会发生故障转移 参考官网地址 jdbc:mysql://[primary host][:port],[secondary host 1][:port] jdbc客户端实现故障切…

数据结构复习笔记

简答题 (3) 顺序表和链表的概念及异同 顺序表: 把逻辑上相邻的结点储存在物理位置上的相邻储存单元中,结点的逻辑关系由储存单元的邻接关系来体现.链表: 逻辑上相邻的结点存储再物理位置上非连续非顺序的存储单元中, 结点的逻辑关系由指向下一个结点的指针确保.相…

LangChain开发【NL2SQL】应用

前言 关于LangGraph的简单介绍,请参考这篇博客: LangGraph开发Agent智能体应用【基础聊天机器人】-CSDN博客 对比LangChain实现NL2SQL 关于用LangChain开发NL2SQL的Agent应用,在这篇博客提供了完整的代码实现: LangChain开发…

xilinx的Aurora8B10B的IP仿真及上板测试(高速收发器十七)

前文讲解了Aurora8B10B协议原理及xilinx相关IP,本文讲解如何设置该IP,并且通过示例工程完成该IP的仿真和上板。 1、生成Aurora8B10B IP 如下图所示,首先在vivado的IP catalog中输入Aurora 8B10B,双击该IP。 图1 查找Aurora 8B10…

selenium自动化测试入门 —— Alert/Confirm/Prompt 弹出窗口处理!

一、Alert/Confirm/Prompt弹出窗口特征说明 Alert弹出窗口: 提示用户信息只有确认按钮,无法通过页面元素定位,不关闭窗口无法在页面上做其他操作。 Confirm 弹出窗口: 有确认和取消按钮,该弹出窗口无法用页面元素定…

angular2开发知识点

目录 文章目录 一、API 网关地址 配置二、服务注册使用三、模块组件注册使用四、html中style类动态绑定1. 单个类的绑定:[class.special]"isSpecial"2. 多个类的绑定:[ngClass]"{selected:status ,saveable: this.canSave,}"3. 单个…

ElementUI中date-picker组件,怎么把大写月份改为阿拉伯数字月份(例如:一月、二月,改为1月、2月)

要将 Element UI 的 <el-date-picker> 组件中的月份名称从中文大写&#xff08;如 "一月", "二月"&#xff09;更改为阿拉伯数字&#xff08;如 "1月", "2月"&#xff09;&#xff0c;需要进行一些定制化处理。可以通过国际化&a…

测试与开发

目录 按照测试目标分类 界面测试 功能测试 性能测试 可靠性测试 安全性测试 易用性测试 按照执行方式分类&#xff1a; 测试方法 白盒测试 语句覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖 黑盒测试 灰盒测试 按照测试阶段分类 单元测试 集成测试 …

Java24:会话管理 过滤器 监听器

一 会话管理 1.cookie 是一种客户端会话技术&#xff0c;cookie由服务端产生&#xff0c;它是服务器存放在浏览器的一小份数据&#xff0c;浏览器 以后每次访问服务器的时候都会将这小份的数据带到服务器去。 //创建cookie对象 Cookie cookie1new Cookie("…

使用DPO微调大模型Qwen2详解

简介 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback&#xff0c;RLHF) 事实上已成为 GPT-4 或 Claude 等 LLM 训练的最后一步&#xff0c;它可以确保语言模型的输出符合人类在闲聊或安全性等方面的期望。但传统的RLHF比较复杂&#xff0c;且还需要奖励…

OSPF LSA头部详解

LSA概述 LSA是OSPF的本质 , 对于网工来说能否完成OSPF的排错就是基于OSPF的LSDB掌握程度 . 其中1/2类LAS是负责区域内部的 类似于设备的直连路由 . 加上对端的设备信息 3 类LSA是区域间的 指的是Area0和其他Area的区域间关系 , 设计多区域的初衷就是避免大型OSPF环境LSA太多…

AMD在行动:揭示应用程序跟踪和性能分析的力量

AMD in Action: Unveiling the Power of Application Tracing and Profiling — ROCm Blogs 导言 Rocprof是一款强大的工具&#xff0c;设计用于分析和优化基于AMD ROCm平台上运行的HIP程序的性能&#xff0c;帮助开发者找出并解决性能瓶颈。Rocprof提供了多种性能数据&#x…