数字信号处理10:Z变换(2)

news2024/10/7 16:18:56

今天我就不写后面的Z变换的剩下的东西了,直接写代码:

说实话,Python的Scipy.signal里面是没有和matlab一样的ztrans和iztrans,这让我头疼了几天时间,但是后面,看文档的时候,突然发现,czt是可以完成这一功能的,我们来一个很简单的z变换和z逆变换,用的也只是两个很简单的函数模块:

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
from scipy import signal as sign
# n=np.linspace(0,20,21,dtype= int)
n=np.array([0,1,2,3,4])
print(n)
n_ztrans=sign.czt(n)
print(n_ztrans)
n_iztrans=np.fft.ifft(n_ztrans)
print(n_iztrans.real)

上述代码中,我们用signal中的czt来实现逆变换,用np.fft.ifft函数来实现z逆变换,最后我们输出z逆变换的实部就好

具体的,我实现的从matlab转换过来的都还比较少,所以这一次的代码还是比较少的,但是,在这个基础上继续实践的话,会好很多。

首先,让我们来看一个系统的频响曲线:

H(z)=\frac{z-1.3}{z}

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack,signal
B=np.array([1,-1.3])
A=np.array([1,0])
z,p,k=signal.tf2zpk(B,A)
w,h=signal.freqz_zpk(z,p,k,whole=True)
hf=np.abs(h)
hg=np.angle(h)
fig=plt.figure()
ax1=fig.add_subplot(1,2,1)
ax1.plot(w,hf)
ax1.grid(visible=True)
ax2=fig.add_subplot(1,2,2)
ax2.plot(w,hg)
ax2.grid(visible=True)
plt.show()

这里用到的两个函数:tf2zpk,zpk2tf,再用freqz_zpk函数来计算离散时间系统的频响特性(是计算得到的h的频率、h是频率(一个复数数组)),B是分子系数,A是分母,用tf2zpk函数将信号从时域转换到z域,输出的两个数组和一个数字,其中,z是零点数组,p是极点数组,k是系统增益,这样子,我们就能够得到了离散系统幅频特性曲线ax1和拉萨系统相频特性曲线ax2(主要是用jupyter绘图的时候,汉字标题一直乱码,我就直接在后面去写了):

左:ax1;右:ax2​​

 那么,同样的,我们再对另一个系统来绘制幅频响应和相频响应:

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
from scipy import signal as sign
import cmath

w=np.linspace(-4*np.pi,4*np.pi,25120,dtype= float)
x=1/(1-0.6*np.exp(-cmath.sqrt(-1)*w))
xa=np.abs(x)
xangle=np.angle(x)
fig=plt.figure()
ax1=fig.add_subplot(2,1,1)
ax1.plot(w/np.pi,xa)
ax2=fig.add_subplot(2,1,2)
ax2.plot(w/np.pi,xangle)
plt.show()

和之前的一样,第一幅图是幅频,第二幅是相频:

 然后,要会画零极点图:

这里还画了单位圆,以方便我们观察,主要是对应的:

H(z)=\frac{Y(z)}{X(z)}=\frac{b_1z^m+b_2z^{m-1}+\cdots+b_mz+b_{m+1}}{a_1z^m+a_2z+\cdots+a_nz+a_{n+1}}

这样子的公式,那么我们就可以这样操作:

假设有个函数:

H(z)=\frac{2z+1}{3z^5-2z^4+1}

这时候,tf2zpk和zpk2tf就可以很好的发挥功效,计算零点、极点、增益,当然,这会我们还会画单位圆:

#零点分析
import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
from scipy import signal as sign
import cmath
omega=np.linspace(0,2*np.pi,600,dtype=float)
t=np.exp(cmath.sqrt(-1)*omega)
B=[2,1]
A=[3,-1,0,0,0,1]
z,p,k=sign.tf2zpk(B,A)
absz=np.abs(z)
absp=np.abs(p)
abspmax=np.max(absp)
absk=np.abs(k)
x=max(absz,abspmax,1)
x+=0.1
y=x
xx=t.real
yy=t.imag
plt.plot(xx,yy,'blue')
plt.axis('square')
plt.plot(p.real,p.imag,'x')
plt.plot(z.real,z.imag,'o')
xlim=np.linspace(-x,x,300)
ylim=np.linspace(-y,y,300)
zlim=np.zeros(300)
plt.plot(xlim,zlim,'black')
plt.plot(zlim,ylim,'black')
plt.axis([-x,x,-y,y])
plt.title("zero and pole ")
plt.text(0.1,1.0,'Imag(z)')
plt.text(1.0,-0.1,'Real(z)')
plt.grid(visible=True)
plt.show()

我试了一下,基本上没有问题,当x的size<=1的时候,这个方法,会报错,解决的方法也很简单:

# absp=np.abs(p)
# abspmax=np.max(absp)
#absk=np.abs(k)
# x=max(absz,abspmax,1)
x=1

