Showing Posts From

Audiocodec

音频FFT计算流程总结与频谱图解读

本文总结了语音信号序列进行FFT计算其对应频谱的概率、参数总结以及计算流程,并提供了一个Python例子代码对一个wav文件进行频谱图的计算并进行解读。 语音信号FFT计算简介及其参数总结 众所周知,在时域中,音频信号是随着时间波动的压力值(即声压,表现为振幅的大小)。傅里叶变换原理证明了:任何周期性信号都可以分解为一系列不同振幅、频率和相位的正弦波/余弦波之和。因此,音频信号在时域中所表现出来的波动,也可以看做是由无数个不同频率、振幅和相位的正弦波叠加而成的。而对数字音频信号序列所进行的 FFT(快速傅里叶变换)计算,本质上就是从这个数字音频信号序列中提取出来与之对应的各种正弦波的组合,也就是所谓的频谱。 !image.png 对数字域中音频信号的离散时间序列所进行的FFT计算,包含的特性如下: - 对音频信号序列进行 FFT 计算的结果并不是连续的频率分析,而是将总频率范围(从 到音频采样率 )均匀地切割成 个小格子,每个格子被称为一个 Bin, 每个 Bin 的宽度为 。 - FFT 计算输出的结果是 复数。为了得到最终的频谱图,还需要对复数求取其幅度值(Magnitude):,这个幅度值代表了该频率分量在信号中的能量大小。 - 对于实数的音频信号序列,其 FFT 计算结果是对称的。也就是说,如果输入 1024 个音频采样点进行FFT计算,其输出的 1024 个复数中,前 512 个涵盖了 0 到 (奈奎斯特频率)的信息,后 512 个点只是前半部分的镜像。因此,在绘制频谱图时,通常只取前 个数据。 FFT计算结果与频域频点之间的对应关系 如上所述,对一个长度为 的音频序列所进行的FFT计算,其计算结果长度为 的复数序列,这个复数序列前半部分与后半部分呈现出镜像对称。FFT计算结果对应的整个频段为 ,因为整个计算结果序列前后镜像对称,因此这个频率范围均匀地切成了 份。 对于FFT计算的每个输出点(称为一个Bin)而言,其对应的频点计算公式为: 其中 是该复数在数组中的索引(从 0 开始)。如果采样率 ,FFT 长度 N = 1024: - Index 0: (直流分量 DC) - Index 1: - Index 2: - ... - Index 512: (奈奎斯特频率,即最高分析频率) 每个频点的幅度,对这个频点对应的复数求其幅度值:,这个幅度值代表了该频率分量在信号中的能量大小。 FFT运算的重点参数 音频序列进行FFT运算的重点参数如下:(可结合下面使用FFT进行频谱计算的流程来理解相关的参数) - FFT Size / Window Length / ():每一个音频采样帧参与计算的采样点数,通常取 2 的指数(如 512, 1024, 2048, 4096)。 - 采样率 (): 每秒钟对模拟信号采集的样本数,这个采集频率直接决定了频谱的带宽。根据奈奎斯特采样定律,采样样本序列能够分析的最高频率与采样频率之间的关系为 ,因此如果想要分析 的高频,采样率就必须大于 。 - Window:为了减少频谱泄露,必须在进行 FFT 计算之前给信号加窗。加窗的类型主要有:Hann,Hamming,Blackman。 - Hop Size:相邻两个 FFT 窗口之间滑动的距离。连续的两个音频帧重叠越多(Hop size越小),生成的频谱图在时间轴上越平滑,丢失的信息越少(因为窗函数会压低边缘能量,通过重叠可以补偿这一点)。但Hop 越小,同一个音频序列需要计算的帧数越多,计算成本线性增加。 音频采样帧Window Size、滑动窗口HopSize与连续两帧之间的Overlap Size的示意图如下所示: !image.png 语音信号频谱计算流程 对于一个语音文件,要生成与其对应的频谱图,通常需要包含以下步骤和流程。 语音信号的采集与分帧 音频采样设备(MIC)以固定的采样率 (如16K,32K,44.1K)进行模拟语音信号的采集,根据奈奎斯特采样定理,后续通过FFT能够计算和分析的最大频率对应于 。 此外,一段语音信号可能有几分钟长,直接对整个文件做 FFT 是没有意义的,因为语音信号的频率始终在随时间变化。因此,在进行FFT计算之前,要先将完整的语音信号序列切成许多小段,每一段称为一个音频帧 (Frame)。通常一个音频帧的长度为 N(实际上也就是进行一次FFT计算的点数,即FFT Size),取 2 的幂次方,如512,1024 或 2048。 当然,在分帧方面,连续两个音频帧会有一部分的重叠的,例如,第一个音频帧对应于0-1023区间的音频采样,第二个音频帧则对应于320-1352区间的音频采样,以此类推,直到整个音频文件的末尾。 加窗 经过分帧后的每一个音频帧,在进行FFT计算之前,还需要加窗。在对音频序列进行FFT计算时,如果不加窗,默认就是矩形窗,会导致频谱泄漏和混叠。加窗的目的是让一帧信号的幅度在两端渐变到 0,这样可以让频谱上的各个峰更细,不容易糊在一起,从而减轻频谱泄漏和混叠的影响。当然这样的话,一帧信号两端的部分会被削弱,没有像中央的部分那样得到重视。而弥补的办法就是两个连续的音频帧相互重叠。相邻两帧的起始位置的时间差叫做帧移(也就是Hop Size)。 下图为在语音信号处理过程中常用的窗函数: !image.png 所谓的加窗,就是把音频帧 与相同长度的窗函数帧 逐点相乘: 其结果就是,这一帧信号的首尾被平滑地压低到了 0,这样就强制实现了首尾衔接,消除了断层,避免信号序列起始点和结束点的幅值不一致导致的跳变。 FFT计算与频谱图 接下来就是对加窗后的数字信号序列进行FFT计算,在计算的过程中通过高效的蝶形运算(Butterfly Computation)方式,利用奇偶分解将原本 的计算量降低到 。 对于一个长度为 N 的音频数字序列,FFT 计算结果是相同长度 N 的复数序列。如前所述,因为音频数字序列中全部都是实数,这个长度为 N 的复数序列呈现出镜像对称。 然后计算每个频点的幅度值: ,这代表了该频率分量的强度。因为音频在各个频段上分布的能量跨度极大,必须通过对数映射(dB)的方式转换成分贝值来进行表示:。 最后,将每一帧计算出的频率分贝能量分布(纵轴,使用颜色表示能量大小)按时间顺序(横轴)排列起来,就得到了线性频谱图。 梅尔刻度频谱图 在数字音频领域中,如果是为了进行语音识别或音乐分析,通常会将普通的线性频率转换为梅尔刻度 (Mel Scale)。这是因为人类耳朵对低频的变化比高频更敏感,梅尔刻度能更好地模拟人类的听觉感知。 线性频谱图频率轴上的频率分布是均匀的,而梅尔刻度频谱图的频率轴是前疏后密的,其低频部分非常敏感,而在高频部分则非常压缩。人类的听觉是非线性的,对低频信号更为敏感,我们能轻易分辨出 和 的音高区别,但如果两个频率分别是 和 ,尽管它们同样相差 ,人耳几乎听不出任何区别。 > 梅尔刻度的定义就是为了让等距的梅尔频率变化在人类听觉上感受也是等距的。 从线性频谱图到梅尔频谱图的转换,并不是简单的坐标轴拉伸,而是通过一组梅尔滤波器组(Mel Filter Banks)对线性频率能量进行重新加权聚合。其大致工作流程是: 1. 首先在频谱上放置一系列三角形滤波器:在低频区,这些三角形很窄,排列很密;在高频区,这些三角形变得很宽,排列很稀疏。 2. 将一个音频帧整个频段的幅度数据与每一个三角形滤波器相乘并求和:第一个滤波器会收集低频区的能量,输出一个数值;最后一个很宽的滤波器会收集高频区一大片范围的能量,求和后输出一个数值。就得到了这个音频帧的梅尔刻度的能量分布。 3. 对所有的音频帧均作第二步处理,得到所有音频帧的在不同频段上的梅尔刻度能量分布。 最终,梅尔频谱图上的频点数量取决于梅尔滤波器组的个数,如果之前的线性频谱图中有 1024 个线性频点,通过 40 个梅尔滤波器后,只剩下 40 个梅尔频点。这样的话,梅尔频谱图的横坐标与线性频谱图相同,都等同于音频帧的个数;其纵坐标就变成了由低频到高频的梅尔滤波器组的数量40个。 语音信号频谱的计算示例 下面以语音分类模型(PANNs)代码自带的一个打电话语音文件R9_ZSCveAHg_7s.wav为例,使用torchlibrosa库中的Spectrogram和LogmelFilterBank分别进行线性频谱图和梅尔刻度频谱图的生成流程。 通过以上代码绘制的频谱图如下所示: !image.png 从上面的频谱图可以看到,无论是上方的线性频谱图,还是下方的梅尔刻度频谱图,其横坐标都是音频帧的索引。这个音频文件的长度是7s,采样率32KHz,单通道,总共包含有224000个采样(7s * 32000=224000)。FFT计算频谱的窗口大小为1024个音频采样点,音频帧间隔(Hop size)的样本数为320,因此最终整个wav文件的224000个音频采样被切分为701个(224000 / 320 +1=701)重叠的音频帧。因此,两个频谱图的横坐标都是连续701个音频帧。 线性频谱图的纵坐标方面,因为FFT计算频谱的窗口大小为1024个音频采样点,FFT计算得到的1024个频域结果,因为FFT计算结果是镜像对称的,所以线性频谱图的频点数量就是 . 采样率为32K,每个频点对应的频率就是: - Index 0: (直流分量 DC) - Index 1: - Index 2: - ... - Index 512: 梅尔频谱图是在线性频谱图的基础上生成,在代码中通过mel_bins参数设置梅尔滤波器组的数量为64,按照低频密集、高频稀疏的方式对线性频谱图各个频段的能量进行过滤和汇总,最终在梅尔刻度频谱图的纵坐标上形成64个从低频和高频的能量密度分布。 参考资料 - 语音信号处理中的“窗函数” - 凌逆战 - 博客园

