搜索
bottom↓
回复: 28

请教关于i2s的位时钟的问题

[复制链接]

出0入0汤圆

发表于 2010-11-9 15:45:51 | 显示全部楼层 |阅读模式
比如一个wav文件的采样频率为44.1k,16bits,2声道,

我的理解:
是不是说必须将MCU的i2s接口的【位时钟】设置为 44.1k * 16 * 2 = 32fs,
i2s的DAC(比如tda1543)才能【正常】播放?谢谢

但是, 一个采样频率为22.05k,16bits,2声道的文件在32fs的位时钟下也能正常播放。

出0入0汤圆

 楼主| 发表于 2010-11-9 19:15:10 | 显示全部楼层
测试: 播放采样频率为44100和22050的文件的时候,用示波器看MCU输出的位时钟频率和声道切换的时钟(约为44100HZ)都是一样的。

出0入0汤圆

 楼主| 发表于 2010-11-9 20:56:39 | 显示全部楼层
简化问题:


2声道的情况下:

位时钟频率是不是一定要等于2×采样频率×采样位数?

出0入618汤圆

发表于 2010-11-9 21:17:53 | 显示全部楼层
不是的。

I2S格式是左对齐,MSB先发,声道切换时钟比首位数据延迟1个位时钟,帧长度可以是16/32位,数据长度可以是16/18/20/24位,DAC不能处理的多余位数自动忽略。
也就是说,44.1k/16b/2ch数据,I2S可以用44.1k * 16b * 2ch = 32fs或44.1k * 32b * 2ch = 64fs的速率来传送,而44.1k/24b/2ch的数据就必须用44.1k * 32b * 2ch = 64fs速率传送。

声道切换时钟和采样率必须是一致的,播放22.05k的WAV,声道切换时钟必须是22.05k。

出0入0汤圆

 楼主| 发表于 2010-11-9 21:56:46 | 显示全部楼层
》》声道切换时钟和采样率必须是一致的,播放22.05k的WAV,声道切换时钟必须是22.05k。

非常感谢,如果声道切换时钟和采样率不一致,会出现什么样的情况?

我播放22.05k的wav是,测到声道切换时钟还是44.1kHz,还是能放的,但没注意是否变快?明天再细测一下。

出0入0汤圆

发表于 2010-11-9 22:05:56 | 显示全部楼层
44.1k/16b/2ch数据,I2S至少需要用44.1k * 16b * 2ch = 32fs,当然也可以用48fs,64fs,理论上(32+2N)fs都可以。

而44.1k/24b/2ch的数据就至少用44.1k * 24b * 2ch = 48fs速率传送。

出0入0汤圆

 楼主| 发表于 2010-11-9 22:11:03 | 显示全部楼层
还有一个问题不解:

声道切换时钟和采样率必须是一致的,所以对于44.1k/16b/2ch数据,它会在每发送16b*2ch=32bits数据做一次声道切换,就是说,每次给一个声道发送32bits/4字节的数据,然后再转换到另一个声道发4字节的数据,然后再轮换。

可以这样理解吗?

出0入0汤圆

发表于 2010-11-9 22:13:48 | 显示全部楼层
回复【2楼】rwen2012 一问
简化问题:
2声道的情况下:
位时钟频率是不是一定要等于2×采样频率×采样位数?
-----------------------------------------------------------------------
是的

出0入0汤圆

 楼主| 发表于 2010-11-9 22:15:29 | 显示全部楼层
回复【5楼】90999  张耀扬
44.1k/16b/2ch数据,i2s至少需要用44.1k * 16b * 2ch = 32fs,当然也可以用48fs,64fs,理论上(32+2n)fs都可以。
而44.1k/24b/2ch的数据就至少用44.1k * 24b * 2ch = 48fs速率传送。

-----------------------------------------------------------------------

谢谢,对于44.1k/16b/2ch数据,如果不是32fs,如48fs,DAC是怎么知道播放的速度的? 就是同步的问题。

