信号处理 | 短时傅里叶变换实战

短时傅里叶变换(STFT)原理

短时傅里叶变换(Short-Time Fourier Transform, STFT)是一种分析时变信号频率特性的方法。它通过将长时间的信号分割成较短的时间片段,然后对每个时间片段进行傅里叶变换,从而克服了传统傅里叶变换无法同时提供时间和频率信息的限制。
原理

  1. 分割信号:STFT首先将连续的信号分割成较短的时间片段。这通常通过乘以一个滑动窗口函数来实现,窗口函数在特定的时间区间内非零,并随着时间滑动。

  2. 窗口函数:窗口函数的选择对STFT的结果有重要影响。常用的窗口函数包括矩形窗、汉宁窗、汉明窗等。窗口函数的宽度(或称为窗口长度)决定了时间分辨率和频率分辨率的平衡:窗口越宽,频率分辨率越高,时间分辨率越低;窗口越窄,时间分辨率越高,频率分辨率越低。

  3. 傅里叶变换:对每个时间片段应用傅里叶变换,计算该时间片段内信号的频率成分。这样,每个时间片段都对应一个频谱。

  4. 时间-频率表示:将所有时间片段的傅里叶变换结果组合起来,就可以得到信号的时间-频率表示,即STFT的结果。这个结果通常表示为一个二维数组,其中一个维度表示时间,另一个维度表示频率。
    数学表达式

STFT的数学表达式为:
S T F T { x ( t ) } ( τ , ω ) = ∫ − ∞ + ∞ x ( t ) ⋅ w ( t − τ ) ⋅ e − j ω t d t STFT\{x(t)\}(τ, ω) = \int_{-\infty}^{+\infty} x(t) \cdot w(t-τ) \cdot e^{-jωt} dt STFT{x(t)}(τ,ω)=+x(t)w(tτ)etdt
其中, x ( t ) x(t) x(t)是原始信号, w ( t − τ ) w(t-τ) w(tτ)是窗口函数, τ τ τ是时间变量,表示当前窗口的中心位置, ω ω ω是频率变量。
应用

STFT广泛应用于信号处理领域,如语音分析、音乐处理、地震数据分析等,它能够提供信号随时间变化的频率信息,对于非平稳信号分析尤为重要。

示例代码

生成模拟信号

import numpy as np
import scipy.io as scio

from matplotlib import pyplot as plt
from matplotlib import rcParams

绘制原始时域信号

def plt_time_domain(arr, fs=1600, ylabel='Amp(mg)', title='原始数据时域图', img_save_path=None, x_vline=None, y_hline=None):
    """
    :fun: 绘制时域图模板
    :param arr: 输入一维数组数据
    :param fs: 采样频率
    :param ylabel: y轴标签
    :param title: 图标题
    :return: None
    """
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
    plt.rcParams['axes.unicode_minus'] = False  # 显示负号
    font = {'family': 'Times New Roman', 'size': '20', 'color': '0.5', 'weight': 'bold'}
    
    plt.figure(figsize=(12,4))
    length = len(arr)
    t = np.linspace(0, length/fs, length)
    plt.plot(t, arr, c='g')
    plt.xlabel('t(s)')
    plt.ylabel(ylabel)
    plt.title(title)
    if x_vline:
        plt.vlines(x=x_vline, ymin=np.min(arr), ymax=np.max(arr), linestyle='--', colors='r')
    if y_hline:
        plt.hlines(y=0.2, xmin=np.min(t), xmax=np.max(t), linestyle=':', colors='y')
    #===保存图片====#
    if img_save_path:
        plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
    plt.show()
fs = 100  # 采样频率
f = 200    # 模拟正弦信号频率
time = 5  # 采样时长
t = np.linspace(0, time, time*fs)
data = 1*np.sin(2*np.pi*f*t) + np.random.normal(0, 0.1, time*fs)
plt_time_domain(data, fs=fs)

在这里插入图片描述

绘制STFT图

import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt
 
f, t, nd = signal.stft(data, fs=fs, window='hann', nperseg=128, noverlap=64,nfft=None,
                       detrend=False, return_onesided=True, boundary='odd', padded=False, axis=-1)
#  fs:时间序列的采样频率,  nperseg:每个段的长度,默认为256(2^n)   noverlap:段之间重叠的点数。如果没有则noverlap=nperseg/2
 
#window : 字符串或元组或数组,可选需要使用的窗。
# #如果window是一个字符串或元组,则传递给它window是数组类型,直接以其为窗,其长度必须是nperseg。
# 常用的窗函数有boxcar,triang,hamming, hann等,默认为Hann窗。
 
#nfft : int,可选。如果需要零填充FFT,则为使用FFT的长度。如果为 None,则FFT长度为nperseg。默认为无
 
# detrend : str或function或False,可选
# 指定如何去除每个段的趋势。如果类型参数传递给False,则不进行去除趋势。默认为False。
 
