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云游景区是一种全新的旅游…...
vue3学习源码笔记(小白入门系列)------ 重点!响应式原理 代码逐行分析
目录 备注响应式数据创建ref 和 reactive 核心 作用第一轮的 依赖收集 发生时机setup 阶段 去更改了 响应式数据 会发生依赖收集吗 派发更新派发更新是什么时候 触发的?扩展: setup阶段 响应式数据被修改 会触发组件更新吗 vue 是如何根据派发更新来触发…...
62、SpringBoot 使用RestTemplate 整合第三方 RESTful 服务
这节的要点: 就是弄两个项目 , 从 端口9090 这个项目,通过 restTemplate, 去访问 端口8080 的项目,并获取8080项目的数据。 ★ RESTful服务包含两方面的含义 1. 自己的应用要暴露一些功能供别人来调用。此时我们是服…...
Linux基本认识
一、Linux基本概念 Linux 内核最初只是由芬兰人林纳斯托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多…...
leetcode top 100 (8)无重复字符的最长子串(滑动窗口
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 package TOP1_10;import java.util.HashMap; import java.…...
我也惊呆了!原来软件开发根本不需要会编码
一、前言 众所周知,完成一个大型的企业级系统,公司往往需要大量的人力做支持后盾,例如需要需求分析师、数据库管理员、前台美工、后台程序员、测试人员等。在快速发展中的企业,尤其是中小企业,都是一个萝卜多个坑&…...
定制化图标——Element UI 组件图标替换指南
本篇博客将介绍如何在使用 Element UI 组件时对原生图标进行定制化替换,提供了适用于满足个性化需求的方法和技巧。 引言 Element UI 是一款基于 Vue.js 的流行 UI 组件库,在前端开发中得到广泛应用。然而,在使用 Element UI 的组件时&#…...
63、SpringBoot---定制 RestTemplate--消息转化器、拦截器
★ 定制RestTemplate 如要对RestTemplate进行自定义设置,Spring Boot也提供了两种主要方式:▲ 局部式:在调用RestTemplateBuilder构建RestTemplate之前,先调用RestTemplateBuilder的方法对其定制,通过这种方式设置的R…...
面试系列 - Redis持久化机制详解
目录 一、Redis 持久化机制 二、混合使用 RDB 和 AOF 三、 RDB(Redis DataBase)详解 四、AOF(Append-Only File)详解 Redis 是一个内存数据库,为了持久化数据以确保数据不会在服务器重启时丢失,Redis 提供了两种主要的持久化机…...
Ceph入门到精通-存储集群ceph df 用量统计算法说明
3.2.5. Ceph 如何计算数据使用量 used 值反映了使用的实际原始存储量。xxx GB / xxx GB 代表可用的存储(其中较小的数字)和总存储容量。总容量反映了在复制、克隆或快照前存储数据的大小。因此,实际存储的数据量通常会超过名义上的存储量。这…...
堡垒机的相关介绍
描述 堡垒机,即在一个特定的网络环境下,为了保障网络和数据不受来自外部和内部用户的入侵和破坏,而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为,以便集中报警、及时处理及审…...
桂林手机网站建设/培训课程设计方案
jfxtrasJFXtras的 0.6版现在可用。 JFXtras是JavaFX附加组件的第三方库。 它具有多种可换肤的形状和可换肤的边框以及包括XGrid,XMigLayout和Stack,HBox和VBox可调整大小版本的布局。 JFXtras 0.6设计为可与任何1.2x JavaFX版本一起使用。 它还为所有场…...
北镇网站建设/品牌推广活动策划方案
分享| 2013-07-15 09:33threadroc | 浏览 1611 次既然开启了线程为何还要委托呢?,开启线程本身不就是委托吗?为何委托要显示声明呢?Thread thread new Thread(new ThreadStart(getAllRows)); thread.IsBackground true;thread.Start();比如说以上这段代码,getAllRows就是一…...
游戏加盟网/上海优化seo
存储是系统的最底层,非常重要,如何选择最合适自己存储呢? 梳理下知识点,以备后用 1. 存储应用的场景,了解自己的应用需求、预算及数据使用特点 2. 了解存储的相关知识 3. 选择存储应注意的要素 4. 存储的使用和维护 1. 存储应…...
免费网站可以做cpa?/百度免费推广登录入口
这题,通过多次试验,可以发现,当只存在两堆(以下称对)相等的石子时,先手必输。更进一步,当N对这样的石子存在时,先手必输。 于是,若1要赢,一种方法是ÿ…...
网站建设怎么学习/网络站点推广的方法
一般在给jquery对象取名的时候在前面加$。 一看就知道是jquery对象。 变量命名规则中起始字符可以是 字母,下划线(_),美元符($),只是很多的js库喜欢使用$作为全局变量标志。 jQuery也不例外.加上$,作为jQuery变量标志更容易进行区分。 在使用jQuery 中,如果一个变量…...
江西东乡网站建设/关键词优化技巧
早晨起床时间:6:40 晚上休息时间:12:37 全天处理事件:1.上班。2.复习STM32. 处事经验总结:暂无。 人生感悟:暂无。 其它:暂无。...