出0入0汤圆

 楼主| 发表于 2010-11-9 22:16:25 | 显示全部楼层
回复【7楼】microida  

回复【2楼】rwen2012 一问
简化问题:
2声道的情况下:
位时钟频率是不是一定要等于2×采样频率×采样位数?
-----------------------------------------------------------------------
是的

-----------------------------------------------------------------------

晕了, 我不知道哪个是对的了。god

出0入0汤圆

发表于 2010-11-9 22:26:16 | 显示全部楼层
是我的理解有错

出0入0汤圆

 楼主| 发表于 2010-11-9 22:32:06 | 显示全部楼层
回复【10楼】microida  
-----------------------------------------------------------------------

其他问题麻烦帮忙看看啦,很多不解啊,呵呵 谢谢

出0入618汤圆

发表于 2010-11-9 23:25:18 | 显示全部楼层
回复【6楼】rwen2012 一问
声道切换时钟和采样率必须是一致的,所以对于44.1k/16b/2ch数据,它会在每发送16b*2ch=32bits数据做一次声道切换,就是说,每次给一个声道发送32bits/4字节的数据,然后再转换到另一个声道发4字节的数据,然后再轮换。
-----------------------------------------------------------------------
不是的。


回复【8楼】rwen2012 一问
谢谢,对于44.1k/16b/2ch数据,如果不是32fs,如48fs,dac是怎么知道播放的速度的? 就是同步的问题。
-----------------------------------------------------------------------
我觉得这里有必要做点名词解释:
1.位时钟(BCK),串行数据的时钟
2.字时钟(WS),控制声道切换,在I2S标准中,WS跳变比数据MSB超前1个BCK
3.传输字长,一次WS跳变所传输的位数
4.数据(SDATA),音频采样数据,左对齐,从最高位开始发,传输字长大于数据长度的补0

重放采样率是由WS决定的,每一次WS跳变传输一个声道的一个采样数据,传输字长可以比数据长度长,DAC会忽略超过自己处理能力的部分。
举例:
1. 44.1k/16b/2ch的数据,可以用32b模式传输,前16位是数据,后16位是0。
2. 44.1k/24b/2ch的数据,必须用32b模式传输,前24位是数据,后8位是0。
3. 如果16位的DAC(例如TDA1543)接收到44.1k/24b/2ch的数据(I2S实际以44.1k/32b/2ch传输),那么它只会处理前16位,忽略后16位(8位数据和8位0)。

简单概括,DAC以WS作为采样率参照,实际上并不关心BCK和字长,只管接收自己能处理的数据长度,多余的忽略掉,直到WS跳变切换下一声道。甚至,WS可以不是50%占空比,即允许每个声道的传输字长不同。

出0入0汤圆

 楼主| 发表于 2010-11-10 09:38:47 | 显示全部楼层
感谢楼上的各位,特别是gzhuli咕唧霖大侠, 终于能基本理解了。

小结一下,请指正:

==========================
名词解释:
1.位时钟(BCK),串行数据的时钟
2.字时钟(WS),控制声道切换,在I2S标准中,WS跳变比数据MSB超前1个BCK
3.传输字长,一次WS跳变所传输的位数
4.数据(SDATA),音频采样数据,左对齐,从最高位开始发,传输字长大于数据长度的补0

================
1、字时钟(WS),即声道切换时钟和采样率必须是一致的。对于44.1k/16b/2ch的数据,用16b模式传输时,它的字时钟频率是44.1kHz,所以每个周期会传送
16bits * 2个位大小的数据。在一个周期中会产生一次电平跳变,在占空比是50%的时候,每个声道的数据长度各占一半,即16bits大小。

2、如果字时钟和采样率不一致,播放时就会不正常。比如字时钟频率为44.1k时播放22.05k的wav文件,就会比正常快一倍。

3、DAC播放的速度和字时钟频率有关,和位时钟无关。对于44.1k/16b/2ch数据,I2S至少需要用44.1k * 16b * 2ch = 32fs的为速率,当然也可以用48fs,DAC都能正确接收,但播放时只会参考字时钟频率。


