PCM和I2S区别

2024-03-16 18:36
文章标签 区别 pcm i2s

本文主要是介绍PCM和I2S区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

I2S和PCM接口都是数字音频接口,而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口,是不是两个接口有各自不同的应用呢?先来看下概念。
PCM(PCM-clock、PCM-sync、PCM-in、PCM-out)脉冲编码调制,模拟语音信号经过采样量化以及一定数据排列就是PCM了。理论上可以传输单声道,双声道立体声和多声道。是数字音频的raw data。
I2S是音频数字化后数据排列的一种格式,说传输的就是PCM,支持单声道和立体声。
以我理解PCM是一个通称、混称,I2S是对原始PCM进行数据排序处理,本质就是PCM,可以说I2S是PCM的子集。所以我想蓝牙芯片上的PCM接口同样可以用I2S来传输。CPU和codec上的PCM和I2S接口也是为支持更多硬件提供的资源。
从系统上讲,cpu的dsp出来的都是pcm信号,我称PCM_father,送到DAC可从speaker等放出,至PCM接口出来PCM_son1,至I2S接口出来PCM_son2,然后送至外部codec或其他外设,通话DAC I2S DAC分别对应。以前一直我有个误解,其实手机里常用的codec也就是对PCM和模拟声音信号的转换,不能解码mp3等压缩编码,这个还是要专用dsp或者软件解码来做的。
一点新知,理解上肯定还是有错误,以后慢慢积累,温故知新。

新的理解:
一般手机cpu到蓝牙的通话实时音频和mp3之类的音频都使用pcm,有的蓝牙芯片内置MP3codec,mp3走uart/usb更合适。

从蓝牙角度讲,蓝牙在制定协议的时候就特意为通话需求制定了一个协议层,专门定义了一种包结构(sco)用于通话,有很好的实时性。而通过uart传输的包一般为alc,用分组传输的方式。两种包的编解使用的软硬件都有些区别。sco包支持的基础码率也是8k的pcm.所以一般蓝牙芯片都会有一个pcm接口。

PCM和I2S最明显的一个不同就是PCM_SYNC信号和LRCLK信号这两个复用的pin
PCM_SYNC用来同步帧,有long fram sync和short frame sync等模式,但并不专门区分左右声道。
而I2S中,这个pin叫做LRCLK,专门用来区分左右声道,以此来同步。低电平代表左声道,高电平代表右声道。

同时,时钟的上升沿和下降沿哪个是输入采样和输出,在PCM和I2S是不同的,I2S还有自己特定的格式。

FYI:
http://blog.sina.com.cn/s/blog_4d5768e801000apo.html

http://blog.csdn.net/sepnic/article/details/6536855

I2S仅仅是PCM的一个分支,接口定义都是一样的, I2S的采样频率一般为44.1KHZ和48KHZ做,PCM采样频率一般为8K,16K。有四组信号: 位时钟信号,同步信号,数据输入,数据输出.

I2S总线标准
I2S(Inter-IC Sound Bus)是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。在飞利浦公司的I2S标准中,既规定了硬件接口规范,也规定了数字音频数据的格式。I2S有3个主要信号:

串行时钟 SCLK,也叫做位时钟BCLK,即对应数字音频的每一位数据,SCLK的频率=2×采样频率×采样位数 ,呵呵,现在问题来了,有人会问这些东西到底是什么意思呢?其实,I2S一般是传输立体声,有两个声道channel,采样频率指得是采样数率,多久去采集一个点,每个点是几个bit组成。
帧时钟LRCK,用于切换左右声道的数据,LRCK为“0”表示正在传输的是左声道的数据,为“1”表示正在传输的是右声道的数据。LRCLK == FS,就是采样频率
串行数据SDATA,就是用二进制补码表示的音频数据,有时为了使系统间能够更好的同步,还需要另外传输一个信号MCLK,称为主时钟,也叫系统时钟(System Clock),是采样频率的256或384倍
I2S协议时序
I2S格式的信号无论有多少位数据,,数据的最高位总是出现在LRCK变化(也就是一帧开始)后的第2个BCLK脉冲处。这就使得接收端与发送端的有效位数可以不同。如果接收端能处理的有效位数少于发送端,可以放弃数据帧中多余的低位数据;如果接收端能处理的有效位数多于发送端,可以自行补足剩余的位。这种同步机制使得数字音频设备的互连更加方便,而且不会造成数据错。
在这里插入图片描述

从时序图可以看出,I2S左右声道分别为高低电平,PCM只有一个起始信号,左声道数据紧跟右声道.
PCM协议
PCM(PCM-clock、PCM-sync、PCM-in、PCM-out)脉冲编码调制,模拟语音信号经过采样量化以及一定数据排列就是PCM了。理论上可以传输单声道,双声道立体声和多声道。是数字音频的raw data.

在这里插入图片描述

从时序图可以看出,I2S左右声道分别为高低电平,PCM只有一个起始信号,左声道数据紧跟右声道.

音频基础之I2S、TDM、PCM传输

DSP

1、采样率
常用的表示符号是fs。通俗的讲采样频率是指计算机每秒钟采集多少个声音样本。采样频率与声音频率之间有一定的关系,根据奈奎斯特理论,只有采样频率高于声音信号最高频率的两倍时,才能把数字信号表示的声音还原成为原来的声音,是衡量声卡采集、记录和还原声音文件的质量标准。

2、采样精度
模拟信号的幅度轴进行数字化,它决定了模拟信号数字化以后的动态范围。采样精度为24bit位即动态范围0~96dbfs。

