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 本章知识体系总览

为了让大家对本章内容有个整体把握,我画了一张图,把声音的物理特性、时域频域、采样定理和傅里叶变换之间的关系串起来:

第1章:声学基础与信号处理入门 - 知识体系 声音的本质:机械波 频率 (Hz) 振幅 (dB) 相位 (°) 时域视角 (波形) 频域视角 (频谱) 傅里叶变换 (FFT) 采样定理:fs >= 2 * fmax 工程应用:降噪 / 回声消除 / 波束成形 / 语音增强 时域+频域 缺一不可

这张图把本章的核心逻辑串起来了:声音是机械波,它有频率、振幅、相位三个基本属性。我们可以从时域和频域两个视角去观察它,而傅里叶变换就是连接这两个视角的桥梁。采样定理则告诉我们,在把模拟信号数字化时,采样频率必须足够高,才能避免信息丢失。所有这些,最终都服务于我们后面要讲的工程应用。