1. 声学基础与信号处理入门
各位同学,欢迎来到《声学前端处理实战应用》的第一章。我是你们这门课的主讲,一个在音频算法领域摸爬滚打了十几年的老工程师。今天咱们不聊虚的,直接切入正题——声音到底是什么?我们怎么用数学工具去“解剖”它?
很多人觉得声学基础很枯燥,一堆公式和概念。但我告诉你,这些基础就是你以后调试算法、排查问题的“内功”。内功不扎实,招式再花哨也容易走火入魔。咱们今天就把这些核心概念,用最接地气的方式讲明白。
1.1 声音的物理特性:它就是个振动
声音的本质是什么?说白了,就是物体振动,通过介质(通常是空气)传播的一种机械波。你敲一下桌子,桌面在振动;你说话,声带在振动。没有振动,就没有声音。
描述一个声音,我们通常关注三个物理量:
- 频率(Frequency):单位是赫兹(Hz),表示每秒振动的次数。频率决定了音调的高低。频率越高,声音越尖锐;频率越低,声音越低沉。人耳能听到的频率范围大概是20Hz到20kHz。
- 振幅(Amplitude):表示振动的幅度大小。振幅决定了响度(音量)。振幅越大,声音越响。我们通常用声压级(SPL,单位dB)来量化它。
- 相位(Phase):表示振动在某一时刻所处的状态,单位是角度(°)或弧度(rad)。相位是个相对概念,单独看一个声音的相位没太大意义,但多个声音之间的相位差,会直接影响叠加后的效果——比如同相叠加会增强,反相叠加会抵消。
核心要点: 频率、振幅、相位,是描述声音的三个基本维度。我们后面讲的所有算法,比如降噪、回声消除、波束成形,本质上都是在处理这三个维度的信息。
1.2 时域与频域:看问题的两种视角
我们听到的声音,在时间轴上是一条连续的波形,这就是时域视角。时域信号很直观,横轴是时间,纵轴是振幅。你打开录音软件看到的波形图,就是时域信号。
但是,时域信号有个缺点——它很难告诉我们这个声音里包含了哪些频率成分。比如一段音乐,你从波形上很难看出它有几个音、每个音有多强。这时候,我们就需要换一个视角:频域。
频域视角,横轴是频率,纵轴是能量(或幅度)。它告诉我们,这个声音信号里,各个频率成分的分布情况。比如一个1000Hz的纯音,在频域上就是一根竖线;而一段白噪声,在频域上则是一条平坦的线。
我个人习惯把时域和频域比作“看一棵树”。时域是看树的轮廓和枝叶在风中摇摆的样子(随时间变化);频域则是分析这棵树由哪些不同粗细的树枝(不同频率)组成,以及每种树枝有多少(能量大小)。
我的经验: 刚开始做音频处理时,我总喜欢盯着时域波形看,觉得直观。后来发现,很多问题(比如噪声的频段分布、共振峰的位置)在时域里根本看不出来,必须转到频域分析。所以,时域和频域是互补的,缺一不可。
1.3 采样定理:模拟世界的“数字化”门槛
我们计算机处理的是数字信号,而现实世界的声音是模拟信号。把模拟信号变成数字信号,第一步就是采样——每隔一段时间,记录一下当前时刻的振幅值。
这里有个关键问题:采样频率(每秒采样的次数)应该设多高?
答案就是著名的奈奎斯特采样定理:为了能从采样后的数字信号无失真地恢复出原始模拟信号,采样频率必须大于或等于信号中最高频率的两倍。
用公式表示就是:fs >= 2 * fmax
其中 fs 是采样频率,fmax 是信号中的最高频率。这个 fs/2 也被称为奈奎斯特频率。
举个例子:人耳能听到的最高频率是20kHz,所以CD音质的采样频率是44.1kHz(略大于2*20kHz)。如果采样频率低于这个值,就会发生混叠(Aliasing)——高频信号会“伪装”成低频信号,导致失真。
我曾经踩过的坑: 有一次做语音增强项目,为了节省计算资源,我把采样率从16kHz降到了8kHz。结果发现,处理后的语音里出现了一些奇怪的“咝咝”声。排查了半天才发现,是因为降采样前没有加抗混叠滤波器,导致4kHz以上的高频成分混叠到了低频段。从那以后,我每次做降采样,都会先过一遍低通滤波器。
常见的采样频率及其应用场景:
| 采样频率 | 奈奎斯特频率 | 典型应用 |
|---|---|---|
| 8 kHz | 4 kHz | 电话语音(窄带) |
| 16 kHz | 8 kHz | 宽带语音、语音识别 |
| 44.1 kHz | 22.05 kHz | CD音质、音乐 |
| 48 kHz | 24 kHz | 电影、专业音频 |
1.4 傅里叶变换基础:连接时域与频域的桥梁
前面我们说了时域和频域是两个视角,那怎么从一个视角切换到另一个视角呢?答案就是傅里叶变换(Fourier Transform)。
傅里叶变换的核心思想是:任何一个周期信号,都可以分解成一系列不同频率、不同振幅、不同相位的正弦波(或余弦波)的叠加。
你想想看,这其实很神奇。一个看似复杂的波形,背后竟然是由一堆简单的正弦波组合而成的。傅里叶变换就是帮我们找出这些“成分”的数学工具。
对于计算机处理的离散信号,我们使用的是离散傅里叶变换(DFT)。而实际工程中,最常用的是它的快速算法——快速傅里叶变换(FFT)。
下面是一个简单的Python代码示例,演示如何对一个信号做FFT,并画出它的频谱:
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
fs = 1000 # 采样频率 1000 Hz
t = np.arange(0, 1, 1/fs) # 时间向量,1秒
# 生成一个复合信号:50Hz + 120Hz 的正弦波
f1, f2 = 50, 120
signal = 0.7 * np.sin(2 * np.pi * f1 * t) + 1.0 * np.sin(2 * np.pi * f2 * t)
# 做FFT
N = len(signal)
fft_result = np.fft.fft(signal)
freqs = np.fft.fftfreq(N, 1/fs)
# 只取正频率部分(前一半)
half_N = N // 2
fft_magnitude = np.abs(fft_result[:half_N]) * 2 / N
positive_freqs = freqs[:half_N]
# 绘制频谱
plt.figure(figsize=(10, 4))
plt.plot(positive_freqs, fft_magnitude)
plt.title('信号频谱 (FFT结果)')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅度')
plt.grid(True)
plt.show()
这段代码里,我生成了一个由50Hz和120Hz正弦波组成的信号。经过FFT后,频谱图上会清晰地看到两个峰值,分别对应50Hz和120Hz。这就是傅里叶变换的威力——把时域里混在一起的信号,在频域里分得清清楚楚。
我的建议: 刚开始接触FFT时,不用急着去深究它的数学推导。你先会用,能看懂频谱图,知道怎么设置参数(比如FFT点数、窗函数),这就够了。等用熟了,再回头去看原理,会事半功倍。
1.5 本章知识体系总览
为了让大家对本章内容有个整体把握,我画了一张图,把声音的物理特性、时域频域、采样定理和傅里叶变换之间的关系串起来:
这张图把本章的核心逻辑串起来了:声音是机械波,它有频率、振幅、相位三个基本属性。我们可以从时域和频域两个视角去观察它,而傅里叶变换就是连接这两个视角的桥梁。采样定理则告诉我们,在把模拟信号数字化时,采样频率必须足够高,才能避免信息丢失。所有这些,最终都服务于我们后面要讲的工程应用。