Advertisement

信号处理基础:信号的时域和频域分析_(13).Z变换

阅读量:

Z变换

在这里插入图片描述

Z变换的定义

该数学工具被称为Z变换,并被广泛应用于多个工程领域以解决实际问题。通过这种转换过程(即从时域映射到复频域),工程师能够更高效地分析并优化离散系统的行为模式。这一转换不仅简化了相关任务的复杂性,并且显著提升了分析效率。

对于一个离散时间信号 x[n],其Z变换定义为:

X(z) = \sum_{n=-\infty}^{\infty} x[n] z^{-n}

其中

Z变换的性质

Z变换包含多种关键属性,在信号处理及系统分析领域具有重要意义。这些属性包括一些典型的Z变换特征。

线性性质

如果 x_1[n]x_2[n] 的Z变换分别为 X_1(z)X_2(z),那么线性组合 a x_1[n] + b x_2[n] 的Z变换为:

a X_1(z) + b X_2(z)

时移性质

如果 x[n] 的Z变换为 X(z),那么 x[n-n_0] 的Z变换为:

z^{-n_0} X(z)

尺度变换性质

如果 x[n] 的Z变换为 X(z),那么 a^n x[n] 的Z变换为:

X\left(\frac{z}{a}\right)

卷积性质

如果 x_1[n]x_2[n] 的Z变换分别为 X_1(z)X_2(z),那么 x_1[n] * x_2[n] 的Z变换为:

X_1(z) X_2(z)

初值定理

如果 x[n] 是因果信号(即 x[n] = 0 对于 n < 0),那么 x[0] 可以通过以下公式求得:

x[0] = \lim_{z \to \infty} X(z)

终值定理

x[n]是一个因果序列,并且(z−1)X(z)z=1处具有解析性时,则x[∞]可以通过下述公式计算。

x[\infty] = \lim_{z \to 1} (z-1) X(z)

Z变换的应用

Z变换在信号处理与控制系统设计领域内具有显著的应用潜力,在多个工程领域中发挥着重要作用

离散时间系统的分析

离散时间系统的传输函数可由输入信号及其Z变换与输出信号的关系来表示。设系统输入序列为 x[n] ,输出序列为 y[n] ,则其传输函数 H(z) 可表为:

H(z) = \frac{Y(z)}{X(z)}

稳定性分析

系统的稳定性基于Z变换的极点进行研究。当处于单位圆内部的所有极点时,则系统达到稳定状态。

逆Z变换

实现了将信号从Z域转换回时域的过程。主要的方法包括部分分式展开、留数定理以及长除法等。

与傅里叶变换的关系

Z变换与DTFT之间存在紧密联系。(Discrete-Time Fourier Transform, DTFT)当令 z = e^{jω} 时,Z变换退化为其。

X(e^{j\omega}) = \sum_{n=-\infty}^{\infty} x[n] e^{-j\omega n}

Z变换的计算

直接计算

在直接计算Z变换的过程中, 必须对相应的级数进行求和运算. 如单位脉冲信号\delta[n]的定义式所示, 则其Z变换定义为1/|z|

X(z) = \sum_{n=-\infty}^{\infty} \delta[n] z^{-n} = 1

表格法

Z变换中常见的信号及其变换可通过查找表格获得。具体来说,这些常见的信号以及它们的Z变换如下所示:

信号 x[n] Z变换 X(z) ROC
\delta[n] 1 全部 z
u[n] \frac{1}{1-z^{-1}} $
a^n u[n] \frac{1}{1-az^{-1}} $
n u[n] \frac{z^{-1}}{(1-z^{-1})^2} $

MATLAB示例

以下是一个利用MATLAB进行Z变换计算的示例。我们计划计算一个简单的因果信号 x[n] = a^n u[n] 进行Z变换运算。

复制代码
    % MATLAB代码示例:计算因果信号 x[n] = a^n u[n] 的Z变换
    % 设定参数
    a = 0.5; % 信号的衰减因子
    
    % 定义信号
    n = 0:10; % 信号的时间范围
    x = a.^n; % 信号 x[n] = a^n u[n]
    
    % 计算Z变换
    syms z
    X_z = ztrans(x, n, z);
    
    % 显示结果
    disp('Z变换 X(z):');
    disp(X_z);
    
    % 绘制Z变换的极点图
    figure;
    zplane(1, [1 -a]);
    title('Z变换的极点图');