4、如果16位的DAC(例如TDA1543)接收到44.1k/24b/2ch的数据(I2S实际以44.1k/32b/2ch传输),那么它只会处理前16位,忽略后16位(8位数据和8位0)。

出0入0汤圆

发表于 2010-11-11 20:40:29 | 显示全部楼层
1、字时钟(WS),即声道切换时钟和采样率必须是一致的。对于44.1k/16b/2ch的数据,用16b模式传输时,它的字时钟频率是44.1kHz,所以每个周期会传送
16bits * 2个位大小的数据。在一个周期中会产生一次电平跳变,在占空比是50%的时候,每个声道的数据长度各占一半,即16bits大小。

2、如果字时钟和采样率不一致,播放时就会不正常。比如字时钟频率为44.1k时播放22.05k的wav文件,就会比正常快一倍。

3、DAC播放的速度和字时钟频率有关,和位时钟无关。对于44.1k/16b/2ch数据,I2S至少需要用44.1k * 16b * 2ch = 32fs的为速率,当然也可以用48fs,DAC都能正确接收,但播放时只会参考字时钟频率。


4、如果16位的DAC(例如TDA1543)接收到44.1k/24b/2ch的数据(I2S实际以44.1k/32b/2ch传输),那么它只会处理前16位,忽略后16位(8位数据和8位0)。


-----------------------------------------------------------------------------------------------------------------------

BCK速度可以参考DAC的规格书,比如说TDA1541(16bitDAC),他的WS可以上192K,但是BCK只有6.4M,那么他在192KHZ的采样率下只能用32fs,而TDA1543(16bitDAC)在192KHZ可以用48fs.但是却都不能用64fs


纠正一下:

2. 44.1k/24b/2ch的数据,必须用大于或等于48b模式传输,前24位是数据,后8位如果有那就是0。

出0入0汤圆

发表于 2010-11-23 16:04:09 | 显示全部楼层
回复【8楼】rwen2012 一问
谢谢,对于44.1k/16b/2ch数据,如果不是32fs,如48fs,dac是怎么知道播放的速度的? 就是同步的问题。
-----------------------------------------------------------------------
WS(字选择,也即声道切换信号)的跳变本身就是同步信号,也代表了采样率.

出0入0汤圆

发表于 2010-11-23 16:04:46 | 显示全部楼层
不好意思,不小心多按了一次发送。。。

出0入0汤圆

发表于 2013-7-5 16:57:16 | 显示全部楼层
多年后 学习了。。。。

出0入0汤圆

发表于 2014-1-22 11:46:34 | 显示全部楼层
gzhuli真是什么什么都懂,刚好要用到,谢谢啦

出0入0汤圆

发表于 2014-9-19 12:20:10 | 显示全部楼层
gzhuli 发表于 2010-11-9 23:25
回复【6楼】rwen2012 一问
声道切换时钟和采样率必须是一致的,所以对于44.1k/16b/2ch数据,它会在每发送16 ...

大师,问你一个问题:我能保证 master端 i2s 的 左右声道在 高电平或者低电平时的数据是正确的,那我在slave端采集的时候,能不能只采高电平或者低电平呢?,因为master的时钟不是标准的。

出0入618汤圆

发表于 2014-9-19 12:31:07 | 显示全部楼层
ALUMEI 发表于 2014-9-19 12:20
大师,问你一个问题:我能保证 master端 i2s 的 左右声道在 高电平或者低电平时的数据是正确的,那我在sl ...

不太明白什么意思。
不同DAC有不同要求,一般WS决定采样率,BCK可以和WS不同步,但绝大多数Σ-Δ DAC要求WS和主时钟是精确的倍数关系,所以通常都要求master和slave继承同一个时钟。

出0入0汤圆

