傅里叶变换特征:将时域信号转化为频谱特征

FreeGuideOnline 最新 2026-06-27

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)