Python示例

以下是一个采用Python语言及其SymPy工具库来进行Z变换的计算的示例。为了计算同一个因果信号x[n] = a^n u[n]的Z变换,我们将会执行相应的运算步骤。

复制代码
    # Python代码示例:计算因果信号 x[n] = a^n u[n] 的Z变换
    import sympy as sp
    
    # 定义符号
    n, z, a = sp.symbols('n z a')
    
    # 定义信号
    x_n = a**n
    
    # 计算Z变换
    X_z = sp.summation(x_n * z**(-n), (n, 0, sp.oo))
    
    # 显示结果
    print('Z变换 X(z):')
    print(X_z)
    
    # 绘制Z变换的极点图
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 绘制极点图
    fig, ax = plt.subplots()
    circle = plt.Circle((0, 0), 1, fill=False, linestyle='--', color='gray')
    ax.add_artist(circle)
    ax.plot([1], [a], 'ro')  # 绘制极点
    ax.set_xlim(-2, 2)
    ax.set_ylim(-2, 2)
    ax.set_aspect('equal', 'box')
    ax.set_xlabel('实部')
    ax.set_ylabel('虚部')
    ax.set_title('Z变换的极点图')
    plt.grid(True)
    plt.show()

Z变换的逆变换

逆Z变换能够将信号从Z域成功地还原到时域中。在工程实践中,通常采用的部分分式分解法、留数计算方法以及长除运算等多种技术构成了完整的逆Z变换方案。

部分分式展开法

该方法可视为逆Z变换过程中的一个典型解决方案。假定X(z)是一个有理函数,则通过系统性的分析可以将该有理函数分解为多个较为简单的子函数;进而逐一求解每个子函数对应的逆Z变换结果。

例如,对于 X(z) = \frac{1}{(1-az^{-1})(1-bz^{-1})},可以通过部分分式展开得到:

X(z) = \frac{A}{1-az^{-1}} + \frac{B}{1-bz^{-1}}

然后求逆Z变换:

x[n] = A a^n u[n] + B b^n u[n]

MATLAB示例

以下是一个使用MATLAB进行逆Z变换计算的例子。为了深入理解这一过程,我们计划通过分析这个具体的拉普拉斯变换式 X(z) = \frac{1}{(1-0.5z^{-1})(1-0.2z^{-1})} 来探讨其逆Z变换。

复制代码
    % MATLAB代码示例:计算逆Z变换
    % 设定参数
    a = 0.5; % 信号的衰减因子
    b = 0.2; % 信号的衰减因子
    
    % 定义Z变换
    syms z
    X_z = 1 / ((1 - a*z^-1) * (1 - b*z^-1));
    
    % 计算逆Z变换
    x_n = iztrans(X_z, z, n);
    
    % 显示结果
    disp('逆Z变换 x[n]:');
    disp(x_n);
    
    % 绘制信号的时域图
    n_values = 0:10;
    x_values = double(subs(x_n, n, n_values));
    stem(n_values, x_values);
    title('逆Z变换的时域图');
    xlabel('n');
    ylabel('x[n]');

Python示例

我们下面将展示如何利用Python及其SymPy库包来实现逆Z变换的过程。为了深入理解这一过程,在此我们选择函数X(z)进行分析。其中涉及的关键方程为X(z) = \frac{1}{(1-0.5z^{-1})(1-0.2z^{-1})}等关键表达式进行探讨与求解步骤的具体阐述

复制代码
    # Python代码示例:计算逆Z变换
    import sympy as sp
    
    # 定义符号
    n, z, a, b = sp.symbols('n z a b')
    
    # 定义Z变换
    a_val = 0.5
    b_val = 0.2
    X_z = 1 / ((1 - a*z^-1) * (1 - b*z^-1))
    
    # 计算逆Z变换
    x_n = sp.inverse_ztransform(X_z, z, n)
    
    # 显示结果
    print('逆Z变换 x[n]:')
    print(x_n)
    
    # 绘制信号的时域图
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 替换符号值
    x_n = x_n.subs({a: a_val, b: b_val})
    
    # 计算时域信号
    n_values = np.arange(0, 11)
    x_values = [x_n.subs(n, i) for i in n_values]
    
    # 绘制时域图
    plt.stem(n_values, x_values)
    plt.title('逆Z变换的时域图')
    plt.xlabel('n')
    plt.ylabel('x[n]')
    plt.grid(True)
    plt.show()

