数字滤波器和模拟滤波器(一)

news/2025/1/20 17:01:13/文章来源:https://www.cnblogs.com/shug2019/p/18238852

模拟滤波器和数字滤波器(一)

下面介绍模拟滤波器和数字滤波器的频率响应的异同,以及如何使用python地scipy.signal来绘制其频谱响应和冲激阶跃响应。在第二期将谈到如何设计模拟滤波器和数字滤波器。

在正文之间,应该介绍连续时间傅立叶变换(CTFT)和离散时间傅立叶变换(DTFT)。

  1. CTFT 连续时间信号的傅立叶变换

时域连续,且具有非周期性的函数,可以进行傅里叶变换,求出连续的非周期的频谱

\[\Large \begin{aligned}X(\omega) &= \int_{-\infty}^\infty x(t)e^{-j \omega t}dt \\ x(t) &= \frac{1}{2\pi}\int_{-\infty}^\infty X(\omega)e^{j \omega t}d\omega \end{aligned} \]

  1. DTFT 离散时间信号的傅立叶变换

时域离散,且具有非周期性的函数,可以求出连续的周期的频谱。周期为\(2\pi\)

\[\Large \begin{aligned}X(\omega) &= \sum_{-\infty}^\infty x[n]e^{-j \omega n} \\ x[n] &= \frac{1}{2\pi}\int_{-\pi}^\pi X(\omega)e^{j \omega n}d\omega \end{aligned} \]

最大的区别是,连续时间信号的频谱从0到无穷大,离散时间信号的频谱从0到\(2\pi\)

下面将介绍python当中的模拟和数字滤波器。

1、模拟滤波器

比如一个二阶系统,其传递函数为:

\[H(s) = \frac{udnf^2}{s^2+2*udnf*dr*s+udnf^2} = \frac{0s^2+0s+1}{s^2+1s+1} \]

该传递函数的时域微分形式为:

\[\frac{d^2y(t) }{dt^2} + 2\zeta w_n \frac{dy(t)}{dt} + w_n^2y(t) = w_n^2x(t) \]

import numpy as np
from scipy.signal import freqs_zpk,freqs,tf2zpk
import matplotlib.pyplot as plt
dr = 1/2          # damping ratio
udnf = 1          # undamped natural frequency
b = [0,0,udnf**2]
a = [1,2*udnf*dr,udnf**2]
z,p,k = tf2zpk(b,a)
w, h = freqs_zpk(z, p, k, worN=np.logspace(-3, 5, 1000))fig = plt.figure(figsize=(14,7))
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_title('Analog filter frequency response')
ax1.semilogx(w, 20 * np.log10(abs(h)), 'b')
ax1.set_ylabel('Amplitude [dB]', color='b')
ax1.set_xlabel('Frequency [Hz]')
ax1.grid(True)ax2 = ax1.twinx()
angles = np.unwrap(np.angle(h,deg=True),period=360)
ax2.semilogx(w, angles, 'g')
ax2.set_ylabel('Angle [degree]', color='g')plt.axis('tight')
plt.show()

image-20240607221627887

from scipy.signal import impulse,step
print(z,p,k)
t, y = impulse((z,p,k))
t1, y1 = step((z,p,k))
plt.plot(t,y)
plt.plot(t1,y1)
plt.legend(["impulse response","step response"])
plt.show()

image-20240607221656418

上面用到scipy.signal三个函数:

  1. freqs_zpk:基于零极点的模拟频率响应。

    1. worN:频率轴范围。
    2. np.logspace:生成对数序列
  2. freqs:基于有理传递函数的模拟频率响应。在本例中没有用到。尤其注意b、a对应传递函数是正幂。

            b[0]*(jw)**M + b[1]*(jw)**(M-1) + ... + b[M]
    H(w) = ----------------------------------------------a[0]*(jw)**N + a[1]*(jw)**(N-1) + ... + a[N]
    
  3. tf2zpk:传递函数转零极点表示。

