第2章:音频信号基础——声音的物理特性、采样率与位深度、时域与频域分析、傅里叶变换入门

各位工程师朋友,大家好。我是你们的老朋友,一个在车载音频领域摸爬滚打了十几年的老兵。今天咱们进入《MTK8676座舱语音助手唤醒与降噪调优实战》的第二章节——音频信号基础。

说实话,很多做算法或者驱动的同事,一听到「信号处理」四个字就头大。我当年也一样。但后来我发现,搞懂音频基础,就像学开车要先懂油门刹车一样。不懂这些,你连麦克风为什么有杂音都说不清楚。

好,咱们直接开干。

2.1 声音的物理特性:你听到的到底是什么?

声音的本质是什么?说白了,就是空气的振动。一个物体振动,推动周围的空气分子,形成疏密相间的波,传到你的耳朵里,鼓膜跟着振,大脑就「听」到了。

这里面有两个核心物理量,我建议你刻在脑子里:

  • 频率(Frequency):单位是赫兹(Hz)。表示每秒振动多少次。人耳能听到的范围大约是20Hz到20kHz。低于20Hz叫次声波,高于20kHz叫超声波。车载麦克风一般要覆盖50Hz到16kHz,才能保证语音清晰。
  • 振幅(Amplitude):表示振动的强弱。振幅越大,声音越响。我们通常用分贝(dB)来表示声压级。

重要概念:频率决定了音调(pitch),振幅决定了响度(loudness)。这两个参数,是后续所有音频处理的起点。

我在项目中遇到过一件事:有次客户投诉语音助手在高速上完全听不清。我查了半天,发现是麦克风选型时只关注了灵敏度,没关注低频响应。风噪和路噪主要集中在200Hz以下,麦克风低频响应不够,信号直接被噪声淹没了。嗯,这就是典型的「基础没打牢」。

2.2 采样率与位深度:把模拟信号变成数字信号

麦克风采集到的是连续的模拟信号,但芯片只能处理离散的数字信号。怎么转换?靠采样和量化。

2.2.1 采样率(Sample Rate)

采样率就是每秒采集多少个样本点。单位是Hz或kHz。

  • 奈奎斯特采样定理:采样率必须大于信号最高频率的两倍,才能无失真地重建原始信号。否则会出现混叠(Aliasing)。
  • 实际应用:语音信号最高频率一般按4kHz算(电话语音),所以8kHz采样率就够了。但车载语音助手要处理更宽的频带,我建议用16kHz或48kHz。MTK8676的音频接口支持最高192kHz采样率,但咱们做语音唤醒,16kHz是性价比最高的选择。

我的习惯:做语音唤醒算法时,统一用16kHz采样率。既满足语音带宽要求,又节省算力和内存。别盲目追求高采样率,那是在浪费资源。

2.2.2 位深度(Bit Depth)

位深度决定了每个采样点的精度。常见的有16位、24位、32位。

  • 16位:动态范围约96dB。CD音质标准,够用。
  • 24位:动态范围约144dB。录音棚级别,车载场景有点奢侈。
  • 32位浮点:动态范围极大,主要用于后期处理。

我建议车载语音助手用16位就够了。为什么?因为车内噪声环境复杂,麦克风本身的底噪和ADC的量化噪声相比,16位的量化噪声已经可以忽略不计。用24位,白白增加数据传输量和处理负担。

避坑指南:我曾经在一个项目里,为了追求「高保真」,把位深度设成了24位。结果I2S总线带宽不够,导致数据丢帧,语音助手时不时卡顿。后来降回16位,问题解决。记住:够用就好,别炫技。

2.3 时域与频域分析:两个角度看世界

音频信号可以从两个维度去看:时域和频域。

2.3.1 时域(Time Domain)

时域就是看信号随时间的变化。横轴是时间,纵轴是振幅。你看到的波形图,就是时域表示。

时域分析能直观看到:

  • 信号的幅度变化(音量大小)
  • 信号的起始和结束(语音端点检测)
  • 噪声的突发特性(比如关门声、喇叭声)