发表于 2014-9-19 13:36:22 | 显示全部楼层
gzhuli 发表于 2014-9-19 12:31
不太明白什么意思。
不同DAC有不同要求,一般WS决定采样率,BCK可以和WS不同步,但绝大多数Σ-Δ DAC要求 ...

        1、master的时序是由fpga产生的,它的clk是2.026m。
        2、slave端是一个 soc,它采集的时候,是按2.048m的时钟计算的,这个与master那边有频差;这个2.048m是根据8k采样率,16bit的精度,左右声道各8个通道算出来的。系统版本是linux 3.3.0
问题如下:
        1、因为我实际只传输4路有效的音频的数据,其他通道都是无效的;所以我的想法是,把有效的音频数据全部放在一个声道上(左或者右),另一个通道放无效的数据。由于存在频差(这个无法消除),无效数据所在的声道的 bit clk 也会与另一个声道的 bit clk有差,也就是ws在左右声道的时间长度是不一样的。那么此时 slave 那端采集的时候,能不能只采有效数据所在的那个声道,无效数据的那个声道不采集,即是否可以通到改驱动的方式实现?
        大师,原谅我语文学的不精。
       

出0入16汤圆

发表于 2014-9-19 13:47:59 | 显示全部楼层
查看一下莫元

出0入0汤圆

发表于 2014-9-19 15:27:07 | 显示全部楼层
gzhuli 发表于 2014-9-19 12:31
不太明白什么意思。
不同DAC有不同要求,一般WS决定采样率,BCK可以和WS不同步,但绝大多数Σ-Δ DAC要求 ...

大师,简单来说,就是ws信号能不能做成占空比不是50%? 即左右声道的 bit clk 可以不同,这样子行不行呢?

出0入618汤圆

发表于 2014-9-19 17:21:14 | 显示全部楼层
ALUMEI 发表于 2014-9-19 15:27
大师,简单来说,就是ws信号能不能做成占空比不是50%? 即左右声道的 bit clk 可以不同,这样子行不行呢 ...

我不明白的是,一边SoC一边FPGA,为啥一定要用I2S?SPI不行么?

出0入0汤圆

发表于 2014-9-19 18:00:13 | 显示全部楼层
gzhuli 发表于 2014-9-19 17:21
我不明白的是,一边SoC一边FPGA,为啥一定要用I2S?SPI不行么?

当初设计的时候,fpga这边告诉硬件说要传输音频到soc这边,结果硬件就直接找了soc的 i2s 接口连上了(在第二版硬件时,我才知道这个事情)。这个soc的 i2s 没有跟 spi 复用。

出0入618汤圆

发表于 2014-9-19 18:39:50 | 显示全部楼层
ALUMEI 发表于 2014-9-19 13:36
1、master的时序是由fpga产生的,它的clk是2.026m。
        2、slave端是一个 soc,它采集的时候,是按2.048m ...

还是没明白。
你的意思是FPGA以2.026M的位时钟从SoC读数据,然后SoC为了保持比FPGA快一点点的2.048M时钟,所以要在传输过程中丢掉一些位?
既然SoC的时钟比FPGA高,为何不以SoC为master输出时钟给FPGA呢?
实际上,I2S接口还可以配置为左对齐、右对齐和DSP模式,其中DSP模式就只是WS在帧起始位前有一个脉冲,没有分左右声道的,或许你可以试试这个模式。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-9-19 20:10:52 | 显示全部楼层
gzhuli 发表于 2014-9-19 18:39
还是没明白。
你的意思是FPGA以2.026M的位时钟从SoC读数据,然后SoC为了保持比FPGA快一点点的2.048M时钟 ...

大师,你一语惊醒梦中人啊!采用dsp模式,我就不用考虑master的bit clk够不够,只要能够保证有效数据在2.026m的带宽上传输完整就ok了。大师,nb

出0入0汤圆

发表于 2015-7-9 20:52:11 | 显示全部楼层
wav文件中的原始音频数据是怎么发送的到DX端 的,我的怎么只发出杂音
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 06:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表