# return_onesided : bool,可选
# 如果为True,则返回实际数据的单侧频谱。如果 False返回双侧频谱。默认为 True。请注意,对于复杂数据,始终返回双侧频谱。
 
# boundary : str或None,可选
# 指定输入信号是否在两端扩展,以及如何生成新值,以使第一个窗口段在第一个输入点上居中。
# 这具有当所采用的窗函数从零开始时能够重建第一输入点的益处。
# 有效选项是['even', 'odd', 'constant', 'zeros', None].
# 默认为‘zeros’,对于补零操作[1, 2, 3, 4]变成[0, 1, 2, 3, 4, 0] 当nperseg=3.
 
# padded: bool,可选
# 指定输入信号在末尾是否填充零以使信号精确地拟合为整数个窗口段,以便所有信号都包含在输出中。默认为True。
# 填充发生在边界扩展之后,如果边界不是None,则填充为True,默认情况下也是如此。
 
# axis : int,可选
# 计算STFT的轴; 默认值超过最后一个轴(即axis=-1)。

plt.figure(figsize=(12,4))
plt.pcolormesh(t, f, np.abs(nd), vmin = np.min(np.abs(nd)), vmax = np.max(np.abs(nd)))
plt.title('STFT')
plt.ylabel('frequency')
plt.xlabel('time')
plt.show()

在这里插入图片描述
可见在整个时间上存在10Hz的信号。

保存图片

plt.save_fig(file_path, bbox_inches='tight')
  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 现代信号处理教程胡广书第二版pdf是一本非常值得学习的书籍。这本书不仅介绍了信号处理的基本概念和理论知识,还介绍了许多先进的信号处理技术和算法。书中的内容非常丰富,包括信号处理的数学基础、时域分析、傅里叶变换、滤波器设计、时频分析、小波分析、信号压缩、图像处理等方面的知识。 这本书的教学方式非常生动有趣,每一章节都配备了大量的例子和实战应用,很容易让读者理解和掌握。此外,该书还含有许多习题和解答,可以帮助读者巩固所学知识和提高解决问题的能力。 总之,现代信号处理教程胡广书第二版pdf不仅适合于信号处理专业学生学习,也适合于从事信号处理相关工作的工程师和科研人员阅读。无论是学习信号处理的基本概念还是掌握先进的信号处理技术,该书都能够提供详实的指导和帮助。因此,我强烈推荐这本书给所有对信号处理感兴趣的人。 ### 回答2: 《现代信号处理教程》是一本介绍数字信号处理基本原理和应用的经典教材。胡广书教授第二版的《现代信号处理教程》是在第一版基础上进行了全面修订和补充,增加了最新的理论成果和应用实例,更加详细和全面地介绍了数字信号处理的基本概念、技术和方法。 教材的内容主要包括数字信号的表示和处理、离散傅里叶变换和其应用、数字滤波和系统设计、小波变换和其应用、数字信号处理的应用等。通过本书,读者可以深入了解数字信号的基本概念、数字信号处理的基本原理和方法,并了解数字信号处理在音频、图像、视频等领域的应用。 本书既适用于本科生学习数字信号处理课程,也适用于硕士生和博士生作为科研指导。本书注重理论与实践相结合,具有很强的实用性,每章后均配有大量的习题和应用案例,有助于读者巩固所学知识和提高解决实际问题的能力。 总之,《现代信号处理教程》胡广书第二版pdf是一本非常优秀的数字信号处理教材,对于想要深入学习数字信号处理和应用的人来说是一本绝佳的参考书籍。 ### 回答3: 《现代信号处理教程》是一本经典的信号处理教材,作者胡广书教授是国内顶尖的信号与信息处理专家,本书的第二版是在第一版的基础上对内容进行了更新和完善。 本书内容包括了信号处理的基础知识,如信号的时域与频域表示、傅里叶变换、滤波等;同时也详细介绍了多种信号处理方法,如时频分析、小波变换、信号压缩等。此外,本书还介绍了现代信号处理中常用的方法,如非线性与非高斯信号处理、瞬态信号处理、盲源分离等。 本书的编写风格紧凑,文字流畅易懂,附有大量的案例分析与实际应用。对于学习信号处理的学生和工程师而言,本书是一本很好的参考读物。同时,本书也十分适合作为信号处理课程的教材,可以帮助学生掌握信号处理的基本理论和实践技能。 值得一提的是,本书还包含了一些与现代信号处理相关的扩展内容,如人工神经网络、模糊逻辑、遗传算法等,以及MATLAB等实现方法的介绍。这些内容使得本书更加鲜活、生动,也更加符合当代学生和工程师的需求。 总之,《现代信号处理教程》第二版pdf是一本高端信号处理教材,深入浅出地介绍了信号处理的基础知识和现代技术,使读者能够全面深入地了解此领域的相关知识,具有很高的参考价值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故障诊断与python学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值