由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法

这篇具有很好参考价值的文章主要介绍了由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由系统函数求零极点、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法

Author: Sijin Yu


本文以离散信号为例.

1. Matlab

1.1 tf2zpk() 函数

使用 tf2zpk() 函数可以获得频率响应的零极点.
matlab 的官方文档对 tf2zpk() 函数的用法介绍如下.
由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法
即, 给定系统函数
H ( z ) = b 0 + b 1 z − 1 + ⋯ + b n z − n a 0 + a 1 z − 1 + ⋯ + a n z − m = ∑ i = 0 n b i z − i ∑ i = 0 m a i z − i , H(z)=\frac{b_0+b_1z^{-1}+\cdots+b_nz^{-n}}{a_0+a_1z^{-1}+\cdots+a_nz^{-m}}=\frac{\sum^{n}_{i=0}b_iz^{-i}}{\sum^m_{i=0}a_iz^{-i}}, H(z)=a0+a1z1++anzmb0+b1z1++bnzn=i=0maizii=0nbizi,
令序列 b = [ b 0 , b 1 , ⋯   , b n ] , a = [ a 0 , a 1 , ⋯   , a m ] b=[b_0,b_1,\cdots,b_n],a=[a_0,a_1,\cdots,a_m] b=[b0,b1,,bn],a=[a0,a1,,am]. 系统函数的零极点表达式为
H ( z ) = k ( z − z 1 ) ( z − z 2 ) ⋯ ( z − z N ) ( z − p 1 ) ( z − p 2 ) ⋯ ( z − p M ) = k ∏ i = 1 N ( z − z i ) ∏ i = 1 M ( z − p i ) , H(z)=k\frac{(z-z_1)(z-z_2)\cdots(z-z_N)}{(z-p_1)(z-p_2)\cdots(z-p_M)}=k\frac{\prod^N_{i=1}(z-z_i)}{\prod^M_{i=1}(z-p_i)}, H(z)=k(zp1)(zp2)(zpM)(zz1)(zz2)(zzN)=ki=1M(zpi)i=1N(zzi),
序列 z = [ z 1 , z 2 , ⋯   , z N ] , p = [ p 1 , p 2 , ⋯   , p M ] z=[z_1,z_2,\cdots,z_N],p=[p_1,p_2,\cdots,p_M] z=[z1,z2,,zN],p=[p1,p2,,pM] 分别表示 H ( z ) H(z) H(z) 的零点和极点. 函数 [z, p, k]=tf2zpk(b, a) 返回以 ba 序列为参数的系统方程的零点序列 z、极点序列 p、增益 k.

1.2 zplane() 函数

matlab 的官方文档对 zplane() 函数的用法介绍如下.
由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法
zplane() 有两个主要用法:

  1. zplane(z, p). 传入参数为零点序列 z 和极点序列 p. 直接作零极点图.
  2. zplane(b, a). 传入参数为系统函数的参数 ba. 函数自动根据系统函数作零极点图.\

在下文我们会验证这两种做法是等效的.

1.3 freqz() 函数

matlab 的官方文档对 freqz() 函数的用法介绍如下.
由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法
即, 给定系统函数
H ( z ) = b 0 + b 1 z − 1 + ⋯ + b n z − n a 0 + a 1 z − 1 + ⋯ + a n z − m = ∑ i = 0 n b i z − i ∑ i = 0 m a i z − i , H(z)=\frac{b_0+b_1z^{-1}+\cdots+b_nz^{-n}}{a_0+a_1z^{-1}+\cdots+a_nz^{-m}}=\frac{\sum^{n}_{i=0}b_iz^{-i}}{\sum^m_{i=0}a_iz^{-i}}, H(z)=a0+a1z1++anzmb0+b1z1++bnzn=i=0maizii=0nbizi,
令序列 b = [ b 0 , b 1 , ⋯   , b n ] , a = [ a 0 , a 1 , ⋯   , a m ] b=[b_0,b_1,\cdots,b_n],a=[a_0,a_1,\cdots,a_m] b=[b0,b1,,bn],a=[a0,a1,,am]. 函数 [h, w]=freqz(b, a) 返回频率响应序列 h 和频率序列 w. h 为复序列, 模 abs(h) 为幅频响应序列, 角 angle(h) 为相频响应序列.

1.4 Example

作下面系统函数的零极点图、幅频特性曲线、相频特性曲线.
H ( z ) = 0.5 z − 1 − 0.72 z − 3 3 + 2 z − 1 − 0.87 z − 2 . H(z)=\frac{0.5z^{-1}-0.72z^{-3}}{3+2z^{-1}-0.87z^{-2}}. H(z)=3+2z10.87z20.5z10.72z3.
代码如下:

% test.m
% author: Sijin Yu
clear;
figure(1);
b = [0 0.5 0 -0.72];
a = [3 2 0.87];
[z, p, k] = tf2zpk(b, a);
% -----零极点----- 
subplot(2, 2, 1);
zplane(z, p);
title('zplane(z, p)');
subplot(2, 2, 2);
zplane(b, a);
title('zplane(b, a)');
% -----幅频特性----- 
[h, w] = freqz(b, a);
H_abs = abs(h);
subplot(2, 2, 3);
plot(w, 20 * log10(H_abs)); % 以分贝为单位
title('幅频特性');
% -----相频特性-----
H_angle = angle(h);
subplot(2, 2, 4);
plot(w, H_angle);
title('相频特性');

结果如下:
由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法

2. Python

2.1 scipy.signal.tf2zpk() 函数

该函数依赖 scipy 库, 使用前应执行 pip install scipy.
scipy 的官方文档介绍如下.
由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法
其用法和 matlab 中的 tf2zpk() 用法非常相似, 不多赘述.

2.2 zplane() 函数的自定义

Python 中没有直接实现 matlab 中 zplane() 函数的功能. (至少我没找到, 有知道的大佬欢迎留言.) 因此我自己实现了 zplane() 函数.
函数定义的代码如下

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Circle

def zplane(z, p, fig=None, ax=None):
    if fig==None or ax==None:
        fig, ax = plt.subplots(figsize=(4, 4))
    circle = Circle(xy = (0.0, 0.0), radius = 1, alpha = 0.9, facecolor = 'white')
    # 作单位园
    theta = np.linspace(0, 2 * np.pi, 200)
    x = np.cos(theta)
    y = np.sin(theta)
    ax.add_patch(circle)
    ax.plot(x, y, color="darkred", linewidth=2)
    lim = max(max(z), max(p), 1) + 1
    # 控制坐标轴范围
    plt.xlim([-lim, lim])
    plt.ylim([-lim, lim])
    # 作零极点
    for i in z:
        ax.plot(np.real(i),np.imag(i), 'bo') 
    for i in p:
        ax.plot(np.real(i),np.imag(i), 'bx') 

2.3 scipy.signal.freqz() 函数

scipy 库官方文档对其描述如下.
(由于内容过长, 不截图)

scipy.signal.freqz(b, a=1, worN=512, whole=False, plot=None, fs=6.283185307179586, include_nyquist=False)

Parameters:

  • b: array_like
    Numerator of a linear filter. If b has dimension greater than 1, it is assumed that the coefficients are stored in the first dimension, and b.shape[1:], a.shape[1:], and the shape of the frequencies array must be compatible for broadcasting.
  • a: array_like
    Denominator of a linear filter. If b has dimension greater than 1, it is assumed that the coefficients are stored in the first dimension, and b.shape[1:], a.shape[1:], and the shape of the frequencies array must be compatible for broadcasting.
  • worN: {None, int, array_like}, optional
    If a single integer, then compute at that many frequencies (default is N=512). This is a convenient alternative to: np.linspace(0, fs if whole else fs/2, N, endpoint=include_nyquist).
    Using a number that is fast for FFT computations can result in faster computations (see Notes).
    If an array_like, compute the response at the frequencies given. These are in the same units as fs.
  • whole: bool, optional
    Normally, frequencies are computed from 0 to the Nyquist frequency, fs/2 (upper-half of unit-circle). If whole is True, compute frequencies from 0 to fs. Ignored if worN is array_like.
  • plot: callable
    A callable that takes two arguments. If given, the return parameters w and h are passed to plot. Useful for plotting the frequency response inside freqz.
  • fs: float, optional
    The sampling frequency of the digital system. Defaults to 2*pi radians/sample (so w is from 0 to pi).
  • include_nyquist: bool, optional
    If whole is False and worN is an integer, setting include_nyquist to True will include the last frequency (Nyquist frequency) and is otherwise ignored.

Returns:

  • w: ndarray
    The frequencies at which h was computed, in the same units as fs. By default, w is normalized to the range [0, pi) (radians/sample).
  • h: ndarray
    The frequency response, as complex numbers.

2.4 Example

我们用回 1.4 中的例子.
代码如下:

# test.py
# author: Sijin Yu
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
from matplotlib.patches import Circle

def zplane(z, p, fig=None, ax=None):
    if fig==None or ax==None:
        fig, ax = plt.subplots(figsize=(4, 4))
    circle = Circle(xy = (0.0, 0.0), radius = 1, alpha = 0.9, facecolor = 'white')
    # 作单位园
    theta = np.linspace(0, 2 * np.pi, 200)
    x = np.cos(theta)
    y = np.sin(theta)
    ax.add_patch(circle)
    ax.plot(x, y, color="darkred", linewidth=2)
    lim = max(max(z), max(p), 1) + 1
    # 控制坐标轴范围
    plt.xlim([-lim, lim])
    plt.ylim([-lim, lim])
    # 作零极点
    for i in z:
        ax.plot(np.real(i),np.imag(i), 'bo') 
    for i in p:
        ax.plot(np.real(i),np.imag(i), 'bx') 