但时域有个缺点:你很难看出这个信号里包含哪些频率成分。比如一段语音里混着发动机的轰鸣声,在时域上它们叠加在一起,你根本分不清。

2.3.2 频域(Frequency Domain)

频域就是看信号在不同频率上的能量分布。横轴是频率,纵轴是幅度或能量。

频域分析能告诉你:

  • 语音的主要能量集中在哪些频段(一般300Hz-3.4kHz)
  • 噪声分布在哪些频段(风噪在低频,胎噪在中低频)
  • 哪些频率需要增强或抑制(降噪的核心思路)

一句话总结:时域告诉你「什么时候响」,频域告诉你「什么频率在响」。两者结合,才能全面理解音频信号。

2.4 傅里叶变换入门:从时域到频域的桥梁

怎么从时域信号得到频域信息?靠傅里叶变换(Fourier Transform)。

傅里叶变换的核心思想是:任何一个复杂的周期信号,都可以分解成一系列不同频率、不同振幅、不同相位的正弦波之和。

你想想看,这就像用乐高积木搭房子。每个正弦波就是一块积木,傅里叶变换就是告诉你,这个房子用了哪些积木、每种积木用了多少块。

2.4.1 离散傅里叶变换(DFT)

计算机处理的是离散信号,所以要用离散傅里叶变换。公式我就不写了,你记住两点:

  • DFT把N个时域样本点,转换成N个频域样本点
  • 计算量很大,N个点需要N²次运算

2.4.2 快速傅里叶变换(FFT)

FFT是DFT的快速算法。它把计算量从N²降到了Nlog₂N。对于1024个点,DFT需要约100万次运算,FFT只需要约1万次。差距巨大。

在MTK8676上做语音处理,FFT是家常便饭。我常用的FFT长度是512或1024点,对应16kHz采样率,频率分辨率分别是31.25Hz和15.625Hz。够用了。

// 一个简单的FFT示例(伪代码)
// 输入:时域信号 x[0..N-1]
// 输出:频域信号 X[0..N-1]

void fft(complex x[], int N) {
    // 1. 位反转排序
    // 2. 蝶形运算
    // 3. 输出频域结果
}

我的建议:刚开始接触FFT时,别纠结数学推导。先会用,知道输入输出是什么,知道怎么调参数。等用熟了,再回头补理论。我就是这么过来的。

2.4.3 频谱与语谱图

FFT得到的是某一时刻的频谱。但语音是随时间变化的,所以我们需要看频谱随时间的变化——这就是语谱图(Spectrogram)。

语谱图的横轴是时间,纵轴是频率,颜色深浅表示能量大小。它能直观展示语音的时变特性,比如:

  • 元音在低频有稳定的能量条(共振峰)
  • 辅音在高频有短促的能量爆发
  • 噪声在特定频段有持续的能量分布

做语音唤醒和降噪时,我几乎天天盯着语谱图看。它能帮你快速定位问题:是语音被噪声淹没了?还是算法把语音误当成噪声滤掉了?一眼就能看出来。

实战经验:有一次,我发现语音唤醒率在高速上骤降。看语谱图才发现,风噪集中在1kHz-3kHz,正好和语音的关键频段重叠。后来在算法里加了一个自适应陷波滤波器,专门抑制这个频段的噪声,唤醒率直接提升了15%。

2.5 本章小结

好,咱们捋一捋今天的内容:

  • 声音的物理特性:频率和振幅,是一切的基础
  • 采样率与位深度:16kHz + 16位,车载语音助手的黄金组合
  • 时域与频域:两个视角,缺一不可
  • 傅里叶变换:从时域到频域的桥梁,FFT是实战利器

下一章,咱们会深入MTK8676的音频硬件架构,看看这些理论怎么落地到芯片上。到时候我会分享一些具体的寄存器配置和调试技巧,敬请期待。

记住:基础不牢,地动山摇。把这些概念吃透了,后面的降噪和唤醒调优,你会觉得豁然开朗。