注释掉上面这些,然后让x=1就好,这样我们就可以得到系统响应的零极点图:

 

 

我本来想着把书后练习题给贴几个,但是想了想,没啥用,就没有再贴,但是原理大同小异,没什么新奇的地方。

随后我们来看一下,两个系统差分方程的单位脉冲:

y(n)+0.75(yn-1)+0.125y(n-2)=x(n)-x(n-1)

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
from scipy import signal as sign
def filter_matlab(b,a,x):
  y = []
  y.append(b[0] * x[0])
  for i in range(1,len(x)):
    y.append(0)
    for j in range(len(b)):
      if i >= j :
        y[i] = y[i] + b[j] * x[i - j ]
        j += 1
    for l in range(len(b)-1 ):
      if i >l:
        y[i] = (y[i] - a[l+1] * y[i -l-1])
        l += 1
    i += 1
  return y
p=[1,-1,0]
q=[1,0.75,0.125]
x_delta=np.zeros(32)
x_delta[0]=1
h_delta=filter_matlab(p,q,x_delta)
fig=plt.figure()
ax1=fig.add_subplot(2,1,1)
ax1.stem(np.linspace(0,31,32,dtype=int),h_delta)
x1=np.ones(32)
h_unit=filter_matlab(p,q,x_delta)
ax2=fig.add_subplot(2,1,2)
ax2.stem(np.linspace(0,31,32,dtype=int),h_unit)
ax1.grid(visible=True)
ax2.grid(visible=True)
ax1.set_title("function 1 using Unit impulse response")
ax2.set_title("function using Unit step response")
plt.show()

需要注意的地方是,因为Python没有filter函数的,所以我再网上找了一份filter_matlab函数来进行实现,可以得到下面这样子的结果:

 好了,z变换这两天就搞了这么多,主要两个原因:1、因为师兄给我说,我们用不上z变换,简简单单的傅里叶变换就够了,2、我自学,也没有看网课,存留了很多问题待解决,基本上是理论还没怎么通顺,所以,z变换在此也不再过多赘述,如果有需要,或者对我的代码有疑义的,可以留言大家一起解决啊!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2模拟贪吃蛇小游戏

目录 一、效果展示 二、代码展示 三、原理讲解 3.1、页面创建 3.2、创建蛇与食物 3.3、移动与边界判断 3.4、吃、得分总结 二、代码展示 view的本地文件&#xff1a;可直接运行。 <template><div class"game"><div class"game-div"…

【架构基础】SOLID原则

SOLID原则是一套坚实而有效的软件设计原则&#xff0c;它由Robert C. Martin&#xff08;也称为 Uncle Bob&#xff09;在2000年提出&#xff0c;旨在帮助软件开发者设计出高内聚低耦合的软件&#xff0c;构建易于测试、可维护和可扩展的软件系统&#xff0c;降低软件后期的维护…

青春永不散场

虽然人生总是在不断的离别与相遇&#xff0c;但请相信这一次的离别是为了下次更美好的相遇。 一.毕业感想 四年的大学生活即将画上句号&#xff0c;让我不由得感慨万千。这四年里&#xff0c;我经历了无数的挑战和机遇&#xff0c;也结交了一群志同道合的朋友&#xff0c;收获…

抖音小程序+抖音矩阵系统开发:新玩法,新趋势

抖音seo优化源码&#xff0c;抖音seo矩阵系统搭建&#xff0c;抖音账号矩阵系统开发&#xff0c;企业在做账号矩阵过程中&#xff0c;最头疼的莫过于私域线索转化&#xff0c;作为开发者都知道&#xff0c;目前市面上我们了解的矩阵系统除了挂载POI信息外&#xff0c;无法挂载留…

【剑指offer】旋转数组的最小数字

文章目录 题目思路代码实现 题目 题目链接入口&#xff1a;JZ11 旋转数组的最小数字 思路 1.核心考点 &#xff08;1&#xff09;数组理解&#xff0c;二分查找&#xff0c;临界条件。 2.解题思路 &#xff08;1&#xff09;题目要求查找出一维数组的最小值&#xff0c;本…

变分模态分解(VMD)学习

目录 概述构造变分问题变分求解问题(引入拉格朗日)关于变分构造中的函数理解关于Uk(t)关于希尔伯特变换关于频谱调制 VMD算法(python) 概述 变分模态分解由Konstantin Dragomiretskiy于2014年提出&#xff0c;可以很好抑制EMD方法的模态混叠现象&#xff08;通过控制带宽来避免…

信息竞赛笔记(2)––快速幂

目录 快速幂 定义 分析 代码 递归实现 非递归实现(通用方法) 模意义下取幂 快速幂 定义 快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在的时间内计算的小技巧&#xff0c;而暴力的计算需要的时间。 这个技巧也常常用在非计算的场景&#xff0c;因为它可…