3、帧长
DSP一次处理的音频采样点数,决定处理延时。如帧长64,采样率为48Kbps,DSP一次计算延时至少0.001333333s.

4、时钟
4.1、音频数据由I2S协议来传输,在I2S中,有很多时序都需要配置。
4.1.1、BCLK:位时钟 (Bitclock,BCK,也称串行时钟SCK):确立数据流中两个相邻位之间边界的信号
4.1.2、LRCK:左/右时钟 (LRCK)/字时钟 (Wordclock,也称WS):一个在采样速率下运行、占空比为 50% 的慢时钟,它确立数据流中两条相邻通道(左和右)之间的边界。
4.1.3、MCLK:主时钟,一般而言,DSP不需要音频主时钟,因为它们能够以一种完全不同的速率对数据进行处理,
例如: 设声音的采样频率为44.1 kHz,即声道选择信号(帧时钟)WS的频率必须也为44.1 kHz;左/右2个声道的量化深度均为16 bit,则I2S的SCK的频率为:44.1 kHz×16×2=1.4112 MHz,SCK = 采样率 * 位宽 * 通道数,WS = 采样率

4.2、音频数据由TDM/PCM来传输,不像I2S有统一的标准,不同的IC厂商在应用TDM时可能略有差异,这些差异表现在时钟的极性、声道配置的触发条件和对闲置声道的处理等。
TDM/PCM与I2S接口对应关系见下表:
在这里插入图片描述

4.2.1、根据 SD相对帧同步时钟FSYNC的位置,TDM分两种基本模式:
Mode A: 数据在FSYNC有效后,BCLK的第2个上升沿有效
Mode B: 数据在FSYNC有效后,BCLK的第1个上升沿有效
在这里插入图片描述

注:不同厂商对Mode A和Mode B定义可能有所差别
应用中,总是以帧同步时钟FSYNC的上升沿表示一次传输的开始。帧同步时钟的频率总是等于音频的采样率,比如44.1 kHz,48 kHz等。多数应用只用到FSYNC的上升沿,而忽略其下降沿。根据不同应用FSYNC脉冲宽度的差别,PCM帧同步时钟模式大致分为两种:长帧同步 Long Frame Sync,短帧同步 Short Frame Sync。长帧同步,如图所示,FSYNC脉冲宽度等于1个Slot的长度。Slot在TDM中表示的是传输单个声道所占用的位数。如图所示TI McASP接口的TDM包括6个Slots,即它最多可包括6声道数据。注意,Slot的位数并不一定等于音频的量化深度。比如Slot可能为32 bit,其中包括24 bit有效数据位(Audio Word) + 8 bit零填充(Zero Padding)。
在这里插入图片描述

b. 短帧同步,FSYNC脉冲宽度等于1个BCLK周期长度;

4.2.2举例
FSYNC的频率等于音频的采样率(例如44.1 kHz,48 kHz等)。Frame每次传输包括所有声道的数据。PCM采样音频数据量化深度一般在16-32bit(最常见为16/24bit)。那么对于8声道,每个声道32bit音频数据,采样率48kHz的系统,TDM的系统时钟速率为:8 × 32 × 48kHz = 12.288 MHz
BCLK = 采样率 * 位宽 * 通道数,FYNC = 采样率。
————————————————

原文链接:https://blog.csdn.net/weixin_48408892/article/details/127282752

这篇关于PCM和I2S区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816342

相关文章

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

深入探讨:ECMAScript与JavaScript的区别

在前端开发的世界中,JavaScript无疑是最受欢迎的编程语言之一。然而,很多开发者在使用JavaScript时,可能并不清楚ECMAScript与JavaScript之间的关系和区别。本文将深入探讨这两者的不同之处,并通过案例帮助大家更好地理解。 一、什么是ECMAScript? ECMAScript(简称ES)是一种脚本语言的标准,由ECMA国际组织制定。它定义了语言的语法、类型、语句、

Lua 脚本在 Redis 中执行时的原子性以及与redis的事务的区别

在 Redis 中,Lua 脚本具有原子性是因为 Redis 保证在执行脚本时,脚本中的所有操作都会被当作一个不可分割的整体。具体来说,Redis 使用单线程的执行模型来处理命令,因此当 Lua 脚本在 Redis 中执行时,不会有其他命令打断脚本的执行过程。脚本中的所有操作都将连续执行,直到脚本执行完成后,Redis 才会继续处理其他客户端的请求。 Lua 脚本在 Redis 中原子性的原因

msys2 minggw-w64 cygwin wsl区别

1 mingw-w64,这是gcc一直win平台下产生的,所以是win版的gcc,既支持32也支持64bit 2cygwin专注于原样在windows上构建unix软件, 3msys让Linux开发者在windows上运行软件,msys2专注于构建针对windows api构建的本机软件 4 wsl  windows subsystem for linux 是一个在windows 10 上能

【Java中的位运算和逻辑运算详解及其区别】

Java中的位运算和逻辑运算详解及其区别 在 Java 编程中,位运算和逻辑运算是常见的两种操作类型。位运算用于操作整数的二进制位,而逻辑运算则是处理布尔值 (boolean) 的运算。本文将详细讲解这两种运算及其主要区别,并给出相应示例。 应用场景了解 位运算和逻辑运算的设计初衷源自计算机底层硬件和逻辑运算的需求,它们分别针对不同的处理对象和场景。以下是它们设计的初始目的简介: