在信号处理领域,短时傅里叶变换(STFT)就像一位精通多国语言的翻译官,能够将复杂的时间信号转化为直观的时频图谱。大多数人初次接触STFT是在语音识别课程或项目中,但它的能力远不止于此——从工厂车间的机械振动分析到医院的ECG监测,STFT正在不同领域展现其独特价值。
STFT的本质是通过滑动窗口将非平稳信号"切片",对每个片段进行傅里叶变换。这个看似简单的过程却蕴含着精妙的平衡艺术:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# STFT基础实现示例
def simple_stft(x, fs, window_size, overlap):
window = np.hanning(window_size)
hop_size = window_size - overlap
n_segments = int((len(x)-window_size)/hop_size) + 1
stft_result = np.zeros((window_size//2+1, n_segments), dtype=complex)
for i in range(n_segments):
start = i * hop_size
segment = x[start:start+window_size] * window
stft_result[:,i] = np.fft.rfft(segment)
return stft_result
窗口长度是STFT最关键的参数,它直接影响时频分析的"视力":
提示:实际应用中常采用汉宁窗(Hanning)作为折中选择,它在主瓣宽度和旁瓣衰减间取得了较好平衡
重叠率常被忽视,但它能显著改善时频图质量:
当轴承开始磨损或齿轮出现裂纹,它们会通过振动信号发出独特的"求救信号"。STFT就像机械设备的听诊器,能捕捉这些微妙变化。
健康的轴承振动频谱呈现均匀分布,而故障轴承会在特定频率产生"谐波家族":
% 轴承振动分析示例
[vib, Fs] = audioread('bearing.wav');
window = hamming(1024);
noverlap = 768;
nfft = 2048;
spectrogram(vib, window, noverlap, nfft, Fs, 'yaxis')
title('轴承振动时频分析')
齿轮系统的故障发展往往经历三个阶段:
注意:工业环境中背景噪声较强,通常需要先进行带通滤波(如1-5kHz)再作STFT分析
从跳动的心脏到活跃的大脑,生物电信号都是典型的非平稳过程。STFT为这些生命密码提供了动态解读视角。
传统ECG只看时域波形,而STFT能揭示更多信息:
# ECG时频分析示例
import pywt
import biosppy
ecg = biosppy.signals.ecg.ecg(signal=data, sampling_rate=1000)[1]
f, t, Zxx = signal.stft(ecg, fs=1000, nperseg=256, noverlap=200)
plt.pcolormesh(t, f, np.abs(Zxx), shading='gouraud')
plt.title('ECG STFT时频图')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.ylim(0, 50) # 聚焦主要频段
plt.show()
癫痫发作前,EEG信号会呈现特征性演变:
临床研究发现,STFT结合机器学习能提前30-60秒预测癫痫发作,为干预争取宝贵时间。
当标准STFT力不从心时,这些技巧可以突破局限:
针对复合信号,可采用分层分析方案:
时频图作为二维特征,非常适合现代深度学习:
# 时频特征提取示例
from sklearn.decomposition import PCA
# 从STFT提取统计特征
def extract_features(Zxx):
features = []
for band in [(0,10), (10,30), (30,50)]:
mask = (f >= band[0]) & (f < band[1])
band_power = np.sum(np.abs(Zxx[mask,:]), axis=0)
features.extend([
np.mean(band_power),
np.std(band_power),
np.max(band_power)
])
return features
# 降维可视化
pca = PCA(n_components=2)
features = np.array([extract_features(Zxx) for Zxx in all_samples])
reduced = pca.fit_transform(features)
工业在线监测需要优化计算效率:
在测试一台400kW的工业风机时,优化后的STFT算法能在10ms内完成分析,真正实现了实时监测。