音频数据流的应用
音频数据流是没有任何压缩的音频数据,我们可以直接通过I2S传输到数字功放,也可以对这些数字音频进行处理,比如EQ音量控制、音质补偿等等。
典型应用举例
首先是PC,然后PC通过USB数据线连接到MCU,MCU再通过I2S输出到功放,最后连接到喇叭或耳机。
当然,还有GUI的部分显示可以控制,同时还可以通过麦克风把音频传输到PC进行刻录或保存。
同步问题
USB外设时钟、I2C外设时钟和外部功放时钟是同步的,因为它们共用一个时钟域,但不能同步PC的时钟域。
这些不同的时钟域将会造成音频的不同步,出现断音或丢失部分音频。
主要问题
1. USB的参考时钟(SOF)并不跟系统时钟同步,主要表现在三个方面:
由于温度、电压的不同,引起时钟信号的变化,会产生一些Jitter;
时钟本身的精准度会产生一些Drift;
两个时钟连接在一起的相位可能相反或相同;
2. 我们在传输的过程中会预先开辟一些buffer去存储部分音频数据,buffer的读取、处理时间会有一点延迟,也会造成音频的不同步。
那这些时钟的不同步具体会造成什么样的问题呢?
1. 如果PC的时钟相对MCU慢,那么USB收到音频数据就会慢于I2S所消耗的音频数据,就会造成I2S去取数据音频的时候,buffer的数据还没有准备好而出现下溢。
2. 如果PC的时钟相对MCU快,那么USB收到音频数据就会快于I2C所消耗的音频数据,就会造成当USB接收到音频数据的时候buffer的数据还没有被取走而出现复写的情况。
主要改善
1. 非USB改善:
精准的时钟:可以用高精度的时钟给I2S提供更加准确的采样时钟。
深的存储BUFFER:增加存储的BUFFER,比如我们有足够的RAM,可以先存储大量的数
据。
DMA:用DMA方式可以去减少复制和处理的时间。
减少USB的复制时间:通过优化USB的库可以减少部分USB从USB RAM复制到用户RAM
的时间。
基于SOF信号,同步所有的消耗音频数据:这将造成丢失部分音频数据或出现断音的情
况。
2. USB同步机制:
USB数据速率控制机制(同步/异步/高级)
同步机制比较
STM32同步实现
STM32 USB设备的音频数据流的例程是一个完整的软件库。
提供:
USB音频数据流的应用:USB耳机、喇叭
多种同步方式:
外部时钟同步:运用一个外部可以动态配置的PLL,根据在STM32时钟域和USB主机
时钟域的不同,它允许动态并精准地调节产生I2S的时钟频率
PIPE反馈:USB通过一个特殊的端点去告诉主机现在需要的数据个数,它有在USB 2.0
规范里面定义,但是并没有在音频规范里面定义。
增加/减少采样个数:这样会播放流畅,但会丢失一批音频数据或者出现断音的情况。
SRC同步:SRC是一个把采样率是X的buffer转变成采样率是Y的buffer的一个模块,
它不会丢失数据而仅仅是改变数据,这种转换是基于查补和过滤的方式。
STM32异步机制
应得MCU负荷
应用占有的资源