信号各种变换 python实现 DFT,STFT,CWT,DWT

信号各种变换 python实现 DFT,STFT,CWT,DWT目录数据读取傅里叶变换短时傅里叶变换数据读取首先我们有这么一个信号 下图是数据格式 即一列一个数 我们读取以后只要前 500 个数 a b withopen ECG1 1 txt asfile obj forcontentin obj a append int content foriinrange 500 b append a i plt plot b plt show

目录

数据读取

傅里叶变换

短时傅里叶变换

连续小波变换

离散小波变换


数据读取

首先我们有这么一个信号,下图是数据格式,即一列一个数:

信号各种变换 python实现 DFT,STFT,CWT,DWT

我们读取以后只要前500个数:

a = [] b = [] with open("ECG1_1.txt") as file_obj: for content in file_obj: a.append(int(content)) for i in range(500): b.append(a[i]) plt.plot(b) plt.show()

信号各种变换 python实现 DFT,STFT,CWT,DWT

傅里叶变换

fft_b=fft(b) abs_b = np.abs(fft_b) # 取复数的模 angle_b = np.angle(fft_b) # 取复数的幅角 plt.figure() plt.plot(abs_b) plt.figure() plt.plot(angle_b) plt.show()

其中,上图是频率振幅,下图是频率幅角:

信号各种变换 python实现 DFT,STFT,CWT,DWT

短时傅里叶变换

# fs:时间序列的采样频率, nperseg:每个段的长度 noverlap:段之间重叠的点数。如果没有则noverlap=nperseg/2 f, t, nd = signal.stft(b ,fs = 1.0,window ='hann',nperseg = 150,noverlap = 50) plt.pcolormesh(t, f, np.abs(nd), vmin = 0, vmax = 4) plt.title('STFT') plt.ylabel('frequency') plt.xlabel('time') plt.show()

显示结果如下:

信号各种变换 python实现 DFT,STFT,CWT,DWT

但是这个着实不太好分析,我们换个简单一点的函数:

aa = [] for i in range(200): aa.append(np.sin(0.3*np.pi*i)) for i in range(200): aa.append(np.sin(0.13*np.pi*i)) for i in range(200): aa.append(np.sin(0.05*np.pi*i)) plt.plot(aa) plt.show() # fs:时间序列的采样频率, nperseg:每个段的长度 noverlap:段之间重叠的点数。如果没有则noverlap=nperseg/2 f, t, nd = signal.stft(aa ,fs = 1.0,window ='hann',nperseg = 150,noverlap = 50) plt.pcolormesh(t, f, np.abs(nd), vmin = 0, vmax = 4) plt.title('STFT') plt.ylabel('frequency') plt.xlabel('time') plt.show()

显示为:

信号各种变换 python实现 DFT,STFT,CWT,DWT

频率显示也非常正常:一开始频率很高,然后第二段降低,第三段最低,同时重叠区域有两段频率:

信号各种变换 python实现 DFT,STFT,CWT,DWT

设置窗不重叠,则显示为:

信号各种变换 python实现 DFT,STFT,CWT,DWT

连续小波变换

sampling_rate = 1024 wavename = 'cgau8' totalscal = 256 # 中心频率 fc = pywt.central_frequency(wavename) # 计算对应频率的小波尺度 cparam = 2 * fc * totalscal scales = cparam / np.arange(totalscal, 0, -1) [cwtmatr, frequencies] = pywt.cwt(aa, scales, wavename, 1.0 / sampling_rate) plt.figure(figsize=(8, 4)) plt.subplot(211) t = np.arange(0, 600, 1.0) plt.plot(t, aa) plt.xlabel(u"time(s)") plt.subplot(212) plt.contourf(t, frequencies, abs(cwtmatr)) plt.ylabel(u"freq(Hz)") plt.xlabel(u"time(s)") plt.subplots_adjust(hspace=0.4) plt.show()

