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

· 浏览次数 : 0

小编点评

模拟滤波器和数字滤波器的频率响应是信号处理中两种不同类型的滤波器。模拟滤波器的频率响应通常是在频域中定义的,可以通过微分方程或传递函数来描述其与信号的关系。而数字滤波器的频率响应则是在复平面上定义的,通过单位脉冲响应或差分方程来描述其与信号的关系。 在实际应用中,需要根据信号的特性和处理要求选择合适的滤波器类型。例如,在处理连续时间信号时,使用模拟滤波器更合适;而在处理离散时间信号时,使用数字滤波器更优越。 Python的`scipy_signal`模块提供了多种函数来模拟和计算滤波器的频率响应。对于模拟滤波器,可以使用`freqs_zpk`函数来绘制基于零极点的模拟频率响应。对于数字滤波器,可以使用`freqz_zpk`函数来绘制基于零极点的模拟频率响应,同时还可以使用`freqz`函数来绘制基于传递函数的数字频率响应。 此外,`scipy_signal`模块还提供了脉冲响应和阶跃响应的计算功能,这对于分析滤波器的动态特性非常有帮助。在设计滤波器时,可以根据具体的需求和限制,使用不同的方法来设计和优化滤波器。

正文

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

下面介绍模拟滤波器和数字滤波器的频率响应的异同,以及如何使用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 plt

fs = 2*np.pi

r = 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              -jwM
       jw    B(e  )    b[0] + b[1]e    + ... + b[M]e
    H(e  ) = ------ = -----------------------------------
                jw                 -jw              -jwN
             A(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.

与数字滤波器和模拟滤波器(一)相似的内容:

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

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

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同,因此具体一帧能存储多长时间根据

数字孪生云渲染整体架构设计

大家好,本文在我开发的多个项目的基础上,提出了应用于数字孪生的云渲染整体架构设计,分析了其中的关键点,感谢大家~

[转帖]电科数字董秘回复:华诚金锐申威服务器是中国电科全国产化服务器

http://stock.stockstar.com/RB2022101700005361.shtml 电科数字(600850)10月17日在投资者关系平台上答复了投资者关心的问题。 投资者:公司的自主可控华诚金锐服务器是否是完全国产自主技术,是否会被国外卡脖子,主要应用在哪些领域 电科数字董秘:您

数字符号概述

### 数字 $x$ 标量 $X$ 向量 $\Chi$ 矩阵 ![image](https://img2023.cnblogs.com/blog/80824/202305/80824-20230511150354001-583871474.png) ![image](https://img2023.

数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具

数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具 1.介绍 FaceChain是一个可以用来打造个人数字形象的深度学习模型工具。用户仅需要提供最低一张照片即可获得独属于自己的个人形象数字替身。FaceChain支持在gradio的界面中使用模型训练和推理能力,也支

零知识证明与同态加密:隐私计算的双剑

在数字时代,隐私保护已成为全球关注的焦点。隐私计算作为解决数据隐私问题的关键技术,其核心目标是在不泄露个人或敏感信息的前提下,实现数据的计算和分析。在这一领域,零知识证明和同态加密扮演着至关重要的角色。本文将深入探讨这两种技术如何在隐私计算中发挥作用,以及它们之间的异同。

[转帖]国产数字芯片厂商详细信息

http://www.ichyang.com/post/36770.html 国产数字芯片厂商详细信息 下面我们将从核心技术、主要产品、目标市场和应用方案等方面对这30家公司逐一展示。 国产芯片 中科龙芯 核心技术:MIPS授权架构的CPU及生态圈、跨指令兼容的二进制翻译技术。 主要产品:面向行业应

百度飞桨(PaddlePaddle)-数字识别

手写数字识别任务 用于对 0 ~ 9 的十类数字进行分类,即输入手写数字的图片,可识别出这个图片中的数字。 使用 pip 工具安装 matplotlib 和 numpy python -m pip install matplotlib numpy -i https://mirror.baidu.co

华为云云筑·开发者年度盛典精彩回顾

摘要:数字人主持、年度颁奖典礼、2023前沿技术展望,干货满满奉上。 本文分享自华为云社区《华为云云筑·开发者年度盛典精彩回顾》,作者:华为云社区精选 。 1月12日,华为云云筑开发者联盟年度盛典圆满落幕,来自企业、圈层、高校等各个领域的开发者代表相聚云端,回顾了过去一年在华为云上的成长,共同展望2