信号各种变换 python实现 DFT,STFT,CWT,DWT
目录
数据读取
傅里叶变换
短时傅里叶变换
连续小波变换
离散小波变换
import numpy as np
import matplotlib.pyplot as plt
import pywt.data
from scipy.fftpack import fft,ifft
from scipy import signal
数据读取
首先我们有这么一个信号,下图是数据格式,即一列一个数:
我们读取以后只要前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()
傅里叶变换
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()
其中,上图是频率振幅,下图是频率幅角:
短时傅里叶变换
# 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()
显示结果如下:
但是这个着实不太好分析,我们换个简单一点的函数:
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()
显示为:
频率显示也非常正常:一开始频率很高,然后第二段降低,第三段最低,同时重叠区域有两段频率:
设置窗不重叠,则显示为:
连续小波变换
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 Familyhttps://dezeming.top/?page_id=1019的关于Python小波分析的专栏。
修改一下原始信号,变成中间高频,两边低频,得到结果:
离散小波变换
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相关推荐
- OPENCV学习笔记 - SIFT 尺度不变特征变换 Python
OPENCV学习笔记 - SIFT 尺度不变特征变换 Python 为什么我们需要SIFT尺度不变特征变换? 第一,建立高斯差分金字塔 第二,极值点的精确定位 第三,确定关键点的主方向 第四,构建关键 ...
- 单边正弦信号拉斯变换 matlab
单边正弦信号拉氏变换 拉普拉斯变换: 拉普拉斯变换 是 应用数学 中常用的一种 积分变换 ,又名 拉氏转换 ,其符号为 .拉氏变换是一个 线性变换 ,可将一个有引数实数 t ( t ≥ 0)的函数 ...
- 故障诊断数据预处理之1-D振动信号FFT变换后的2-D灰度图转换
文章目录 前言 一.转换原理 二.Matlab代码展示 前言 目前,基于数据驱动的故障诊断方法通常采用深度神经网络来挖掘采集数据中隐藏的信息,实现故障分类.然而,它们大多利用原始的一维时域信号作为DN ...
- 818专业课【考经】—《信号系统》之章节概要:第五章 连续时间信号的变换域分析
本人介绍 -1- 本硕均就读于南京理工大学.本科专业为电子信息工程,硕士专业为信号与信息处理. -2- 2021级研究生,初试专业课分数142分,在所报考专业内专业课成绩排名第一. -3- 有辅导81 ...
- 信号与系统(Python) 学习笔记 (6) 拉普拉斯变换 Laplace Transform
[总目录] (1) 简介 Intro (2) 傅里叶 Fourier 常用函数的傅里叶变换汇总 (3) LTI 系统 与 滤波器 二次抑制载波振幅调制接收系统 Python (4) 取样 Sampli ...
- dft变换的两幅图_离散傅立叶变换DTFT、DFT和FFT在工程与数学结合的通俗理解
1.离散时间傅里叶变换DTFT 何为DTFT?就是对连续时间非周期信号进行抽样(乘积),得到的离散时间非周期信号再求傅里叶变换的过程就是DTFT.其实等同于信号频谱与脉冲信号频谱的卷积,这样得到的就是 ...
- 信号与系统(Python) 学习笔记摘录 (2) 傅里叶 Fourier
[总目录] (1) 简介 Intro (2) 傅里叶 Fourier 常用函数的傅里叶变换汇总 (3) LTI 系统 与 滤波器 二次抑制载波振幅调制接收系统 Python (4) 取样 Sampli ...
- 信号与系统(Python) 学习笔记 (8.1) 离散系统z域分析 -- 系统函数 H(z)
[总目录] (1) 简介 Intro (2) 傅里叶 Fourier 常用函数的傅里叶变换汇总 (3) LTI 系统 与 滤波器 二次抑制载波振幅调制接收系统 Python (4) 取样 Sampli ...
- 希尔伯特黄变换python实现
希尔伯特变换可以从: https://zhuanlan.zhihu.com/p/128092836 https://www.cnblogs.com/hdu-zsk/p/4799470.html 等博客 ...
最新文章
- mysql语句中事务可靠性_MYSQL中的事务
- 手工、工具分别实现cookie注入
- Spring.NET学习笔记10——方法的注入(基础篇) Level 200
- python 时间日期处理
- 循环服务器,并发服务器模型以及I/O多路转接模型
- python神奇的小海龟_Python笔记_第一篇_面向过程_第一部分_8.画图工具(小海龟turtle)...
- 刚刚!第七次人口普查出炉!男性比女性多3490万,老龄化进一步加深
- 【OpenCV】OpenCV函数精讲之 -- addWeighted()函数(线性混合)
- php调用apache,apache调用php执行系统命令
- SWIG 转换C++接口为Java接口
- docker 删除镜像
- MarkDown基础语法笔记
- java一元二次方程用if_用javascript写一个求一元二次方程的页面 用JAVA写一个求解一元二次方程的类...
- 软件验证码显示服务器连接错误,验证码总是提示错误,验证码错误的解决办法 专家详解...
- 杰里之. 输出 3 路 PMW【篇】
- SD卡无法识别怎么办?
- 数据结构——王卓老师
- 我们是创业团队,实习前两月没钱,全栈每月800块!
- 深入了解计算机系统(CS:APP)思考题
- CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。
热门文章
- 在 CSS 中隐藏元素的 10 种方法
- 累计核准率与累计违约率
- Bugku 白哥的鸽子详解 MISC
- 荣耀平板2 android go,TNT go 篇一:​荣耀30Pro的TNT go使用体验
- poj 1833 排列 STL 全排列公式
- QQ小程序流量主怎么开通的,流量主开通技巧。
- IE打不开网页的终极方案
- 环绕上海走一回——《环绕上海》读后感3533字
- C++:左移和右移运算符 (> > 和 < <)
- 【CV面试】RGB2GRAY、贝叶斯问题、cv2.add和cv2.addWeighted