3. 频域分析基础:傅里叶变换入门、频谱分析仪使用、功率谱密度(PSD)概念

做音频处理,时域波形你肯定天天看。但说实话,很多杂音在时域里就是一团乱麻,根本看不出门道。我刚开始处理一个电机噪声项目时,盯着波形看了三天,啥也没发现。后来把信号扔进频域一看,好家伙,几个特定频率的尖峰清清楚楚。

这就是频域分析的价值。它把信号从时间轴掰到频率轴,让你一眼看出“哪个频率在捣乱”。这一章,我们就来啃下这块硬骨头。

核心观点: 频域分析不是魔法,它是把复杂信号拆解成不同频率成分的数学工具。你不需要精通所有公式推导,但必须理解它的物理意义和工程用法。

3.1 傅里叶变换:从时域到频域的桥梁

傅里叶变换,说白了就是一个数学变换。它告诉你:任何一个连续信号,都可以看作无数个正弦波和余弦波的叠加。每个正弦波都有自己的频率、幅度和相位。

公式长这样:

X(f) = ∫ x(t) · e^(-j2πft) dt

别被积分符号吓到。你只需要记住三件事:

  • 输入: 时域信号 x(t),比如你录的一段音频。
  • 输出: 频域信号 X(f),表示每个频率成分的强度和相位。
  • 本质: 信号与不同频率的正弦波做“相关性计算”。匹配上了,输出值就大。

我在项目中遇到过一位同事,死活不理解傅里叶变换。我打了个比方:你面前有一碗汤,时域就是直接喝一口,知道味道。频域呢?是把汤里的盐、糖、辣椒分别挑出来,看看各放了多少。这个比喻他一下就懂了。

实用技巧: 实际工程中我们几乎不用连续傅里叶变换。数字信号处理用的是它的离散版本——离散傅里叶变换(DFT)。而快速傅里叶变换(FFT)是DFT的高效算法,所有频谱分析仪和软件都在用。

3.2 频谱分析仪:你的频域眼睛

频谱分析仪,就是把信号做FFT然后显示出来的工具。硬件的有,软件也有。我个人习惯用Python的matplotlib配合numpy做快速分析,调试时非常方便。

一个典型的频谱图,横轴是频率(Hz),纵轴是幅度(dB)。你会看到:

  • 底噪: 一条平缓的曲线,代表系统本底噪声。
  • 尖峰: 某个频率能量特别高,往往是干扰源。
  • 谐波: 基频的整数倍,常见于电源噪声或机械振动。

下面是一个简单的Python代码,演示如何用FFT做频谱分析:

import numpy as np
import matplotlib.pyplot as plt

# 生成一个含噪声的1kHz正弦波
fs = 44100  # 采样率
t = np.arange(0, 1, 1/fs)
f0 = 1000
signal = np.sin(2 * np.pi * f0 * t) + 0.5 * np.random.randn(len(t))

# 做FFT
N = len(signal)
fft_vals = np.fft.fft(signal)
freqs = np.fft.fftfreq(N, 1/fs)

# 只取正频率部分
half_N = N // 2
fft_mag = np.abs(fft_vals[:half_N]) / N
fft_mag_db = 20 * np.log10(fft_mag + 1e-12)  # 转成dB

# 绘图
plt.figure(figsize=(10, 4))
plt.plot(freqs[:half_N], fft_mag_db)
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度 (dB)')
plt.title('频谱分析示例')
plt.grid(True)
plt.show()

这段代码我用了无数次。注意那个+ 1e-12,防止log(0)报错。嗯,这里要注意,FFT的结果是复数,取绝对值才是幅度。

避坑指南: 我曾经因为忘记除以N,导致频谱幅度完全不对。FFT结果的幅度需要归一化,否则数值会随采样点数变化。另外,dB转换时基准要统一,否则不同设备的数据没法对比。

3.3 功率谱密度(PSD):更科学的噪声度量

频谱分析仪显示的幅度谱,有个问题:它依赖于FFT的点数和分辨率带宽。你换个参数,尖峰高度就变了。这在实际工程中很麻烦。

功率谱密度(PSD)解决了这个问题。它表示“单位频率带宽内的功率”,单位是W/Hz或dBm/Hz。PSD不随FFT参数变化,是噪声分析的“标准尺”。

计算PSD有两种常用方法:

方法 原理 适用场景
周期图法 直接对信号做FFT,取幅度平方,再除以频率分辨率 信号平稳,数据量足够大
Welch法 将信号分段,每段加窗,做FFT后平均 噪声非平稳,需要降低方差

Welch法是我最常用的。它通过分段平均,让PSD曲线更平滑,不容易被偶然的噪声尖峰带偏。Python的scipy.signal.welch函数一行代码就能搞定:

from scipy import signal

f, Pxx = signal.welch(signal, fs, nperseg=1024)
plt.semilogy(f, Pxx)
plt.xlabel('频率 (Hz)')
plt.ylabel('PSD (V^2/Hz)')
plt.title('功率谱密度 (Welch法)')
plt.grid(True)
plt.show()

你想想看,为什么PSD在工程中这么重要?因为很多标准(比如汽车电子EMC测试)都是用PSD来定义噪声限值的。你测出来的PSD曲线,直接可以和标准对比,判断是否超标。

关键区别: 幅度谱告诉你“哪个频率能量大”,PSD告诉你“单位频率内的功率密度”。对于宽带噪声(比如白噪声),PSD是平的,而幅度谱会随分辨率变化。做噪声分析,PSD才是正确选择。

3.4 知识体系总览

这一章的内容比较多,我画了一张图帮你理清关系。从时域信号出发,经过傅里叶变换进入频域,然后通过频谱分析仪或PSD计算来观察和分析。

频域分析知识体系 时域信号 x(t) 傅里叶变换 (FFT/DFT) 频域信号 X(f) 频谱分析仪 功率谱密度 (PSD) 显示幅度谱 (dB) 依赖分辨率带宽 功率密度 (W/Hz) 不依赖FFT参数

从这张图你可以看到,傅里叶变换是核心枢纽。它把时域信号转换成频域信号,然后你可以选择用频谱分析仪看幅度,或者用PSD看功率密度。两者各有用途,但PSD在噪声分析中更权威。

我的建议: 刚开始学频域分析,先别纠结公式。拿一段你熟悉的音频,用Python或Audacity做FFT,看看频谱长什么样。把“尖峰对应频率”这个直觉建立起来,后面学PSD就顺了。

好了,这一章的内容就到这里。频域分析是杂音定位的起点,后面的章节我们会基于这些工具,一步步把各种杂音揪出来。