具体的解释可以参考我的网站中:

小波分析 – Dezeming Family信号各种变换 python实现 DFT,STFT,CWT,DWThttps://dezeming.top/?page_id=1019的关于Python小波分析的专栏。

修改一下原始信号,变成中间高频,两边低频,得到结果:

信号各种变换 python实现 DFT,STFT,CWT,DWT

离散小波变换

wavename = 'db5' cA, cD = pywt.dwt(aa, wavename) ya = pywt.idwt(cA, None, wavename,'smooth') # approximated component yd = pywt.idwt(None, cD, wavename,'smooth') # detailed component x = range(len(aa)) plt.figure(figsize=(12,9)) plt.subplot(311) plt.plot(x, aa) plt.title('original signal') plt.subplot(312) plt.plot(x, ya) plt.title('approximated component') plt.subplot(313) plt.plot(x, yd) plt.title('detailed component') plt.tight_layout() plt.show() 

离散小波变换DWT:

CWT的“连续性”,以及它与离散小波变换的区别,是它运行的尺度和位置集。 与离散小波变换不同,CWT可以在每一个尺度上进行操作,从原始信号的尺度到某个最大尺度。(当然对于计算机来说,也是从中抽取一定数量的离散尺度)

而且CWT在移位方面也是连续的,即在计算过程中,分析函数的整个域上平滑地移位(对于计算机来说,也是根据时间分辨率来离散的移位)。

上面的函数把信号分成了低频近似和高频细节两个部分:

信号各种变换 python实现 DFT,STFT,CWT,DWT

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226441.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:54
下一篇 2026年3月16日 下午10:54


相关推荐

  • Nelder–Mead method

    Nelder–Mead method

    2021年9月15日
    61
  • ScriptManager局部刷新「建议收藏」

    ScriptManager局部刷新「建议收藏」ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功能。几个重要的属性:ScriptManager控件的EnablePartialRendering属性:true…

    2022年7月13日
    19
  • 呼叫中心系统的概念及应用

    呼叫中心系统的概念及应用呼叫中心系统的概念呼叫中心又叫作客户服务中心 它是一种基于 CTI ComputerTele 计算机电话集成 技术 充分利用通信网和计算机网的多项功能集成 并与企业连为一体的一个完整的客服中心电话系统 利用现有的各种先进的通信手段 有效地为客户提供高质量 高效率 全方位的服务 初看起来呼叫中心好像是企业在最外层加上一个服务层 实际上它不仅仅为外部用户 也为整个企

    2026年3月17日
    2
  • python爬虫——淘宝书包

    python爬虫——淘宝书包importreimportrequestsdefgetHTMLText(url):try:headers={‘user-agent’:’Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809….

    2022年6月17日
    45
  • 数据结构学习笔记(二)–ElemType是什么?

    数据结构学习笔记(二)–ElemType是什么?ElemType(也有的书上称之为elemtp)是数据结构的书上为了说明问题而用的一个词。它是elementtype(“元素的类型”)的简化体。 因为数据结构是讨论抽象的数据存储和算法的,一种结构中元素的类型不一定是整型、字符型、浮点型或者用户自定义类型,为了不重复说明,使用过程中用“elemtype”代表所有可能的数据类型,简单明了的概括了整体。在算法中,除特别说明外,规定ElemType的默

    2022年5月12日
    80
  • CAN2.0和J1939协议的关系

    CAN2.0和J1939协议的关系转发自http://www.cankau.cn/support/help/can-vs-j1939.html很长时间没搞明白j1939与CAN2.0的关系,这篇文章让我明白了。CAN2.0是一种总线规范,是数据链路层的技术。J1939是SAE(美国汽车协会)定义的基于CAN总线的规范,目的是解决不同发动机厂商、不同ECU厂商的兼容性问题。1、J1939和CAN2.0的关系J1939是在CAN2.0…

    2022年5月18日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号