一、傅里叶变换(FFT)

一维时间序列信号为典型的离散信号,需要使用离散傅里叶变换,FFT变换就是将时域信号转到频域阶段分析,分析更深入,了解时域信号的频域特性。注意傅里叶变换只适用于平稳信号。

F(u)为离散傅里叶变换值,f(n)为逆变换值。

python实现案例:

  1. 简单变换,提取信号特征,画频域图

    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的样子,对上述时域信号又有了不同了解了。

  2. 去噪示例

    # 去噪
    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实现相关推荐

  1. 数字信号处理之变换:傅里叶变换、短时傅里叶变换、小波变换等

    傅里叶变换.拉普拉斯变换.自(互)相关及卷积是线性系统分析里最重要的四个数学工具. 数字信号处理中常用的几种变换:傅里叶变换.短时傅里叶变换.小波变换.希尔伯特-黄变换.拉普拉斯变换. 线性变换:傅里 ...

  2. 傅里叶变换、短时傅里叶变换、小波变换

    顺序:傅里叶-->短时傅里叶变换-->小波变换的顺序 转载自形象易懂的傅里叶变换.短时傅里叶变换和小波变换本文作者按照傅里叶-短时傅里叶变换-小波变换的顺序,由浅到深的解释小波变换的缘由以 ...

  3. 傅里叶级数、傅里叶变换、短时傅里叶变换 公式

    傅里叶级数.傅里叶变换和短时傅里叶变换都是信号处理中常用的工具,它们可以帮助我们分析信号的频谱结构和周期性特征.下面是对这三个概念的详细介绍: 傅里叶级数 傅里叶级数是一种将周期信号分解成一组正弦和余 ...

  4. python短时傅里叶变换_短时傅里叶变换的python实现

    最近复现论文需要用到短时傅里叶变换的代码,在百度谷歌都找了一番,没有找到合适的代码,于是scipy文档内的stft()函数翻译了一遍. 一.scipy.signal.stft函数介绍 scipy.si ...

  5. 用simulink分析傅里叶变换、短时傅里叶变换和小波变换

    参考:https://zhuanlan.zhihu.com/p/22450818?refer=dong5 1.FFT,分析基波的参与时间对傅里叶变换的影响 基波为4个余弦波,用matlab程序控制其参 ...

  6. 利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声

    利用短时傅里叶变换(STFT)对信号进行时频谱分析和去噪声 1.背景  傅里叶变换(TF)对频谱的描绘是"全局性"的,不能反映时间维度局部区域上的特征,人们虽然从傅立叶变换能清楚地 ...

  7. 时频分析:短时傅里叶变换应用

    目录: 前言 实验环境 Matlab spectrogram函数 1语法 2举栗子: 2.1跟踪声音信号里的鸟声轨迹 2.2谱图3d可视化 参考: 前言 之前讲了时频分析的原理,和matlab里面的相 ...

  8. 时频分析:短时傅里叶变换实现(2)

    目录: 文章目录 补充 #前言 之前讲了时频分析的原理,现在来讲讲它在matlab里面的实现. 想要复习原理的同学,可以参照一一下这篇: 短时傅里叶分析 本次讲解中阶的函数,基础的可以参见前面的: 短 ...

  9. matlab时频分析之短时傅里叶变换 spectrogram

    matlab时频分析之短时傅里叶变换 spectrogram 短时傅里叶变换常用于缓慢时变信号的频谱分析,可以观察沿时间变化的频谱信号. 其优点如下图所示,弥补了频谱分析中不能观察时间的缺点,也弥补了 ...

最新文章

  1. Web的现状:网页性能提升指南
  2. 八个最致命的Linux命令!
  3. Spire.XLS试用手记
  4. 2020年阿里大数据一面面经,看看你还有啥不知道的?
  5. php pdo 00000,php-即使有错误,PDO错误代码也总是00000
  6. 经典卷积神经网络的学习(二)—— VGGNet
  7. 多数据源切换数据源注入为空问题
  8. MT6761 android11 linux4.19上IMX258摄像头点不亮原因备忘
  9. 图吧工具箱 硬件检测工具集合 2020.05 最新版,集成了常用的硬件检测与系统维护等工具
  10. Windows设置开机自启动bat脚本
  11. Vue2组件通信方式
  12. PowerShell输出IP地址
  13. 彩色二维码可识别性比较
  14. 囚徒困境博弈Python
  15. RT-Thread 4.1.0 开启 PM 电源管理框架
  16. Android 培训课件编写--- 第1章 Android应用开发概述
  17. DBUS介绍与Linux C实例
  18. Eclipse ShotCut[From internet]
  19. 【WEB】aspcms漏洞利用
  20. 我们如何对用户UGC内容进行安全审核

热门文章

  1. 法学行政法论文选题有哪些?
  2. 计算机科班与培训开发编程的区别在哪里?
  3. Doc2Vec句向量模型PV-DM与PV-DBOW的理解
  4. 数据库和数据库软件的安装
  5. 华为ensp防火墙nat64案例配置
  6. pytorch忽略user warning
  7. 小学计算机基础知识题目,小学信息技术基础知识复习题(清华版第三册)
  8. latex解决存在/任意/非符号如何打
  9. 迅雷2010校园招聘吉林大学第二次笔试题
  10. Shader的基础知识