STFT 短时傅里叶变换的python实现

本文介绍了离散傅里叶变换(DFT)和短时傅里叶变换(STFT)的基本概念,重点讲解了如何使用Python的scipy库进行STFT,包括常用参数解释,并通过示例展示了如何分析具有多个频率成分的信号。时频图帮助理解信号在不同时间点的频率特性,适用于音频处理和振动分析等领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

DFT(离散傅里叶变换)是一种将周期信号表示为正弦和余弦信号线性组合的方法。它可以帮助我们找到信号中的频率、幅值和相位信息。而STFT(短时傅里叶变换)则是一种时间频率分布表示方法,它将长时间信号分解为多个等长的小段,并在每个小段上计算傅里叶变换,得到频谱图。

简单来说,STFT将整个信号分解成许多短时段,每个短时段近似平稳。然后对每个短时段进行傅里叶变换,得到频谱图。这样可以观察到信号在不同时间段内的频率特征,并且可以更好地捕捉到信号的时变性质。

通过使用STFT,我们可以获得一个随时间变化的频谱图,从而更好地理解信号在不同时间点上的频率成分。这对于许多领域中的信号处理和分析任务非常有用,例如音频处理、语音识别、振动分析等。

函数

scipy.signal.stft(x, fs, window, nperseg, noverlap, nfft, detrend, return_oneside, boundary, padded, axis)

常用参数
1.x :传入STFT变换的时域信号
2.fs : 时域信号的采样频率,默认为1.0
3.window : 时域信号分割的时候需要的窗函数,常用的窗函数有boxcar,triang,hamming, hann等
4.nperseg : 窗函数的长度,默认值为256
5.noverlap : 窗函数重叠数,默认为窗长的一半
6.nfft : FFT的长度,默认为nperseg,如果设置为大于nperseg会自动进行0填充
7.return_oneside : True返回复数实部,None返回复数,默认为False

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import stft
# 生成三个不同频率成分的信号
fs = 1024  # 采样率
t = np.linspace(0, 1, fs, endpoint=False)  # 时间

# 第一个频率成分
signal1 = np.sin(2 * np.pi * 50 * t)
# 第二个频率成分
signal2 = np.sin(2 * np.pi * 120 * t)
# 第三个频率成分
signal3 = np.sin(2 * np.pi * 300 * t)

# 合并三个信号
signal = np.concatenate((signal1, signal2, signal3))

# 进行短时傅里叶变换  
f, t, spectrum = stft(signal, fs, nperseg=256, noverlap=128)
 
signal.shape

打印结果:(3072,)

spectrum.shape

打印结果:(129, 25)

绘制时频图:

# 绘制时频图
plt.pcolormesh(t, f, np.abs(spectrum), shading='gouraud')
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

 参考资料:

[1] 用python实现短时傅里叶变换(STFT)完整代码版_python stft-CSDN博客

[2] https://blog.csdn.net/silent1cat/article/details/120559700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值