I2S/PCM知识点记录

目录

[1.常见的音频采样率有两类,一类是48K domain,另一类是44.1KHz domain](#1.常见的音频采样率有两类,一类是48K domain,另一类是44.1KHz domain)

[2.常见采样深度 【即单声道和单slot位宽】8/12/16/24/32 bit](#2.常见采样深度 【即单声道和单slot位宽】8/12/16/24/32 bit)

3.帧结构

4.I2S/PCM允许实际有效采样位宽比传输的位宽小

5.ddr存储对齐

6.sclk和mclk以及adifclk的产生

6.1误差率分析

[6.2 只有偶数分频](#6.2 只有偶数分频)

7.能否直接用sclk采样sdata、fs/ws

8.信号同步及采样问题

9.关于非标准格式

[10.PCM的fs offset和length](#10.PCM的fs offset和length)

11.音频场景的一个特点


1.常见的音频采样率有两类,一类是48K domain,另一类是44.1KHz domain

48K包括 :8/16/24/32/48/64/96/192 KHz

44.1K包括:11.025/22.05/44.1/88.2 KHz

2.常见采样深度 【即单声道和单slot位宽】8/12/16/24/32 bit

也有20bit采样深度,但是这种情况对sclk/mclk的需求不能很好的兼容

3.帧结构

对于I2S来说,左右声道一起构成了一帧,所以常见的帧长为16,24,32,48,64bit.

对于pcm来说,两个FS之间的所有slot算一帧,所以常见帧长有16/32/48/64/96/128/192/256bit

4.I2S/PCM允许实际有效采样位宽比传输的位宽小

也就是可以用32bit的单声道/slot位宽来传输8/12/16/20/24bit的音频数据。但是无效数据的分布I2S和PCM略微不一样。

  • I2S的有效数据以声道为单位 连续发送,可以左对齐,右对齐,或自定义dataOffset。无效数据部分可以选择传输0或者高阻态(sdo_oen=1)
  • pcm的有效数据以帧为单位连续发送,slot之间没有间隙,有效数据可以在两个fs上升沿之间的任意位置【标准pcm是在fs上升沿,下一个sclk发送有效数据】。无效数据部分可以选择传输0或者高阻态(sdo_oen=1)

5.ddr存储对齐

在ddr中,音频数据总是8/16/32bit存储的,比如说对于24bit的音频,从ddr中读出来都是32bit,其中高8bit无效,那么在串并转换的时候,只从[0] ,[1], ...., [23]bit输出【lsb优先】。反过来24拍串行数据移位到32bit寄存器,然后将32bit写到DDR。

6.sclk和mclk以及adifclk的产生

sclk(bclk):是bit位clk,和串行传输的bitRate相等。也等于 采样率x帧长。

采样率:对于I2S来说就是ws(lrclk)的频率;对于PCM来说就是fs的间隔频率

mclk:在I2S/PCM接口的ADC/DAC系统中,除了SCK和WS外,CODEC经常还需要控制器提供MCLK (Master Clock),这是由CODEC内部基于Delta-Sigma (ΔΣ)的架构设计要求使然。其主要原因是因为这类的CODEC没有所谓提供芯片的工作时钟晶振电路。它需要外部的时钟提供内部PLL。一般是256Fs或384Fs

既然mclk就是256Fs或者384Fs,那么是否可以直接使用mclk作为音频的主要工作频率呢?答案是肯定的,因为常见帧长16/32/64/128/256的音频都可以直接对256Fs的mclk得到,而24/48/96/192的帧长可以对384Fs的mclk直接分频。

那么为什么还要有adifclk呢?因为mclk要么来自片外输入,要么片内通过晶振-->PLL分频出来;如果只有片外输入的mclk,自然就不存在adifclk什么事了,这里讨论片内晶振--->PLL来产生mclk。因为mclk是和FS频率有关的变化量,如果直接用PLL产生,那么需要经常调节PLL的参数,等待PLL稳定的时间比较长,如果可以找到所有mclk的公倍数,那么就可以通过这个clk在逻辑设计中用整数分频得到。而adifclk就是这个所有mclk的公倍数。

首先对192Kx256和88.2Kx256寻找一个公倍数,结果就是7225344KHz,分别是192Kx256的147倍频和88.2Kx256的320倍频。但是这个7225344KHz频率太大了。所以最好是对192K和88.2K分两类独立出频点。

对于48K domain来说,分析所有sclk可得,帧长和采样率要么是2^n要么是3x2^n,最差的情况是帧长和采样率都是3x2^n,那么公倍数必然要求具有9x2^n形式,又该频率大于等于256×max(Fs)=49.152MHz,但49.152MHz只是3x2^n, 所以满足条件的最小公倍数为adifclk=49.152Mx3/2=73.728MHz=3x(3x32x2)x128.

同理得到44.1K domain的最小公倍数频率只需满足11.025x3x2^n且大于等于88.2Kx256即可。adifclk=67737.6KHz=3x11.025x8x256KHz.

综上我们得到

8/16/24/32/48/64/96/192 KHz采样率,8/12/16/24/32采样深度,最大帧长256时的adifclk为73.728MHz

11.025/22.05/44.1/88.2 KHz采样率,8/12/16/24/32采样深度,最大帧长256时的adifclk为67.7376MHz

得到adifclk,在得到mclk和sclk就需要逻辑支持整数倍占空比为50%的分频逻辑【网上大把奇偶占空比50%的数字分频教程】。

另外为了能够高精度的调整输入 sclk/fs/sdi的相位,我们可以在把上面得到的adifclk提频,可以得到adifclk周期精度的相位调整,而不仅仅是在sclk的精度上调整。

6.1误差率分析

上面的频率分别为73.728MHz和67.7376MHz,频率精度都达到了1KHz,对PLL的要求较高,有时我们回取它们的近似频率来做,评价近似频点的好坏可以用sclk,fs及mclk的误差率来分析。

sclk(real)={adifclk(real)/{[adifclk(real)/sclk]取整}

sclk误差率:{sclk(real)-sclk}/sclk

fs误差率:{sclk(real)/帧长-sclk/帧长}/(sclk/帧长) 实际和sclk误差率相同

256FS mclk的实际值:

mclk(real)={adifclk(real)/{[adifclk(real)*帧长/(sclk*256)] 取整}

mclk误差率:{mclk(real) - mclk}/mclk

6.2 只有偶数分频

发现有些工程没有做奇数占空比数字分频,只使用了偶数分频,此时使用上面的adifclk分频得到的sclk,fs,mclk误差就比较大,例如96KHz采样率,48bit帧长,mclk为96x256=24.576MHz,就需要adifclk=73.728MHz 3分频。此时无论采用2分频 【50%的误差】还是4分频【25%的误差】误差都无法接受;sclk为96x48=4.608M,16分频,误差为0.

如果想要在只有偶数分频的工程中得到较好的sclk,fs,mclk误差,就只有偶数倍频率,并加上一个offset,使得本来偶数分频的误差提高,需要奇数分频的误差降低,都到达一个可接收的程度。例如:在计算adifclk时只满足3x2^n,对于48K domian adifclk=48K×256x2^n,找一个比73.728M大的频点196.608Hz,此时对于mclk为96x256=24.576MHz,为8分频,误差为0;sclk为196.608M 42分频,分配后为4681K,误差为(4681-4608)/4608=1.58%。在加个offset取194.796M ,对adifclk 8分频,mclk=24.3495,误差为0.9%;对adifclk 42分频,sclk=4.638MHz,误差为0.65%;都降到了可接受程度。【不推荐只有偶数分频的处理

7.能否直接用sclk采样sdata、fs/ws

因为存在板间传输,sclk和sdata、fs/ws在sclk的采样沿可能存在sdata、fs/ws setup/hold不满足,而且sclk,sdata,ws/fs信号质量可能较差,所以到了sclk/ws/fs到了slv端或者sdata到了Rx端都会用一个高频clk同步这些信号,同步之后是可以用sclk来直接采样sdata、ws/fs的。只不过有可能存在相位偏差,需要调整sclk与sdata,ws/fs的相位,这又需要粗调和细调,细调还是要高频时钟。所以不如将sclk作为数据,产生边沿信号,边沿信号作为条件,在高频时钟下采样。

8.信号同步及采样问题

I2S/PCM board-level 约束及同步(latency&skew&bitsync)_cy413026的博客-CSDN博客

9.关于非标准格式

I2S:标准格式是在ws变化沿后一个sclk发送sdata

PCM:标准格式是在fs上升沿之后一个sclk发送sdata

非标准的自定义格式,这个sdata和ws边沿以及fs上升沿的delay是可以配置的,在逻辑实现上可以统一用计数器来实现,不过无论sdata delay多少,I2S数据不能跨声道,PCM不能跨帧。

10.PCM的fs offset和length

pcm的fs 可以不在sdata的帧起始,fs的持续时间也可以大于一个sclk宽度。

对于fs有offset的情况,特别是fs比数据晚的情况,需要仔细处理。fs的offset就会导致两个fs之间有两个pcm帧在传输。

11.音频场景的一个特点

在拾音和放音的过程中,在开始和结尾的时候有几帧空白或丢帧,人耳是无法感知的,但在拾音和放音中间过程出现问题是可以感觉到的。

所以初始化过程中,有丢帧影响不大。当然还是要尽量避免这种问题。

相关推荐
郁大锤4 天前
linux alsa-lib snd_pcm_open函数源码分析(四)
linux·音频·pcm·源码分析·驱动·alsa
苍天饶过谁?13 天前
SDL 播放PCM
ffmpeg·pcm
橘子味的茶二14 天前
SDL读取PCM音频
ffmpeg·音视频·pcm
郁大锤20 天前
linux alsa-lib snd_pcm_open函数源码分析(一)
linux·驱动开发·嵌入式硬件·音频·pcm·视频编解码
sdkdlwk21 天前
查看多个通道32bit音频pcm数据
音视频·pcm
帅气好男人_Jack21 天前
利用Matlab工具生成滤波器
算法·pcm
易板1 个月前
PCM5102A具有PLL和32位、384kHz PCM/I2S接口的2.1VRMS、112dB音频立体声DAC
音频·pcm·dac·i2s·1024程序员节
韩zj2 个月前
android 蓝牙语音转换成pcm文件,进行播放暂停停止操作
android·蓝牙·pcm
DevinLGT2 个月前
音频编码:PCM【无损音频】
嵌入式硬件·音视频·pcm
懮 俍2 个月前
前端请求音频返回pcm流进行播放
前端·vue.js·音视频·pcm