1. 信号处理:从“听声音”到“看频谱”的思维跃迁
很多朋友一听到“信号处理”、“傅里叶变换”这些词,就觉得头大,感觉是数学系高材生才能玩转的东西。其实,它的核心思想非常贴近我们的生活。想象一下,你正在听一首交响乐,耳朵里涌入的是各种乐器混合在一起的、随时间变化的复杂声音波形。这时候,你问自己一个问题:“现在这个时刻,小提琴的音高是多少?大提琴的音高又是多少?”你的耳朵和大脑其实很难从混合的声波中瞬间分离出答案。但如果你有一份乐谱,你就能清晰地看到,在乐曲的第30秒,小提琴负责演奏中央C,大提琴负责低音G。这份“乐谱”,就是信号的频域表示——它不关心声音是何时发出的,只关心这个声音里包含了哪些固定的“音符”(频率成分)。
这就是频域分析最朴素的价值:它把一个混杂的、随时间变化的信号,翻译成一张清晰的“成分说明书”。我们最熟悉的工具就是傅里叶变换。它有一个非常强的假设:它认为你分析的这段信号,其包含的频率成分是永恒不变的。就像一段持续播放的“嘟——”的单音,或者一台稳定运行的电机发出的恒定噪音。对于这类稳态信号,傅里叶变换是完美的“透视镜”,能精准地告诉你里面有多少赫兹的成分,各自强度多大。
但现实世界要调皮得多。回到交响乐的例子,小提琴的旋律是起伏变化的,鼓点只在特定时刻敲响。这种频率成分随时间变化的信号,就是非稳态信号。如果你对整个5分钟的乐曲做一次傅里叶变换,得到的频谱会是一堆所有出现过的频率的“大杂烩”,你完全无法知道小提琴的高音是在开头炫技时出现的,还是在结尾高潮时出现的。这时,我们就需要一种能同时看到“时间”和“频率”的工具,这就是时频分析登场的时刻。它不再给你一张全局乐谱,而是给你一部音乐录像带,让你能清晰地看到,在视频的第几分几秒,出现了哪个音符。从傅里叶到小波,本质上就是我们处理现实世界复杂信号时,工具箱的一次重要升级。
2. 傅里叶变换:稳态信号的“全局CT扫描”
让我们先深入聊聊傅里叶变换这个老朋友。它的数学公式看起来可能有点吓人,但我们可以用一个非常形象的“旋转浆”实验来理解它。想象一个在黑暗房间里发光的单摆,它只以一种频率来回摆动。我们用摄像机记录下它的运动轨迹,得到一条优美的正弦波。现在,傅里叶变换就像一组拥有不同旋转速度的“探测浆”。我们让第一个浆以完全相同的频率旋转,神奇的事情发生了:这个浆的旋转会与单摆的运动完美同步,产生强烈的“共振”,我们测量到这个浆积累了很大的能量。而其他转速不同的浆,则与单摆的运动不同步,相互抵消,最终能量为零。这个“共振能量”的大小,就对应了频谱中该频率的强度。
在数字世界,我们用的是快速傅里叶变换(FFT),它是计算机高效计算离散傅里叶变换的算法。几乎所有的编程语言和数据分析工具都内置了它。比如在Python里,用numpy和matplotlib,几行代码就能看到信号的频谱。
import numpy as np
import matplotlib.pyplot as plt
# 生成一个模拟信号:包含50Hz和120Hz的两个正弦波,并加上一些随机噪声
fs = 1000 # 采样频率 1000 Hz
T = 1.0 # 信号时长 1秒
t = np.linspace(0, T, int(T*fs), endpoint=False) # 时间轴
# 信号 = 0.7*sin(2π*50*t) + 1.0*sin(2π*120*t) + 噪声
signal = 0.7 * np.sin(2 * np.pi * 50 * t) + np.sin(2 * np.pi * 120 * t)
signal += 0.5 * np.random.randn(len(t)) # 加入高斯白噪声
# 计算FFT
n = len(signal)
k = np.arange(n)
T = n / fs
frq = k / T # 频率轴 (0 到 fs)
frq = frq[:n//2] # 取单边频谱
Y = np.fft.fft(signal) / n # FFT并归一化
Y = Y[:n//2]
# 绘制时域波形和频域频谱
fig, (ax1, ax2)


343

被折叠的 条评论
为什么被折叠?