Z变换的收敛域

The region of convergence (ROC) associated with the Z-transform refers to the collection of z values for which the Z-transform series converges. This region plays a critical role in determining the uniqueness of the Z-transform and ensuring system stability.

因果信号的ROC

对于定义为x[n] = 0n < 0的信号(称为因果信号),其Z变换的收敛域(ROC)通常位于复平面中满足|z| > R的所有点处;这里的参数R是确保级数绝对收敛的那个最小半径值。

反因果信号的ROC

对于被定义为反因果信号(即满足x[n] = 0n > 0)的序列而言,在Z变换中其收敛域通常表现为半径小于R的圆域内区域(此处R代表级数收敛的最大模)。

双边信号的ROC

对于双面信号(即 x[n] 包括正负时间序列),其Z变换可能会具有环状收敛域 R_1 < |z| < R_2

MATLAB示例

以下是一个使用MATLAB确定Z变换域中的收敛区域(ROC)的示例。我们计划探讨该序列 x[n] = a^n u[n] 在Z域中的收敛区域。

复制代码
    % MATLAB代码示例:确定Z变换的ROC
    % 设定参数
    a = 0.5; % 信号的衰减因子
    
    % 定义信号
    syms n z
    x_n = a^n * heaviside(n); % 因果信号
    
    % 计算Z变换
    X_z = ztrans(x_n, n, z);
    
    % 显示Z变换及其ROC
    disp('Z变换 X(z):');
    disp(X_z);
    disp('ROC: |z| > |a|');

Python示例

我们可以通过利用Python以及SymPy库来计算Z变换的收敛域(ROC)的一个具体案例来说明这一过程。为了深入探讨这一问题,我们选择分析相同因果信号x[n] = a^n u[n]的收敛域。

复制代码
    # Python代码示例:确定Z变换的ROC
    import sympy as sp
    
    # 定义符号
    n, z, a = sp.symbols('n z a')
    
    # 定义信号
    a_val = 0.5
    x_n = a_val**n * sp.Heaviside(n)  # 因果信号
    
    # 计算Z变换
    X_z = sp.ztransform(x_n, n, z)
    
    # 显示Z变换及其ROC
    print('Z变换 X(z):')
    print(X_z)
    print('ROC: |z| > |a|')

Z变换在数字滤波器设计中的应用

Z变换在数字滤波器设计中发挥着核心作用。经过Z变换技术的应用,在时域信号与系统的基础上实现其映射至Z域的过程,并以此为基础使得分析与设计更加便捷。

传输函数的Z变换

说明

Y(z) = H(z) X(z)

滤波器设计

实现数字滤波器时,一般会首先在Z域中确定传递函数H(z).接着,利用逆Z变换来获取滤波器的时域系数.

低通滤波器设计

以下为设计低通滤波器的一个示例。我们打算采用MATLAB来构建一个基本的FIR低通滤波器。

复制代码
    % MATLAB代码示例:设计FIR低通滤波器
    % 设定参数
    fs = 1000; % 采样频率
    fc = 100;  % 截止频率
    N = 10;    % 滤波器阶数
    
    % 设计滤波器
    h = fir1(N, fc/(fs/2));
    
    % 计算滤波器的Z变换
    [H, w] = freqz(h, 1, 512, fs);
    
    % 绘制频率响应
    figure;
    plot(w, 20*log10(abs(H)));
    title('低通滤波器的频率响应');
    xlabel('频率 (Hz)');
    ylabel('幅度 (dB)');
    grid on;

Python示例

我们可以通过Python和SciPy库来实现一个低通滤波器的例子。为了简化处理过程,我们选择设计一个阶次较低的有限冲激响应(FIR)低通滤波器。

复制代码
    # Python代码示例:设计FIR低通滤波器
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.signal import firwin, freqz
    
    # 设定参数
    fs = 1000  # 采样频率
    fc = 100   # 截止频率
    N = 10     # 滤波器阶数
    
    # 设计滤波器
    h = firwin(N + 1, fc, fs=fs)
    
    # 计算滤波器的Z变换
    w, H = freqz(h, 1, fs=fs)
    
    # 绘制频率响应
    plt.plot(w, 20 * np.log10(abs(H)))
    plt.title('低通滤波器的频率响应')
    plt.xlabel('频率 (Hz)')
    plt.ylabel('幅度 (dB)')
    plt.grid(True)
    plt.show()

