I2S/PCM知识点记录
目录
1.常见的音频采样率有两类,一类是48K domain,另一类是44.1KHz domain
2.常见采样深度 【即单声道和单slot位宽】8/12/16/24/32 bit
3.帧结构
4.I2S/PCM允许实际有效采样位宽比传输的位宽小
5.ddr存储对齐
6.sclk和mclk以及adifclk的产生
6.1误差率分析
6.2 只有偶数分频
7.能否直接用sclk采样sdata、fs/ws
8.信号同步及采样问题
9.关于非标准格式
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.音频场景的一个特点
在拾音和放音的过程中,在开始和结尾的时候有几帧空白或丢帧,人耳是无法感知的,但在拾音和放音中间过程出现问题是可以感觉到的。
所以初始化过程中,有丢帧影响不大。当然还是要尽量避免这种问题。
相关文章:
I2S/PCM知识点记录
目录 1.常见的音频采样率有两类,一类是48K domain,另一类是44.1KHz domain 2.常见采样深度 【即单声道和单slot位宽】8/12/16/24/32 bit 3.帧结构 4.I2S/PCM允许实际有效采样位宽比传输的位宽小 5.ddr存储对齐 6.sclk和mclk以及adifclk的产…...

微信小程序——使用 Vant 组件实现 Popup 弹出层(各位置弹出详细代码分享)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
linux查看python的py文件的命令
在 Linux 中,要查看 Python 的 .py 文件内容,可以使用以下几种命令: 使用 cat 命令: cat /path/to/your_python_file.py cat 命令用于显示文件内容,将会在终端输出整个 .py 文件的内容。 使用 less 命令:…...

开源库源码分析:Okhttp源码分析(一)
开源库源码分析:OkHttp源码分析 导言 接下来就要开始分析一些常用开源库的源码了,作为最常用的网络请求库,OkHttp以其强大的功能深受Android开发者的喜爱(比如说我),还有对该库进行二次封装而成的热门库&a…...

无涯教程-JavaScript - LOOKUP函数
描述 需要查看单个行或一列并从第二行或第二列的同一位置查找值时,请使用LOOKUP函数。使用"查找"功能搜索一行或一列。 使用VLOOKUP函数可搜索一行或一列,或搜索多行和多列(如表)。它是LOOKUP的改进版本。 有两种使用LOOKUP的方法- 矢量形式 − Use this form of…...

这所院校太好考了!地处魔都!不要错过!
一、学校及专业介绍 上海电力大学(Shanghai University of Electric Power),位于上海市,是中央与上海市共建、以上海市管理为主的全日制普通高等院校,是教育部首批“卓越工程师教育培养计划”试点院校、上海高水平地方…...

Python - PyQt6、QDesigner、pyuic5-tool 安装使用
Python 开发可视化界面可以使用原生的 tkinter,但是原生框架使用起来颇为不方便,所以最流行的还是QT UI框架,QT是使用C语言开发,Python 想使用需要对其进行封装,所以就出现了PyQt框架,这个框架使用极其方便…...

C语言——指针进阶(三)
目录 一.前言摘要 二.排序函数qsort的模拟实现 三.指针和数组笔试题解析 一.前言摘要 讲述关于strlen和sizeof对于各种数组与指针的计算规则与用法。另外还有qsort函数的模拟实现(可以排序任意类型变量) 二.排序函数qsort的模拟实现 目标:…...

三勾商城(java+vue3)微信小程序商城+SAAS+前后端源码
项目介绍 本系统功能包括: 前台展示后台管理SAAS管理端,包括最基本的用户登录注册,下单, 购物车,购买,结算,订单查询,收货地址,后台商品管 理,订单管理&…...

【洁洁送书第七期】现在学 Java 找工作还有优势吗
java 现在学 Java 找工作还有优势吗?活力四射的 JavaTIOBE 编程语言排行榜从零开始学会 JavaJava 语言运行过程基础知识进阶知识高级知识talk is cheap, show me the code结语 文末赠书 现在学 Java 找工作还有优势吗? 在某乎上可以看到大家对此问题的…...

npm发布自定义vue组件库
npm发布自定义vue组件库 创建项目 vue create test-ui自定义组件 创建自定义组件,组件名称根据你的需求来,最好一个组件一个文件夹,下图是我的示例。 src/components 组件和你写页面一样,所谓组件就是方便实用,不用…...

9.12 C++作业
实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半…...

利用LinuxPTP进行时间同步(软/硬件时间戳) - 研一
转自:https://blog.csdn.net/BUPTOctopus/article/details/86246335 官方文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/s1-using_ptp 查看网卡是否支持软硬件时间戳: sudo ethtoo…...
《极客时间:左耳听风——程序员练级攻略》【文章笔记个人思考】
原文链接:https://time.geekbang.org/column/intro/100002201 69 | 程序员练级攻略:开篇词70 | 程序员练级攻略:零基础启蒙编程入门入门语言 Python入门语言 JavaScript操作系统入门 Linux编程工具 Visual Studio CodeWeb 编程入门实践项目小…...

Springboot 实践(15)spring config 配置与运用—自动刷新
目前,网络上讲解spring config的自动刷新,都是通过git服务站的webhook功能执行“actuator/bus-refresh”服务实现的自动刷新。我们的前文讲解的配置中心,配置中心仓库使用的时本地地址,如下图所示: 那么,配…...

FirmAFL
FirmAFL使用并改进了Firmdyne模拟方式,并利用AFL对IoT固件实施高通量灰盒Fuzzing。 一、项目简介 FIRM-AFL 是 第一个针对物联网固件的高吞吐量灰盒模糊测试器。 支持mipsel、mipseb和armel三种CPU架构 ,涵盖Firmadyne数据库中90.2%的固件。 FIRM-AFL 解…...

SpringMVC的整合完成CRUD(增删改查)
SpringMVC是一种基于Java的Web框架,它是Spring框架的一部分。SpringMVC通过使用MVC(Model-View-Controller)设计模式来组织和管理Web应用程序的开发。 在SpringMVC中,Model代表数据模型,View代表用户界面,C…...

Postman使用_Tests Script(断言测试)
断言测试可以在Collection、Folder和Request的 pre-request script 和 test script中编写,测试脚本可以检测请求响应的各个方面,包括正文、状态代码、头、cookie、响应时间等,只有测试符合自定义的要求后才能通过。 pm对象提供了测试相关功能…...

问道管理:华为概念股捷荣技术13天10板,监管质疑迎合热点炒作
捷荣技能(002855.SZ)一口气将气氛拉满。 盘面看,自8月29日启动到9月14日,捷荣技能用了13天时间,将累计涨幅推到了188%,期间有10个涨停板,如此冷艳之举,还在于其“华为概念”。 …...

VR云游:让游客足不出户享受旅行的乐趣
随着人们的生活水平不断提高,对于旅行的需求也在日益增长,既要玩的舒心,也要享受的舒服,因此VR全景云游就成为了一种新型的旅行方式,人们足不出户就可以沉浸式游览各地自然风光与名胜古迹。 VR云游景区是一种全新的旅游…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...