【论文】通过基准分析优化联邦人员重新识别的性能

论文链接 目录 摘要1. 绪论2. 相关工作2.1 人员重新识别2.2 联邦学习 3. 联邦 个人REID基准3.1 数据集3.2 联合方案3.3 模型结构3.4 联邦学习算法3.5 性能指标3.6 参考实现4.1 通过相机联合方案4.2 按数据集联合方案 5. 性能优化5.1 知识蒸馏5.2 权重调整5.3 知识蒸馏和体重调…

提高代码质量的秘诀:类、方法、字段和包注释

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f362; 一、注释的插入 &#x1f363; 二、类注释 &#x1f364; 三、方法注释 &#x1f365; 四、字段注释 &#x1f96e; 五、…

GreenPlum集群部署之抽丝剥茧

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

【stable diffusion原理解读通俗易懂,史诗级万字爆肝长文,喂到你嘴里】

文章目录 一、前言&#xff08;可跳过&#xff09;二、stable diffusion1.clip2.diffusion modelforward diffusion &#xff08;前向扩散&#xff09;逆向扩散&#xff08;reverse diffusion&#xff09;采样图阶段小结 3.Unet modeltimestep_embedding采用正余弦编码 三、sta…

华为OD机试真题 Java 实现【求符合要求的结对方式】【2023Q1 100分】,附详细解题思路

一、题目描述 用一个数组A代表程序员的工作能力&#xff0c;公司想通过结对编程的方式提高员工的能力&#xff0c;假设结对后的能力为两个员工的能力之和&#xff0c;求一共有多少种结对方式使结对后能力为N。 二、输入描述 6 2 3 3 4 5 1 6 第一行为员工的总人数&#xff…

精简总结:一文说明软件测试基础概念

基础概念-1 基础概念-2 目录 一、什么是软件测试&#xff1f; 二、软件测试的特点 三、软件测试和开发的区别 1、内容&#xff1a; 2、技能区别 3、工作环境 4、薪水 5、发展前景 6、繁忙程度 7、技能要求 四、软件测试与调试的区别 1、角色 2、目的 3、执行的阶…

Lecture 7 Deep Learning for NLP: Feedforward Networks

目录 Deep LearningFeedforward Neural Network 前馈神经网络Neuron 神经元Output Layer 输出层OptimizationRegularization 正则化Topic Classification 主题分类Language Model as Classifiers 语言模型作为分类器Word Embeddings 词嵌入Training a Feed-Forward Neural Netw…

RVOS操作系统协作式多任务切换实现-03

RVOS操作系统协作式多任务切换实现-03 任务&#xff08;task&#xff09;多任务 &#xff08;Multitask&#xff09;任务上下文&#xff08;Context&#xff09;多任务系统的分类协作式多任务 创建和初始化第 1 号任务切换到第一号任务执行协作式多任务 - 调度初始化和任务创建…

虚拟机-安装与使用2023

虚拟机-安装与使用 前言 一、虚拟机 1.VMware 2.Virtualbox 二、VMware 的下载 三、VMware 的安装 四、验证是否安装成功 五、运行 VMware 六、VMware 上安装其它操作系统 安装 Windows 10安装 CentOS-Linux安装 Kali-Linux 七、VMware 常用功能同步时间系统备份克隆快照内存设…

黑马Redis视频教程高级篇(多级缓存案例导入说明)

目录 一、安装MYSQL 1.1、准备目录 1.2、运行命令 1.3、修改配置 1.4、重启 二、导入SQL 三、导入Demo工程 3.1、分页查询商品 3.2、新增商品 3.3、修改商品 3.4、修改库存 3.5、删除商品 3.6、根据id查询商品 3.7、根据id查询库存 3.8、启动 四、导入商品查询…

Maven高级——私服(完结撒花!)

作用与介绍 一个公司内有两个项目组&#xff0c;如果其中一个开发了一个依赖tlias-utils,另一个项目组要使用的话要么就是传过来直接install放到自己的本地仓库里面的。 但是也可以搭建一个公共仓库&#xff0c;专门供公司局域网内部使用&#xff0c;也就是所谓私服。 然后在…

chatgpt赋能python:Python反向函数:在编程中的威力

Python反向函数&#xff1a;在编程中的威力 在Python中&#xff0c;反向函数是一个强大且常用的工具&#xff0c;可以帮助程序员在编写代码时更加高效和精确地处理数据。在本文中&#xff0c;我们将讨论Python反向函数的用途和实现&#xff0c;并详细介绍如何在您的代码中使用…

Java007——Java注释介绍

围绕以下3点介绍&#xff1a; 1、什么是Java注释&#xff1f; 2、Java注释的作用&#xff1f; 3、Java注释长什么样&#xff0c;以及怎么使用Java注释&#xff1f; 一、什么是Java注释&#xff1f; Java注释是在Java程序中用来描述代码的特殊语句。 注释被忽略并且不被编译器…