音频信号采样完整流程
音频信号采样完整流程
音频属于模拟交流信号:20Hz‑20kHz,交变、有正负电压,不能直接丢给单片机ADC(单片机ADC大多只能采0~VREF正电压,不能采负半周)。
核心两件事:
-
①信号偏置抬直流;
-
②ADC参数匹配音频带宽;
-
③采样率、位深选择;
-
④硬件电路;
-
⑤软件处理。
1、音频基础参数
-
人耳音频:20Hz ~ 20kHz
-
奈奎斯特采样定理:采样率 $Fs>2\times f_{max}$
音频最高20kHz → 采样率至少**≥40kHz**,常用标准:语音:8kHz、16kHz
-
音乐:44.1kHz、48kHz
-
位深:8bit /10bit /12bit /16bit;bit越高动态范围越大。
-
STM8 ADC:10bit,最高ADC时钟4MHz,很难稳定跑到44.1k;做音频采样STM8不适合。
STM32(F1/F4):12bit,配合DMA,可以做到44.1K采样。
2、最关键硬件:音频交流信号抬直流偏置
麦克风/音频输出是交流信号,上下摆动,存在负电压。单片机ADC只能输入 0 ~ VREF(0‑3.3V),负电压会直接损坏ADC引脚。
标准偏置电路(单电源3.3V)
把交流信号叠加在
直流中点 VCC/2 =1.65V
静态:输出直流1.65V;音频信号在1.65V上下摆动。
电路结构:
两个等值电阻 R1=R2=10kΩ,一端接3.3V,一端GND,中间节点产生1.65V直流偏置。
隔直电容C(1‑10μF):音频输入经过电容耦合,叠加到1.65V偏置点。
再接RC滤波:R=1k,C=100nF,接到ADC输入引脚。
公式:
静态ADC直流值 = Vcc/2 =1.65V
音频信号就在 0~3.3V之间摆动,无负电压。
❗不要直接把麦克风输出接ADC引脚,负半周会造成采样失真甚至烧毁IO。
麦克风前置
-
驻极体麦克风需要偏置供电+运放放大,麦克风输出毫伏级,幅值太小,ADC分辨不出,需要运放放大到几百毫伏~1V级别。
3、ADC配置要点(音频采样)
-
采样时间要短 音频是高频信号,不能用长采样周期;
STM32:采样周期选 1.5 / 7.5周期,保证能跟上44.1kHz。
-
必须DMA 音频连续采样,禁止CPU循环读取ADC,会丢采样点。DMA循环搬运ADC结果到缓冲区。
-
参考电压:稳定3.3V,最好加0.1uF去耦电容;
-
模拟地与数字地单点共地,减少电源噪声。
4、软件流程
-
DMA循环采集ADC原始值;
减去直流中点值:
以3.3V系统,中点1.65V;12位ADC:中点raw值 = 2048
int16_t audio_sample = (int16_t)adc_raw - 2048;
把0‑4095无符号ADC值转换成有符号音频样本:正负代表声波上下振动。
3. 缓冲区做乒乓缓存(ping‑pong buffer):DMA半满/满中断,一缓冲区采集,另一缓冲区处理;
4. 可选:滤波、压缩、编码(PCM),保存音频数据。
5、STM8为什么不适合音频采样
STM8S ADC最大时钟4MHz;单次转换需要14个ADC时钟周期。
单次转换时间:14/4M = 3.5μs → 理论最大采样率 ~285kHz。
但没有硬件DMA,完全靠CPU读取,中断开销巨大,跑44.1k容易丢点;适合直流、低频传感器,不适合音频。
音频采样建议硬件:STM32F103 / F4 / GD32,带DMA。
6、两种工程方案对比
方案A:MCU+ADC直接采样PCM
-
优点:成本低;
-
缺点:需要运放偏置放大;MCU负担重;适合简单语音采集。
方案B:专用音频ADC芯片(PCM1808等)I2S接口
-
I2S硬件接口,专门传输音频;MCU只接收数据流,不用处理模拟偏置;音质好。
STM32自带I2S外设,做音频优先选I2S音频芯片。
7、常见踩坑
-
没有隔直电容、没有直流偏置:负半周削波,采样全是噪声;
-
信号幅值太小:ADC数值几乎不动,需要运放放大;
-
不使用DMA:大量采样点丢失,声音卡顿失真;
-
电源噪声:模拟地没有处理,采样出来满底噪;
-
采样率不满足奈奎斯特,发生混叠,产生奇怪杂音。
如果你需要,我可以给:
1)运放麦克风偏置放大完整原理图说明;
2)STM32 DMA+ADC乒乓缓存音频采样示例代码;
3)或者I2S音频采集简单示例。