Z变换在控制系统中的应用

在控制系统领域中,Z变换被用于离散时间系统的分析与设计.借助Z变换方法,我们可以将连续时间系统的传递函数转换成离散时间系统的传递函数形式,并使数字控制更为容易实现.

离散化

离散化是一种将连续时间系统转变为离散时间系统的技术手段。常见的用于离散化的技术包括零阶保持器法以及双线性变换法。

零阶保持器

零阶保持器通过采样作用实现从连续到离散时间信号的转换过程,在此过程中系统假设输入信号在每个采样周期内保持恒定。其数学表达式如下所示:H(z) = \frac{z}{z - 1}

G(z) = \frac{1 - z^{-1}}{s} G(s)

Tustin变换

Tustin变换是一种常见的数字化模型,在工程领域中被广泛采用。它通过双线性变换法实现了从连续时间域到离散时间域的系统模型转换。该公式的具体形式如下所示:

G_d(z) = \frac{2Tz + 1}{2Tz - 1} \cdot \frac{G(s)}{s}

s = \frac{2}{T} \frac{z-1}{z+1}

MATLAB示例

作为运用MATLAB进行离散化设计的一个示例,在本节中我们将采用零阶保持器和Tustin变换来将一个连续时间系统的传递函数转换为相应的离散时间系统的传递函数。

复制代码
    % MATLAB代码示例:离散化设计
    % 设定参数
    fs = 1000; % 采样频率
    T = 1/fs;  % 采样周期
    
    % 定义连续时间系统的传递函数
    s = tf('s');
    G_s = 1 / (s + 1);
    
    % 使用零阶保持器离散化
    G_z_zoh = c2d(G_s, T, 'zoh');
    
    % 使用Tustin变换离散化
    G_z_tustin = c2d(G_s, T, 'tustin');
    
    % 显示结果
    disp('零阶保持器离散化后的传递函数 G(z):');
    disp(G_z_zoh);
    disp('Tustin变换离散化后的传递函数 G(z):');
    disp(G_z_tustin);
    
    % 绘制频率响应
    figure;
    bode(G_s, 'b', G_z_zoh, 'r', G_z_tustin, 'g');
    legend('连续时间系统', '零阶保持器离散化', 'Tustin变换离散化');
    title('系统的频率响应');
    grid on;

Python示例

以下是一个利用Python与SciPy库实现离散化设计的过程性示例。我们采用零阶保持器与Tustin变换的方法来将一个连续时间系统的传递函数转化为离散时间系统的传递函数。

复制代码
    # Python代码示例:离散化设计
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.signal import TransferFunction, cont2discrete
    
    # 设定参数
    fs = 1000  # 采样频率
    T = 1 / fs  # 采样周期
    
    # 定义连续时间系统的传递函数
    num_s = [1]
    den_s = [1, 1]
    G_s = TransferFunction(num_s, den_s)
    
    # 使用零阶保持器离散化
    num_z_zoh, den_z_zoh, _ = cont2discrete((num_s, den_s), T, method='zoh')
    G_z_zoh = TransferFunction(num_z_zoh, den_z_zoh, dt=T)
    
    # 使用Tustin变换离散化
    num_z_tustin, den_z_tustin, _ = cont2discrete((num_s, den_s), T, method='bilinear')
    G_z_tustin = TransferFunction(num_z_tustin, den_z_tustin, dt=T)
    
    # 显示结果
    print('零阶保持器离散化后的传递函数 G(z):')
    print(G_z_zoh)
    print('Tustin变换离散化后的传递函数 G(z):')
    print(G_z_tustin)
    
    # 绘制频率响应
    w, mag_s, phase_s = G_s.bode()
    w, mag_z_zoh, phase_z_zoh = G_z_zoh.bode()
    w, mag_z_tustin, phase_z_tustin = G_z_tustin.bode()
    
    plt.figure()
    plt.semilogx(w, mag_s, 'b', w, mag_z_zoh, 'r', w, mag_z_tustin, 'g')
    plt.legend(['连续时间系统', '零阶保持器离散化', 'Tustin变换离散化'])
    plt.title('系统的频率响应')
    plt.xlabel('频率 (rad/s)')
    plt.ylabel('幅度 (dB)')
    plt.grid(True)
    plt.show()

