当前位置: 首页 > news >正文

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云游景区是一种全新的旅游…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【生成模型】视频生成论文调研

工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

uniapp 字符包含的相关方法

在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...