傅里叶变换特征:将时域信号转化为频谱特征
python import numpy as np import matplotlib.pyplot as plt
生成一个混合信号
fs = 500 # 采样频率 Hz t = np.arange(0, 1, 1/fs) f1, f2 = 50, 120 signal = np.sin(2np.pif1t) + 0.7np.sin(2np.pif2t) + 0.2np.random.randn(len(t))
计算FFT
N = len(signal) fft_result = np.fft.fft(signal)
只取正频率部分(单边谱)
freqs = np.fft.fftfreq(N, 1/fs) half = N // 2 pos_freq = freqs[:half] magnitude = np.abs(fft_result[:half]) * 2 / N # 归一化幅度
画出时域和频域
plt.subplot(2,1,1) plt.plot(t, signal) plt.title('时域信号') plt.subplot(2,1,2) plt.stem(pos_freq, magnitude) plt.title('幅度谱(FFT特征)') plt.xlabel('频率 Hz') plt.tight_layout()
你会看到两个明显的峰值落在50Hz和120Hz,高度分别约1.0和0.7,完美还原了信号成分。**这些幅值就是最基础的傅里叶变换特征**。
---
## 第三部分:构建高信息密度的频谱特征
原始FFT结果长度等于信号点数,维度太高,不适合直接送入模型。我们需要凝练成有物理意义、且对噪声鲁棒的统计量。
### 3.1 功率谱密度(PSD)
功率谱密度(Power Spectral Density)使用信号能量的平方,更能反映信号在每个频段的平均功率。常用Welch方法(分段加窗平均)获得平滑估计:
```python
from scipy.signal import welch
freqs, psd = welch(signal, fs, nperseg=256)
以PSD值为特征,可以用频段的平均功率、积分功率作为后续输入。
3.2 频谱统计特征
对整个频谱或特定频段提取标量特征,极大降低维度:
- 谱质心(Spectral Centroid):频谱的“重心”频率,表示能量集中在哪里。
[ Centroid = \frac{\sum f \cdot M[f]}{\sum M[f]} ] 其中M[f]是频率f处的幅度。 - 谱带宽(Spectral Bandwidth):频谱分布的宽度,反映纯净度。
- 谱滚降点(Spectral Roll-off):能量累积到总能量85%时的频率,区分有调性与无调性声音。
- 谱熵(Spectral Entropy):将归一化频谱视为概率分布,计算熵,衡量信号的复杂度/随机性。
- 频谱峰度与偏度:刻画谱形状的统计矩。
这些特征常用于音频分类、机械故障诊断和脑电信号分析。
3.3 频带能量特征
将频谱划分为多个频带(如 delta, theta, alpha, beta, gamma 脑波频段),计算每个频带的平均能量或相对能量比,可得到数个高度解释性的特征。例如,对一段振动信号,可以提取0-100Hz、100-200Hz等区间的能量,作为输入给分类器判断设备状态。
3.4 梅尔频率倒谱系数(MFCCs)——人耳启发的特征
在语音和音频处理中,MFCCs 是统治级特征。它将频谱映射到梅尔刻度(模拟人耳对低频分辨更高),然后对对数频谱做离散余弦变换(DCT),得到少量去相关后的系数。通常取前12-13个系数,再加上一、二阶差分形成39维特征。可直接用 librosa 库提取:
import librosa
mfccs = librosa.feature.mfcc(y=signal, sr=fs, n_mfcc=13)
MFCCs 虽然是对频谱的再次压缩变换,但其根基仍是傅里叶频谱,可作为高阶特征。
第四部分:工程实践要点与避坑指南
4.1 采样与频率分辨率
频率分辨率 Δf = fs / N。如果需要对低频成分区分更细,要么降低 fs,要么增加分析时间长度 N(即采集更长的信号)。但增加 N 又可能引入信号的不平稳问题,需要在窗口分析中取得平衡。
4.2 窗口函数缓解频谱泄漏
直接截取一段信号做FFT相当于加矩形窗,会在真实频率附近产生旁瓣,模糊频谱。施加汉宁窗 (Hanning) 或汉明窗 (Hamming) 可以显著抑制泄漏:
windowed = signal * np.hanning(N)
fft_improved = np.fft.fft(windowed)
在提取特征前务必考虑加窗。
4.3 短时傅里叶变换(STFT)捕获时变特性
许多信号的频率成分随时间变化(如语音、音乐)。用一个FFT处理整段信号会彻底丢失时间信息。STFT通过滑动时间窗口,逐段计算FFT,得到一个频谱图(spectrogram)——横轴时间、纵轴频率、颜色代表幅度。频谱图本身可以作为二维特征输入CNN进行图像式识别。
f, t_spec, Zxx = signal.spectrogram(signal, fs, nperseg=256, noverlap=128)