时间序列信号处理(四)——傅里叶变换和短时傅里叶变换python实现
一、傅里叶变换(FFT)
一维时间序列信号为典型的离散信号,需要使用离散傅里叶变换,FFT变换就是将时域信号转到频域阶段分析,分析更深入,了解时域信号的频域特性。注意傅里叶变换只适用于平稳信号。
F(u)为离散傅里叶变换值,f(n)为逆变换值。
python实现案例:
- 简单变换,提取信号特征,画频域图
import matplotlib.pyplot as plt import numpy as np from scipy.fftpack import fft, ifftFs = 2000 Ts = 1.0/Fs N = 2000 t = np.linspace(0, N*2000, N) k = np.arange(2000) frq = k*Fs/N frq1 = frq[range(int(N/2))]data = 2*np.sin(4*np.pi*50*t) + 4*np.sin(4*np.pi*120*t)plt.plot(data, 'grey') plt.xlabel('time') plt.ylabel('amplitude') plt.title("data") plt.show()# 原始图像单边谱 data_f = abs(np.fft.fft(data))/N data_f1 = data_f[range(int(N/2))] plt.plot(frq1, data_f1, 'red') plt.xlabel('pinlv(hz)') plt.ylabel('amplitude') plt.title("pinputu") plt.show()
可以明显看出来这个信号的主要频率为100和250hz的样子,对上述时域信号又有了不同了解了。
去噪示例
# 去噪 data1 = 3*np.cos(3*np.pi*2*t)+4*np.sin(3*np.pi*4*t) data1 = data1 + 0.3 * np.random.normal(size=data1.size) plt.plot(data1, 'grey') plt.xlabel('time ') plt.ylabel('amplitude') plt.title("data") plt.show()y = fft(data1) threadhold = 50 y[threadhold:(N-threadhold)] = 0 # 滤波器data_c = ifft(y) plt.plot(data_c) plt.title('signal after filtering') plt.xlabel('time') plt.ylabel('amplitude') plt.show()
可以看出去噪效果还是可以,这样就有利于信号的重构,利用FFT和Ifft变换实现去噪。
二、 短时傅里叶变换STFT
短时傅里叶变换就是在傅里叶变换的基础上进行了加窗处理,这也就提升了对非平稳信号的处理能力,强化了特征提取能力。
式中, x(m) 是输入信号;w(m) 是窗函数;它在时间上翻转并且有 n 个样本的偏移量;X(n,w) 是定义在样本(时间)和频率上的二维函数。
注意:FFT也不能辨别信号不同。
案例:
import matplotlib.pyplot as plt
import numpy as np
from scipy.fftpack import fft, ifft
from scipy.signal import stftfs = 1000
N = 1000
k = np.arange(2000)
frq = k*fs/N
frq1 = frq[range(int(N/2))]t = np.linspace(0, 1-1/fs, fs)
x = np.linspace(0, 4000, 4000)
y1 = 100 * np.cos(2 * np.pi * 100 * t)
y2 = 200 * np.cos(2 * np.pi * 200 * t)
y3 = 300 * np.cos(2 * np.pi * 300 * t)
y4 = 400 * np.cos(2 * np.pi * 400 * t)
y = np.append(y1, y2)
yy = np.append(y3, y4)
yyy = np.append(y, yy)# 画原始图
plt.plot(x, yyy)
plt.xlabel('time')
plt.ylabel('amplitude')
plt.title("data")
plt.show()data_f = abs(np.fft.fft(y1))/N
data_f1 = data_f[range(int(N/2))]
plt.plot(frq1, data_f1)data_ff = abs(np.fft.fft(y2))/N
data_f2 = data_ff[range(int(N/2))]
plt.plot(frq1, data_f2, 'red')data_fff = abs(np.fft.fft(y3))/N
data_f3 = data_fff[range(int(N/2))]
plt.plot(frq1, data_f3, 'k')data_ffff = abs(np.fft.fft(y4))/N
data_f4 = data_ffff[range(int(N/2))]
plt.plot(frq1, data_f4, 'b')plt.xlabel('pinlv(hz)')
plt.ylabel('amplitude')
plt.title("pinputu")
plt.show()window = 'hann'
# frame长度
n = 256# STFT
f, t, Z = stft(yyy, fs=fs, window=window, nperseg=n)
# 求幅值
Z = np.abs(Z)
# 如下图所示
plt.pcolormesh(t, f, Z, vmin=0, vmax=Z.mean()*10)
plt.show()# 反着画
k1 = np.append(y4, y3)
k2 = np.append(y2, y1)
k = np.append(k1, k2)plt.plot(x, k)
plt.xlabel('time')
plt.ylabel('amplitude')
plt.title("data")
plt.show()data_f = abs(np.fft.fft(y1))/N
data_f1 = data_f[range(int(N/2))]
plt.plot(frq1, data_f1)data_ff = abs(np.fft.fft(y2))/N
data_f2 = data_ff[range(int(N/2))]
plt.plot(frq1, data_f2, 'red')data_fff = abs(np.fft.fft(y3))/N
data_f3 = data_fff[range(int(N/2))]
plt.plot(frq1, data_f3, 'k')data_ffff = abs(np.fft.fft(y4))/N
data_f4 = data_ffff[range(int(N/2))]
plt.plot(frq1, data_f4, 'b')plt.xlabel('pinlv(hz)')
plt.ylabel('amplitude')
plt.title("pinputu")
plt.show()window = 'hann'
# frame长度
n = 256
# STFT
f, t, Z = stft(k, fs=fs, window=window, nperseg=n)
# 求幅值
Z = np.abs(Z)
# 如下图所示
plt.pcolormesh(t, f, Z, vmin=0, vmax=Z.mean()*10)
plt.show()
正着画图,其原始图、频谱图及时频图如下:
反着画图,其原始图、频谱图及时频图如下:
由上述对比可以知道,FFT只能看出两个信号数据的频率分布,并不能分别两个信号,而时频图可以,说明stft对信号又有更深的理解。
时间序列信号处理(四)——傅里叶变换和短时傅里叶变换python实现相关推荐
- 数字信号处理之变换:傅里叶变换、短时傅里叶变换、小波变换等
傅里叶变换.拉普拉斯变换.自(互)相关及卷积是线性系统分析里最重要的四个数学工具. 数字信号处理中常用的几种变换:傅里叶变换.短时傅里叶变换.小波变换.希尔伯特-黄变换.拉普拉斯变换. 线性变换:傅里 ...
- 傅里叶变换、短时傅里叶变换、小波变换
顺序:傅里叶-->短时傅里叶变换-->小波变换的顺序 转载自形象易懂的傅里叶变换.短时傅里叶变换和小波变换本文作者按照傅里叶-短时傅里叶变换-小波变换的顺序,由浅到深的解释小波变换的缘由以 ...
- 傅里叶级数、傅里叶变换、短时傅里叶变换 公式
傅里叶级数.傅里叶变换和短时傅里叶变换都是信号处理中常用的工具,它们可以帮助我们分析信号的频谱结构和周期性特征.下面是对这三个概念的详细介绍: 傅里叶级数 傅里叶级数是一种将周期信号分解成一组正弦和余 ...
- python短时傅里叶变换_短时傅里叶变换的python实现
最近复现论文需要用到短时傅里叶变换的代码,在百度谷歌都找了一番,没有找到合适的代码,于是scipy文档内的stft()函数翻译了一遍. 一.scipy.signal.stft函数介绍 scipy.si ...
- 用simulink分析傅里叶变换、短时傅里叶变换和小波变换
参考:https://zhuanlan.zhihu.com/p/22450818?refer=dong5 1.FFT,分析基波的参与时间对傅里叶变换的影响 基波为4个余弦波,用matlab程序控制其参 ...
- 利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声
利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声 1.背景 傅里叶变换(TF)对频谱的描绘是"全局性"的,不能反映时间维度局部区域上的特征,人们虽然从傅立叶变换能清楚地 ...
- 时频分析:短时傅里叶变换应用
目录: 前言 实验环境 Matlab spectrogram函数 1语法 2举栗子: 2.1跟踪声音信号里的鸟声轨迹 2.2谱图3d可视化 参考: 前言 之前讲了时频分析的原理,和matlab里面的相 ...
- 时频分析:短时傅里叶变换实现(2)
目录: 文章目录 补充 #前言 之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现. 想要复习原理的同学,可以参照一一下这篇: 短时傅里叶分析 本次讲解中阶的函数,基础的可以参见前面的: 短 ...
- matlab时频分析之短时傅里叶变换 spectrogram
matlab时频分析之短时傅里叶变换 spectrogram 短时傅里叶变换常用于缓慢时变信号的频谱分析,可以观察沿时间变化的频谱信号. 其优点如下图所示,弥补了频谱分析中不能观察时间的缺点,也弥补了 ...
最新文章
- Web的现状:网页性能提升指南
- 八个最致命的Linux命令!
- Spire.XLS试用手记
- 2020年阿里大数据一面面经,看看你还有啥不知道的?
- php pdo 00000,php-即使有错误,PDO错误代码也总是00000
- 经典卷积神经网络的学习(二)—— VGGNet
- 多数据源切换数据源注入为空问题
- MT6761 android11 linux4.19上IMX258摄像头点不亮原因备忘
- 图吧工具箱 硬件检测工具集合 2020.05 最新版,集成了常用的硬件检测与系统维护等工具
- Windows设置开机自启动bat脚本
- Vue2组件通信方式
- PowerShell输出IP地址
- 彩色二维码可识别性比较
- 囚徒困境博弈Python
- RT-Thread 4.1.0 开启 PM 电源管理框架
- Android 培训课件编写--- 第1章 Android应用开发概述
- DBUS介绍与Linux C实例
- Eclipse ShotCut[From internet]
- 【WEB】aspcms漏洞利用
- 我们如何对用户UGC内容进行安全审核