Z变换在控制系统中的应用总结

Z变换在控制系统中主要用于以下几个方面:

  1. 研究型别较多的信号处理技术时, 通过Z变换, 可以将输入输出关系描述为传输函数 H(z), 从而便于进行系统特性分析.
  2. 对于系统的稳定性判定, 可以通过分析Z变换极点分布位置来确定其稳定性.
  3. 在进行连续时间系统的离散化处理时, 常采用零阶保持器或Tustin变换等方法.
  4. 在数字滤波器综合过程中, 通过Z变换可以实现从时域到Z域的映射过程, 从而便于滤波器的设计与实现.

Z变换的其他应用

信号的频域分析

Z变换主要用于信号的频谱分析。通过将其转换到Z域,我们可以更加直观地识别信号的频率特性,并进而能够实现滤波和频谱分析等多种操作。

系统响应的求解

Z变换广泛应用于分析系统动态特性。假设系统的传输函数表示为H(z)时,则其输入信号X(z)与系统输出信号Y(z)之间的关系可以通过下述方程进行描述

Y(z) = H(z) X(z)

然后通过逆Z变换将 Y(z) 转换回时域,得到系统的输出信号 y[n]

递归滤波器设计

递归滤波器(包括IIR类)的设计通常采用Z域方法。基于Z域来构建传递函数模型有助于更容易地实现其递归特性。

MATLAB示例

以下是一个使用MATLAB设计IIR递归滤波器的示例。

复制代码
    % MATLAB代码示例:设计IIR递归滤波器
    % 设定参数
    fs = 1000; % 采样频率
    fc = 100;  % 截止频率
    N = 4;     % 滤波器阶数
    
    % 设计IIR低通滤波器
    [b, a] = butter(N, fc/(fs/2));
    
    % 计算滤波器的Z变换
    [H, w] = freqz(b, a, 512, fs);
    
    % 显示滤波器的传输函数
    disp('IIR低通滤波器的传输函数 H(z):');
    disp(tf(b, a, T));
    
    % 绘制频率响应
    figure;
    plot(w, 20*log10(abs(H)));
    title('IIR低通滤波器的频率响应');
    xlabel('频率 (Hz)');
    ylabel('幅度 (dB)');
    grid on;

Python示例

以下是一个使用Python和SciPy库设计IIR递归滤波器的示例。

复制代码
    # Python代码示例:设计IIR递归滤波器
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.signal import butter, freqz
    
    # 设定参数
    fs = 1000  # 采样频率
    fc = 100   # 截止频率
    N = 4      # 滤波器阶数
    
    # 设计IIR低通滤波器
    b, a = butter(N, fc / (fs / 2), btype='low', fs=fs)
    
    # 计算滤波器的频率响应
    w, H = freqz(b, a, fs=fs)
    
    # 显示滤波器的传输函数
    print('IIR低通滤波器的传输函数 H(z):')
    print(f'Numerator: {b}')
    print(f'Denominator: {a}')
    
    # 绘制频率响应
    plt.plot(w, 20 * np.log10(abs(H)))
    plt.title('IIR低通滤波器的频率响应')
    plt.xlabel('频率 (Hz)')
    plt.ylabel('幅度 (dB)')
    plt.grid(True)
    plt.show()

Z变换的局限性

尽管Z变换在信号处理和控制系统中非常有用,但它也存在一些局限性:

  1. 仅限于处理离散时间信号:Z变换专为处理离散时间信号而设计,在面对连续时间信号时需先将其转化为离散形式以便应用。
  2. 计算难度:在涉及复杂系统与信号的情形下,Z变换带来的计算负担相对较高,通常需要借助专业的计算工具来辅助完成。
  3. 收敛域要求:Z变换的应用受到其收敛域范围的限制,这种范围往往受到相应序列本质特征的影响,不同类型的序列通常具有各自特定的收敛域范围。

总结

该方法是一种极具影响力的数学工具,在多个领域得到了广泛应用。
通过对信号进行时域到Z域的转换有助于简化系统分析与设计的过程。
其性质与应用使得在处理离散时间信号时更加直观且高效。
同时,在实际应用中需要注意其局限性并加以合理利用。
希望本文能为读者提供深入理解这一重要工具的有益探讨。

全部评论 (0)

还没有任何评论哟~