请教大侠:
是不是配置完ESP32的I2S功能,MCLK\SCLK\LRCK\DSIN &(OR) DOUT线上都有信号出现?
这些信号之间有什么要求吗?比如某个信号是某信号的多少倍?
BCK信号& WS信号,与MCLK\SCLK\LRCK\DSIN &(OR) DOUT怎么对应的呢?
谢谢
离线
LRCLK 是左右声道切换的频率,也就是通常我们说的采样频率fs, 比如 8k/16k/44.1k/48khz等.
MCLK 是 频率的 256/384/512等倍,即 256/384/512fs
SCLK 是位时钟, 如果采样深度16bit, 那么 SCLK = 16fs, 如果fs=48khz, 那么SCLK=768k
DIN, DOUT 就是输入输出了.
用逻辑分析仪挂在 I2S总线上面, 可以加深印象。
离线
LRCLK 是左右声道切换的频率,也就是通常我们说的采样频率fs, 比如 8k/16k/44.1k/48khz等.
MCLK 是 频率的 256/384/512等倍,即 256/384/512fs
SCLK 是位时钟, 如果采样深度16bit, 那么 SCLK = 16fs, 如果fs=48khz, 那么SCLK=768k
DIN, DOUT 就是输入输出了.用逻辑分析仪挂在 I2S总线上面, 可以加深印象。
非常感谢,感觉自己清晰多了
离线
我的16位采样深度,怎么好像变成32位了?
设置:fs=48kHz,采样深度16bit,MCLK=256fs
理论:LRCK(fs) = 48KHz,MCLK=256fs=12.288MHz,SCLK = 16fs=768kHz,
实际量得LRCK(fs) = 48KHz,MCLK=12.288MHz, SCLK = 1.5366MHz
SCLK实际测量值怎么是理论值的2倍?好像变成 32位采样深度了,难道同时选择左右声道,就会倍乘?
离线
另外请教一下,ES8388初始化缺省值fs=48k,是不是说明它工作在fs=48k效果最好?这个fs取多少比较好,是根据音频芯片来的,还是由声音数据来源决定?谢谢
离线
我的16位采样深度,怎么好像变成32位了?
设置:fs=48kHz,采样深度16bit,MCLK=256fs
理论:LRCK(fs) = 48KHz,MCLK=256fs=12.288MHz,SCLK = 16fs=768kHz,
实际量得LRCK(fs) = 48KHz,MCLK=12.288MHz, SCLK = 1.5366MHzSCLK实际测量值怎么是理论值的2倍?好像变成 32位采样深度了,难道同时选择左右声道,就会倍乘?
这个貌似我算错了, 左右声道,应该再乘以2才对。
另外请教一下,ES8388初始化缺省值fs=48k,是不是说明它工作在fs=48k效果最好?这个fs取多少比较好,是根据音频芯片来的,还是由声音数据来源决定?谢谢
fs只要ESP32和ES8388支持之内的都可以, 现在的数字音乐用48khz基本可以满足需要。
如果你想用48khz的I2S采样速度播放 96/44.1hkz等其他采样率的音乐就要重采样(resample).
重采样会引起音频失真等问题。
离线
最近搞IIS驱动哦。
离线
这个貌似我算错了, 左右声道,应该再乘以2才对。
fs只要ESP32和ES8388支持之内的都可以, 现在的数字音乐用48khz基本可以满足需要。
如果你想用48khz的I2S采样速度播放 96/44.1hkz等其他采样率的音乐就要重采样(resample).
重采样会引起音频失真等问题。
做过几年音频DIY,算是老烧友了,给大家科普一下DAC吧。
首先,MCLK是DAC的内部频率,一般要求和BCLK同步,是BCLK的整数倍,从1倍到N倍不等,一般N是2的次幂。
BCLK是DAC传输信号的频率,等于32*LRCK*fs,对于立体声(非TDM),LRCK永远是fs的2倍(64个BCLK周期)。
BCLK是fs的通道数倍数*32,无论采样深度。
对于不到32位的数据,有效数据可能在32位空间的前面(LJ),后面(RJ)或者LRCK同步脉冲的后一位开始(I2S)。
至于采样率,这个看你的需求。硬件采样率和软件采样率不同就会要求采样率转换,这个过程可以做到无损(动态范围大于140dB,失真小于-130dB),但是需要消耗大量的CPU资源。采样率转换器就是个滤波器,带外抑制越高,带宽差越小,采样率越高,需要的CPU资源越多。
因为一般的音频资源都是44.1k的,我推荐硬件采样率设成44.1k就好(不知道ESP32的PLL是否支持,实在不行外加个晶振,然后ESP32设为I2S slave模式)。
采样率越高不意味着音质越好。现代的DAC芯片都是sigma delta技术,内置整数倍插值,除非你的插值器比芯片硬件的好,否则你自己做采样率转换器只会降低音质。
另外常见的误解就是采样率高输出滤波器就会更简单,这个也不正确。DAC内部已经集成插值了,而且SDM调制器也会插值好多倍,同时把音频带外的低频噪声能量移动到高频区(SDM和PWM的最大区别之一,噪声整形),所以你自己做片外插值没啥卵用。
而且DAC内部的插值器一般是固定角频率的,而不是固定绝对频率的,所以通带阻带都是相对输入采样率的。如果你的输入采样率是48k,他的阻带一般是20k,你的输入采样率的96k,他的阻带就是40k。
如果你自己做了插值,而带外镜像抑制没做好,你的镜像频谱是不会被DAC的插值器干掉的,所以这部分会被输出,然后在运放等模拟输出单元里面和你的输入信号非线性混频,导致信号质量下降。
所以老老实实48k或者44.1k,不要作死是最好的,除非你很明确你在做什么。
最近编辑记录 Blueskull (2020-02-26 15:34:05)
离线
@Blueskull 是真正的资深大佬,跟他交流后真是望尘莫及!
离线
都是大佬,萌新看的一脸懵逼
离线
我从stm32学的I2S,stm32的SPI可以弄成I2S,不过我没有按照他那样配置,而是直接cubeMX初始话的
多了一根WS线,用于左右声道的选择,一般要配置的就是频率还有数据的位宽,这两个我现在觉得比较重要,我也才开始玩音频芯片
离线
做过几年音频DIY,算是老烧友了,给大家科普一下DAC吧。
首先,MCLK是DAC的内部频率,一般要求和BCLK同步,是BCLK的整数倍,从1倍到N倍不等,一般N是2的次幂。
BCLK是DAC传输信号的频率,等于32*LRCK*fs,对于立体声(非TDM),LRCK永远是fs的2倍(64个BCLK周期)。
BCLK是fs的通道数倍数*32,无论采样深度。
对于不到32位的数据,有效数据可能在32位空间的前面(LJ),后面(RJ)或者LRCK同步脉冲的后一位开始(I2S)。至于采样率,这个看你的需求。硬件采样率和软件采样率不同就会要求采样率转换,这个过程可以做到无损(动态范围大于140dB,失真小于-130dB),但是需要消耗大量的CPU资源。采样率转换器就是个滤波器,带外抑制越高,带宽差越小,采样率越高,需要的CPU资源越多。
因为一般的音频资源都是44.1k的,我推荐硬件采样率设成44.1k就好(不知道ESP32的PLL是否支持,实在不行外加个晶振,然后ESP32设为I2S slave模式)。
采样率越高不意味着音质越好。现代的DAC芯片都是sigma delta技术,内置整数倍插值,除非你的插值器比芯片硬件的好,否则你自己做采样率转换器只会降低音质。
另外常见的误解就是采样率高输出滤波器就会更简单,这个也不正确。DAC内部已经集成插值了,而且SDM调制器也会插值好多倍,同时把音频带外的低频噪声能量移动到高频区(SDM和PWM的最大区别之一,噪声整形),所以你自己做片外插值没啥卵用。而且DAC内部的插值器一般是固定角频率的,而不是固定绝对频率的,所以通带阻带都是相对输入采样率的。如果你的输入采样率是48k,他的阻带一般是20k,你的输入采样率的96k,他的阻带就是40k。
如果你自己做了插值,而带外镜像抑制没做好,你的镜像频谱是不会被DAC的插值器干掉的,所以这部分会被输出,然后在运放等模拟输出单元里面和你的输入信号非线性混频,导致信号质量下降。所以老老实实48k或者44.1k,不要作死是最好的,除非你很明确你在做什么。
大佬想问个问题,一般用内置DAC能不能直接驱动0.5w的喇叭啊?
离线
正在学习i2c i2s,新人理解起来有点难!
离线