b = np.array([0, 0.5, 0, -0.72])
a = np.array([3, 2, 0.87])
# -----零极点图-----
z, p, k = signal.tf2zpk(b, a)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(2, 2, 1)
zplane(z, p, fig=fig, ax=ax)
# -----幅频特性-----
w, h = signal.freqz(b, a)
ax = fig.add_subplot(2, 2, 3)
ax.plot(w, 20 * np.log10(abs(h))) # 以分贝为单位
# -----相频特性-----
ax = fig.add_subplot(2, 2, 4)
ax.plot(w, np.angle(h))
fig.savefig("result_py.jpg")

结果如下:
由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法

3. 总结

对比 matlab 的图和 Python 的图, 发现为原点的极点 Python 没有画出, 而 matlab 画出. 其余结果 matlab 与 Python 一致.文章来源地址https://www.toymoban.com/news/detail-489948.html

到了这里,关于由系统函数求零极点图、频率响应(幅频特性、相频特性)的 Matlab 和 Python 方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【MATLAB】【数字信号处理】产生系统的单位冲激响应h(t)与H(z)零极点分布

    产生 h(t) 与 H(z) 零极点分布 微机,仿真软件MATLAB 2022a 程序如下: 运行结果如下: 代码如下: 运行结果如下:

    2024年01月19日
    浏览(47)
  • matlab函数 状态空间系统ss、能控性矩阵ctrb、矩阵的秩rank、能控标准型canon、零极点配置place、系统极点pole等函数(线性定常系统)

    如果已知线性定常系统的ABCD四个矩阵,可以得到状态空间系统 其他更具体的用法请直接看帮助文档。 用法:ss(A,B,C,D) 假如 可以输入 最后得到 判断系统是否能控,可以用能控性矩阵是否奇异进行判断。ctrb函数用来生成能控性矩阵,rank用来判断矩阵的秩 对于线性定常系统

    2024年02月10日
    浏览(62)
  • RCR低通滤波器电路幅频、增益、相移特性分析

    一、前言         笔者负责开发的产品用于电力系统测控方面,所以在ADC电路的前级用到了RCR低通滤波器,以滤除通过PT/CT互感器串进来的高频干扰信号。与此同时,滤波电路也会对高次谐波的幅值、相位产生影响,导致我们的测量结果有偏差,因此我们需要计算滤波器特性

    2024年02月12日
    浏览(39)
  • 9、电路综合-基于简化实频的任意幅频响应的微带电路设计

    网络综合和简化实频理论学习概述中的1-8介绍了SRFT的一些基本概念和实验方法,终于走到了SRFT的究极用途,给定任意响应直接综合出微带电路。 我们演示了采用相应传输线的经典微波滤波器的设计过程。设计方法的第一步是选择合适的传递函数。显然,传递函数的形式必须

    2024年02月08日
    浏览(37)
  • 基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 2.1 OFDM原理 2.2 64QAM调制 2.3 载波同步 5.算法完整程序工程   MATLAB2022a         正交频分复用(OFDM)是一种在现代通信系统中广泛使用的调制技术,它具有高效的频谱利用和抗多径衰落等特点。6

    2024年02月12日
    浏览(45)
  • 5.6 频率响应与阶跃响应

    频率响应描述放大电路对不同频率正弦信号放大的能力,即在输入信号幅值不变的情况下改变信号频率,这种方法称为 频域法 。实际上,还可以用阶跃函数作为放大电路的输入,考察输出信号前沿与顶部的变化,来研究电路的放大性能,这种方法称为 时域法 。所谓阶跃函数

    2024年02月10日
    浏览(46)
  • 20、基于51单片机的函数发生器四种波形频率系统设计

    设计了一个基于DAC0832的信号发生器,使之输出不同频率的正弦波、三角波、锯齿波和方波,并通过按键切换不同的波形,也可以改变频率以及频率变化的步进。本方案选择了DAC0832作为核心芯片,并与51单片机结合,设计出一款建议的高精度频率信号发生器,具有体积小功率等

    2024年02月04日
    浏览(56)
  • 06电容阻抗-频率特性曲线

    目录 一、阻抗-频率曲线图 二、曲线图来源 三、滤波电容如何选择 四、MLCC陶瓷电容的阻抗-频率曲线图 五、电容滤波如何设计 六、电容充放电波形 七、不同封装相同容值的区别是? 八、为什么说大电容滤低频,小电容滤高频         上图是一个典型的电容的阻抗频率曲

    2024年02月06日
    浏览(42)
  • Chapter4:频率响应法(中)

    第四章:频率响应法 Exercise4.13 已知控制系统的开环对数幅频渐近特性如下,确定各 最小相位系统 的开环传递函数。 解: 【图 ( a ) ({rm a}) ( a ) 】 确定系统积分环节或微分环节个数。 因为对数幅频渐近特性曲线的低频渐近线的斜率为

    2024年02月03日
    浏览(34)
  • 5.4 单管放大电路的频率响应

    考虑到耦合电容和结电容的影响,图5.4.1(a)所示电路的等效电路如图(b)所示。 在分析放大电路的频率响应时,为了方便起见,一般将输入信号的频率范围分为中频、低频和高频三个频段。在中频段,极间电容因容抗很大而视为开路,耦合电容(或旁路电容)因容抗很小而视为

    2024年02月10日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包