消费类Audio Codec的音频接口总结

本文基于对市场上常用的Audio Codec TLV320AI3101的数据手册进行总结和学习,从中更深入的总结通用audio codec的输入输出接口及其内部的信号处理流程,以此建立对audio codec及其音频处理流程的更为全面的认识。 全文分为三个部分: - 模拟音频输入接口 - 模拟音频输出接口 - 数字音频接口 模拟音频输入接口简介 以TLV320AI3101为例,该型号Audio Codec可以支持6个单端模拟音频输入引脚,其中包含 2路全差分输入(抗噪声能力强,适合远距离麦克风连接)和2路单端输入(简化电路设计)。可以通过内部寄存器的配置以及外部电路设置为单端麦克风接入,差分麦克风接入以及单端/差分Line In接入的工作模式。 下图为TLV320AIC3101的简化框图。对于模拟音频输入而言,标准的做法就是:如果使用单端麦克风,可以通过L2_L和L2_R实现两路独立的左右声道单端麦克风的接入;而如果是使用差分式麦克风的话,可以分别通过L1_L+,L1_L-以及L1_R+,L1_R-接入两路独立的左右声道差分麦克风。 !image.png 当然,也可以把差分模式的L1_L和L1_R作为单端麦克风的接口,这样最多可以同时接入6路单端麦克风。 但是需要注意的是,TLV320AI3101内部只有2个ADC,可以同时并行处理两路模拟音频数据的接入,因此如果同时有更多路模拟音频数据接入的话,就需要共享同一个ADC在多路音频数据通道上切换。而音频采样的采样率是设置到ADC的,所以这样也就意味着多路音频输入共享同一个ADC会导致实际采样率的降低。例如,一路ADC最大可支持96 kHz采样率,若同时激活3路输入,那么每路模拟音频输入的采样率仅为32kHz。 下图是TLV320AIC3101多个模拟音频接入共享同一个ADC的示意图,三个模拟音频输入引脚MIC1L/LINE1L,MIC2L/LINE2L/MICDET,MIC1R/LINE1R共享同一个Left ADC。 !image.png Mic In Mic In就是接入模拟麦克风信号的工作模式,这也是Audio Codec最常用的模拟音频数据的接入模式。 我们在产品中常用的驻极体麦克风的输入信号的峰峰值标准值一般为10 mV ~ 100 mV,而ADC的输入范围则通常设计为±1 V(全差分)或0~2 V(单端),所以麦克风输出信号在进行ADC转换之前,需要先通过前置放大器提升信号的电平,以最大程度的扩展ADC转换信号电平的动态范围。 此外,为了能够让驻极体麦克风正常工作,Audio Codec还需要通过MICBIAS引脚(TLV320AIC3101的MICBIAS典型供电电压2V-2.5V)给驻极体麦克风供电。MICBIAS给驻极体麦克风供电的典型连接是,MICBIAS电压通过电阻(如2.2 kΩ)连接至麦克风正极,形成电流回路(典型电流约0.5 mA)。 下图是麦克风单端接入的示意图: !image.png 为了进一步提升麦克风采集信号的降噪性能,可以采样差分接入的方式最大程度抑制共模噪声: !image.png Line In Line In接口(以及针对输出的Line Out接口)用于与其他的消费电子设备或专业音频设备进行对接。 TLV320AIC3101提供了两组Line In接口,同样可以支持单端输入或差分输入两者模式,通过寄存器配置为单端或者差分连接模式。在单端输入的情况下,其峰峰值(Vpp)的范围为 0.5 V ~ 2 V(对接需避免超过电源电压);在差分输入的情况下,其峰峰值范围为1 V ~ 4 V(共模电压需在AVDD/2 ± 0.3 V内)。因此,当以Line In模式接入时,其电压的动态范围已经接近了ADC的满量程输入了,因此就不需要对其进行进行前置放大了,只需要在PGA中对其增益进行适当微调就好,这一点是Line In模式接入和MIC In接入不同的地方。 此外,在Line In接入的情况下,也不需要额外的通过MICBIAS给Line In信号的上游设备供电,这是两者迥异的另外一点。 下图是全志H3平台的Audio Codec的Mic In以及Line In以差分方式接入系统的示意图。 !image.png 模拟音频输出接口简介 对于Audio Codec而言,有模拟输入接口(MIC,Line In),自然就有模拟输出接口(Line Out,HPOut)。总的来讲,Audio Codec的模拟输出接口一般用于把其内部DAC转换的模拟音频信号通过音频功放放大后驱动不同功率的扬声器、耳机以及以Line Out方式提供给下游的专业音频设备Line In输入接口。 大部分的Audio Codec所包含的模拟音频输入接口,主要有两种类型: - HPOUT,在Audio Codec的DAC输出后增加了一个小的功放,可以直接用于驱动耳机、小功率扬声器。 - Line Out,实际上就是Audio Codec的DAC输出,没有在其内部进行功率放大,因此可以用于连接后一级的功放来驱动更高功率的扬声器。 Line Out Audio Codec在模拟音频输出接口方面,Line Out接口适合连接高阻抗设备,例如专业的音频调音台和通过功放来驱动更大功率的扬声器。该接口的输出峰峰值一般在1 V ~ 2 V之间,具有输入阻抗高、输出阻抗低、输出电流很小( 10 kΩ)。 以TLV320AIC3101为例,该Audio Codec包含两组可独立设置的全功能差分式Line Out接口,均可用于驱动10 kΩ的差分式负载。从DAC输出的模拟音频信号,经过灵活的音频信号路径控制,在混音模块中实现多路不同来源的语音信号的混音处理,再经过增益调节后,最终输出差分音频信号。以下为TLV320AIC3101的Line Out输出的结构图。 !image.png - 左右声道DAC输出的模拟音频信号分别通过寄存器配置连接到DAC_L1/2/3和DAC_R1/2/3。 - 当需要在模拟音频输出中使用混音功能时,把DAC_L1和DAC_R1(DAC_L2和DAC_R2用于HPOUT的输出),以及模拟音频输入端的ADC输入信号PGA_L/PGA_R(这样输入Audio Codec的模拟音频信号经过PGA放大以后就不需要进入ADC-DAC的处理,直接进入模拟音频输出环节)分别接入两个独立的混音模块Volume Controls Mixing,在其内部执行混音功能。 - 如果不需要使用混音功能,可以把混音模块旁路掉,直接把DAC_L3和DAC_R3作为Line Out的模拟音频输出信号。 - 混音模块的输出,与DAC_L3/DAC_R3经过音频路径控制的选择,再经过0-9dB的增益调节后,最终在Line Out接口经过差分电路的转换后以差分形式输出。 需要注意的是,以上电路模块图中,Line OUT接口输出的模拟语音信号的处理路径中包含了一个0-9dB的增益调节功能,这个功能只用于调节DAC输出到Line Out或混音器的信号电压幅度,匹配后端设备的输入灵敏度(如功放、调音台),避免信号过弱或过载。该功能只能提升电压,不能提升电流驱动能力。因此Line Out的驱动电路能力仅 HPOUT的命名很容易产生理解上的混淆,例如在TLV320AIC3101里面HPOUT是High Power Output,即高功率输出接口。但是实际上HPOUT接口内置的功放功率很小,只能用于驱动耳机或者很小功率的扬声器,所以说不上是高功率。这里的High Power应该是针对Line Out接口的,因为Line Out接口没有内置功放,输出电流很小。其实如果这个接口只是用去驱动耳机负载的话称为Head Phone Output倒是更为合适。 完整理解了上面的Line Out接口的结构图以后,理解HPOUT的结构图就比较容易了。其中DAC输出、混音模块、模拟音频信号的路径管理模块都与Line Out的结构别无二致,两者最大的不同在于,HPOUT接口在输出之前进行了功率放大(最后的三角形),所以HPOUT可以用于驱动负荷其功率限制的小功率负载。 !image.png 除了以上的Line Out接口和HPOUT接口以外,部分Audio Codec还内置了一种SPKOUT的更高输出功率的模拟音频输出接口。SPKOUT接口可以用于驱动4~8Ω扬声器,输出功率达到了100-150mW的样子,可以满足一些小功率扬声器的驱动需求。实际上TLV320AIC3101是把HPOUT和SPKOUT两种接口合并起来提供了一个综合的HPOUT接口,既可以用于驱动耳机负载也可以用于驱动小功率的扬声器。 以下表格总结了Line Out接口和HPOUT接口在应用特性上的差异: !image.png 数字音频接口简介 除了能够支持以上的模拟音频数据的输入和输出以外,一般的Audio Codec也同时提供了数字音频数据传输的接口,至少,这个数字传输的接口可以用于: - 把模拟麦克风采集的音频数据经过AD转换以后得到的数字音频数据,通过数字音频接口传输给DSP进行进一步的处理。 - 通过数字音频接口接收DSP传输过来的数字音频数据,经过DA转换以后在扬声器、耳机等设备上播放出来。 而对于Audio Codec而言,最常用的数字音频接口就是I2S接口。一路I2S接口可以用于传输包含两路独立音频数据流的双声道音频数据。为了利用I2S的硬件接口同时传输更多路的音频数据,部分Audio Codec也会在I2S硬件接口上提供TDM时分复用的方式传输多路音频数据的音频传输协议。 I2S接口 I2S(Inter-IC Sound)是一种同步串行接口,专门用于音频数据的传输,具有简单、高效和抗干扰能力强的特点。I2S接口传输的是数字音频数据,通常以PCM(脉冲编码调制)格式表示,实际上也就是Audio Codec中从麦克风采集语音数据经过AD转换后的数字音频数据,或者从DSP接收到的、需要通过Audio Codec进行DA转换后在扬声器播放出来的数字音频数据。 通过I2S所传输的数字音频数据对应的参数包括采样率(如16KHz、32KHz、44.1kHz、48kHz等)、位深(如16位、24位等)和声道数(如立体声双声道)。具体的传输过程中,I2S接口通过时钟信号来同步音频数据的传输。它使用多个时钟信号来控制数据的发送和接收,确保音频数据的准确传输。 I2S硬件接口的信号线包括: - SDIN/SDOUT(Serial Data):串行数据线,用于对外或者对内传输数字音频数据。 - WCLK(Word Clock):字选择信号,用于指示当前传输的是左声道还是右声道数据。通常WCLK为高电平时传输左声道数据,为低电平时传输右声道数据。 - BCLK(Bit Clock):串行位时钟线,用于控制数据的采样速率。音频数据在BCLK的上升沿或下降沿被采样。 下图是TLV320AIC3101的I2S工作时序图。在I2S标准中,数据在WCLK边沿(上升沿或下降沿)延迟1个时钟周期(BCLK)后开始传输下一个声道的MSB数据位。 !image.png TDM接口 如上所述,一路I2S接口只能以左右声道的方式用于传输两路独立的音频数据,形成双声道立体声的音频效果。但是很多时候我们的产品(例如包含麦克风阵列的功能)想要传输更多路独立音频流的时候,除了使用多路独立的I2S接口以外,还可以使用TDM接口来解决这个问题。 在硬件接口上,TDM接口与I2S接口共享同一组物理引脚(DOUT/DIN、SCK、WS),只不过数据传输协议不同。I2S模式可用于传输双通道(立体声)音频数据;TDM模式则用于使用相同的物理接口同时传输多通道(2~8通道)音频数据,通过时隙划分复用同一数据线。 在音频Codec中,TDM接口可以用于在单条数据线上传输多个独立音频通道的采样数据,每个通道的数据按预先分配的时间槽(Time Slot)依次传输。在具体的工作过程中,TDM接口和协议会将数据传输周期划分为多个时隙,每个时隙分配给一个独立的音频数据通道。例如,若TDM支持8个时隙,则可传输8个通道的音频数据,8个通道轮流使用自己的时隙传输数据。 下图是TLV320AIC3101的TDM数据传输时序图。可以看到,使用TDM模式进行多路音频数据传输使用了与I2S相同的硬件接口和物理引脚,只不过不再使用Word Clock区分左右声道,而是在Data In和Data Out固定设置不同音频流所使用的传输时隙,因此,对于使用TDM接口进行多路音频数据传输的上下游设备而言,需要提前协商清楚并设置好同时传输几路音频流,以及各路音频流在传输时序中的时隙才行。 !image.png 对于TDM接口的使用,需要注意的是,TDM接口仍然没有完全的标准化,针对其通信协议细节(如时隙数、对齐方式、时钟相位)缺乏统一的标准,不同厂商的实现可能存在一定的差异,所以在使用TDM接口进行上下游设备之间的对接调试中,可能会遇到一定的兼容性问题,需要调试部分参数才能解决。 PCM接口 其实除了以上的I2S接口和TDM接口以外,在一些Audio Codec上还有一种用于传输数字音频信号的PCM接口(TLV320AIC3101没有PCM接口),该接口多用于语音通信和多通道数据传输场景。 PCM接口一般用于传输未经压缩的多通道(能够更灵活的支持多通道是PCM接口与I2S之间的最大差别)线性PCM音频数据,可支持语音、音乐等多种场景。 具体的使用过程中,PCM接口的典型应用场景就是与单设备多通道、多设备多通道等形态的音频设备进行连接,通过一组PCM接口可以实现多个独立的音频通道的音频数据的传输。例如: - 1个8通道ADC芯片通过PCM接口连接Host,每个时隙传输1个通道的采样数据。 - Host通过1个PCM接口连接4个单声道麦克风(每个设备占用1个时隙)。 !image.png 从接口的硬件定义上,PCM接口与I2S接口很类似,通常包含以下数据线: - PCM_CLK(位时钟):由主设备生成和控制,频率为采样率 × 位宽 × 通道数。例如在16位、8通道、48 kHz采样率的情况下,PCM_CLK频率 = 48k × 16 × 8 = 6.144 MHz。 - PCM_SYNC(帧同步):由主设备生成和控制,标识音频帧的起始位置,频率等于采样率。 - PCM_DIN(数据输入)与 PCM_DOUT(数据输出):传输多通道音频数据。 从以上PCM接口所包含的数据线可以看到,PCM_CLK、PCM_DIN、PCM_DOUT的定义与I2S没有区别,双方之间的区别主要是在I2S的WCLK和PCM的PCM_SYNC上。 !image.png 要彻底解释清楚这两者的差异,首先要弄清楚PCM接口中用于作为帧同步信号的PCM_SYNC中的音频帧是什么意思。 PCM接口中所传输的音频帧,总是由PCM_SYNC的一次跳变(跳变边沿可编程设置)来启动传输,而一个音频帧中包含了PCM接口所连接的多通道中每一个通道的一个音频采样数据,每个音频采样数据占据一个固定的时隙,各个通道在音频帧中所占据的时隙在Host和Device两端的寄存器中进行设置。在这种PCM接口连接多通道音频设备的情况下,一个音频帧被分为多个时隙,每个时隙包含其中一个通道的音频采样数据,整个音频帧由PCM_SYNC信号触发开始一个完整的数据传输周期(即这个音频帧的周期)。 如下图所示的PCM接口连接的四通道音频传输的示意图,一次PCM_SYNC(FS)的跳变启动一个PCM Frame的传输,一个PCM Frame包含四个独立通道的音频采样数据,每个通道的采样数据占据固定的时隙。 !image.png 所以本质上,PCM接口也是以TDM时分复用的方式在在一根DIN和DOUT线上使用不同的时隙传输多个通道的音频采样数据。 参考资料 - TLV320AI3101 datasheet - I2S/PCM - 知乎