2、数字滤波器

比如一个二阶系统:

\[H(z) = \frac{1}{1-(2r\cos(\theta)z^{-1}+r^2z^{-2}} = \frac{z^2}{z^2-(2r\cos(\theta)z+r^2} \]

其单位脉冲响应为:

\[h[n] = r^n\frac{\sin(n+1)\theta}{\sin\theta}u[n] \]

差分方程表示为:

\[y[n]-2r\cos(\theta)y[n-1]+r^2y[n-2] = x[n] \]

import numpy as np
from scipy.signal import freqz_zpk,freqz,tf2zpk
import matplotlib.pyplot as pltfs = 2*np.pir = 3/4            
theta = 45/180*np.pi          
b = [1,0,0]
a = [1,-2*r*np.cos(theta),r**2]
z,p,k = tf2zpk(b,a)
w, h = freqz_zpk(z, p, k, worN=np.linspace(-2.5*np.pi,2.5*np.pi,1000),fs=fs)fig = plt.figure(figsize=(14,7))
ax1 = fig.add_subplot(1, 1, 1)
ax1.set_title('Digital filter frequency response')
ax1.plot(w, 20 * np.log10(abs(h)), 'b')
ax1.set_ylabel('Amplitude [dB]', color='b')
ax1.set_xlabel('w(radians)')
ax1.set_xticks([-3*np.pi,-2*np.pi,-1*np.pi,0,1*np.pi,2*np.pi,3*np.pi],[r"$-3\pi$",r"$-2\pi$",r"$-\pi$","0",r"$\pi$",r"$2\pi$",r"$3\pi$"])
ax1.grid(True)ax2 = ax1.twinx()
angles = np.unwrap(np.angle(h,deg=True),period=360)
ax2.plot(w, angles, 'g')
ax2.set_ylabel('Angle [degree]', color='g')plt.axis('tight')
plt.show()

image-20240608180938839

该仿真波形和奥本海姆的教材上面的波形一致。

print(z,p,k)
from scipy.signal import dimpulse, dstep
dt = 0.1
t, y = dimpulse((z,p,k,dt), n=50)
t1, y1 = dstep((z,p,k,dt), n=50)
plt.stem(t,np.squeeze(y),'r')
plt.plot(t1,np.squeeze(y1),'bo-')
plt.legend(["impulse response","step response"])
plt.show()

image-20240608182921095

需要注意:

  1. freqs_zpk:没有采样率这个概念,worN的单位就是Hz

  2. freqz_zpk:有采样率这个概念,fs的默认值为\(2\pi\)​,此时横坐标的单位为弧度。

  3. freqz:使用传递函数绘制频谱响应。在scipy.signal的定义里面,此函数为负幂。

                jw                 -jw              -jwMjw    B(e  )    b[0] + b[1]e    + ... + b[M]e
    H(e  ) = ------ = -----------------------------------jw                 -jw              -jwNA(e  )    a[0] + a[1]e    + ... + a[N]e
    
  4. 弧度和频率换算举例:设置\(worN=[-2\pi,2\pi]\),如果fs使用默认值\(2\pi Hz\),那么实际横坐标的范围为\([-2\pi,2\pi]\),即两个周期;如果fs使用\(\pi Hz\),那么实际的横坐标范围为\([-4\pi,4\pi]\)其中\(\pi\)弧度对应\(fs/2\) Hz.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

茗鹤 | 模具如何在APS高级计划排程系统中,配置共模、互换镶件等有限约束条件?

在高度依赖模具的生产环境中,模具管理与APS生产排程的有效整合是提升效率、确保订单交期的关键。以下是针对模具管理的几个核心策略,通过APS高级计划排程系统的辅助,实现产能优化与生产调度的智能化升级在高度依赖模具的生产环境中,模具管理与APS生产排程的有效整合是提升效…

靶机练习:Gitroot

信息收集 扫描全端口以发现服务访问80端口,有hint尝试绑定域名到/etc/vuln,同时提示中存在用户名jen,可以尝试爆破ssh 绑定后能访问站点了用wpscan能扫出wordpress的用户名接下来没爆破出密码 尝试使用wfuzz扫描子域名 wfuzz -c -u http://gitroot.vuln -H "HOST:FUZZ.…

Redis-10-分布式锁.md

参考: 分布式锁介绍 1.概念 额,为什么的话,建议先了解下我这篇文章。 Java-并发-并发的基本概念 我们在并发场景下,区分一个场景是否有并发问题,个人理解,锁的场景需要考虑:共享:是否共享某个资源 竞态:如何构建竞态关系首先,我们得拎清楚它到底会不会共享,不是说多…

一文了解 - - SpringMVC

一、SpringMVC概述Spring MVC 是由Spring官方提供的基于MVC设计理念的web框架。 SpringMVC是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互。1.1 SpringMVC优势严格遵守了MVC分层思想采用了松耦合、插件式结构;相比较于我们封装的BaseServlet以及其他的一些…

php-status监控流程

1.开启php的状态页功能 #基于php-fpm进程做的实验yum install php-fpm -y修改配置文件,开启php,status功能即可,打开如下参数即可 要求你访问php状态页面的入口就是/status_php[root@web-7 ~]#grep status_ /etc/php-fpm.d/www.conf pm.status_path = /status_phpphp-fpm,…

南昌航空大学软件学院23201823第二次blog

一、前言: 这是第二次的blog,接下来关于这最近三次的PTA大作业,只有第一次是上次答题判题程序的延续,接下来则是一个全新的关于电路的设计,最新的电路设计相较于之前的答题判题程序来说的话,难度确实有所下降。前两次中都含有三道题,而最后一次的PTA则是删去了其余两道题…

BUUCTF-Misc(121-130)

[UTCTF2020]sstv 参考: [UTCTF2020]QSSTV - cuihua- - 博客园 (cnblogs.com) qsstv解密一下flag{6bdfeac1e2baa12d6ac5384cdfd166b0}voip 参考: buuctf VoIP-CSDN博客 voip就是语音通话技术然后wireshark可以直接播放这个语音然后播放一下flag就是考听力的,加油吧,我太垃圾…

Paxos Made Simple

1 IntroductionPaxos算法是莱斯利兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递且具有高度容错特性的共识(consensus)算法。《The Part-Time Parliament》最早发表于1998年,Paxos岛上有一个议会,这个议会来决定岛上的法律,而法律是由议会通过的一系列的法令定义…

题目集4~6的总结

目录一.前言 nchu-software-oop-2024-上-4 ~知识点 nchu-software-oop-2024-上-5 ~知识点 nchu-software-oop-2024-上-6 ~知识点二.设计与分析一.答题判题程序-41.继承2.多态二.家居强电电路模拟程序-11.类的设计2.抽象类二.家居强电电路模拟程序-21.面向对象设计原则——单…

后缀数组学习笔记

后缀数组学习笔记1. 前置知识:基数排序 1.1. 思想 现有如下序列:3,44,38,5,47,15,36,32,50,现在要用基数排序算法排序,要怎么做? 基数排序的初始状态如下:按照个位将原序列中的数分组,放入对应的集合将分好的数按照个位的顺序取出,得到:将序列中的数重新按照十位分组,…

RUST安装和配置过程

RUST安装和配置过程 在Linux系统下,使用如下命令执行安装 sudo sh -c "curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh" 可能会有报错如下检查 /tmp 权限 确保 /tmp 目录具有正确的权限,允许所有用户写入。可以使用以下命令检查 /tmp 目录的权限:…

第一篇 Markdown学习

第一篇 Markdown语法归纳Markdown官方文档 Typora安装教程(来自CSDN大佬)标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 标题一 标题二 字体样式 加粗文本 加粗文本 删除线 斜体 斜体 斜体加粗 斜体加粗 引用引用图片分割线超链接 我的博客 列表A B CA B CA B C…