数字音频播放原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字音频播放原理
一、驱动程序
WM8731是具备ADC(模数转换)、DAC(数模转换)和I2C(某种数据传输方式)功能的模块,一般用作音频解码器,在FPGA上与CPU和音频输入输出端口结合可发挥声卡的功能。
其具体结构图如下。
ADC和DAC方面CPU与WM8731的接口有:
XCK、BCLK、DACDAT、DACLRCLK、ADCDAT、ADCLRCLK。
一般认为驱动WM8731进行ADC和DAC工作的电平有:XCK、BCLK和LRCLK。
它们的工作模式分为Left Justified、Right Justified、I2S和DSP。
工作模式应由WM8731的状态寄存器决定,FPGA似乎没有提供状态寄存器的接口,数据册上的默认值也不一定适用于FPGA,所以可能需要反复调试。
工作模式示意图将在下面给出。
根据工作模式合理供应XCK、BCLK和LRCLK时钟信号即可形成驱动程序。
以上是LRCLK和BCLK驱动WM8731对ADCDAT(模数转换串行数据)或DACDAT(数模转换串行数据)进行传递和采样的过程。
LRCLK由不同电位决定是向左声道传递还是向右声道传递。
串行数据有字长要求,通过更改状态寄存器,有8、12、16和24位四种字长可供选择。
具体选择需要调试。
以上示意图为驱动程序的理想情况。
实际上WM8731对驱动电平(和输出电平)有具体的延时情况和时间要求。
这分为两种模式,master mode(主)和slave mode(从)。
这里的概念大致如下图所示。
在实验中确实遇到了少量延迟(如case语句)就会带来驱动程序无法驱动WM8731工作的情况。
实验中切换弹奏和自动演奏模式时也需要对驱动程序各时钟进行同步。
以上是采样中数据传递方面的讨论。
下面将涉及到详细采样的过程,这需要主时钟(XCLK 或MCLK)来完成。
具体要求由下表给出。
fs是一个与LRCLK对应的值,个人理解是即在一轮24位数据传递中完成模数转换或数模转换的次数(该次数将会被均分到24位数据中每一位的传递上)。
对主时钟的频率要求是:
f MCLK=fs×f LRCLK
结合以上信息可大致做成WM8731驱动程序。
二、音频运算
一般DAC是要和ADC相结合的。
当然,只是需要一个波形的话,CPU的运算可以替代ADC 过程。
为了产生单频声音,需要正弦函数的波形数据。
这以数据可由24位字长的变量给出。
我们将正弦函数的一个周期均分成了48份,因此LRCLK的频率(所谓“单帧采样率”)和声波的频率可表达如下:
f LRCLK=f sound×48
该公式指出可以通过更改LRCLK的频率改变声音的频率。
这是一个相对简易的做法。
本次实验采用了这种方法。
我们在未来希望实现这样的方法,即固定LRCLK的频率,通过变更波形数据(这一般通过重新模仿模数转换即“重采样”来实现)来变更音调。
设周期性波形数据的周期为T,重采样率为fps,数模转换的“单帧采样率”均为f DAC,最终声波频率为f sound,则在该方法下它们的关系预计是:
1 f sound =
T
T×fps
T×f DAC
=
f DAC
fps
×T
固定LRCLK的频率,驱动程序中所有时钟的频率也将固定,这十分有利于时钟的同步运行。
具体实现时,通过对系统时钟CLOCK进行分频来得到不同频率的时钟信号。
如果采用变更LRCLK频率的方法,那么CLOCK的分频计数x应表达如下:
x=f CLOCK
MCLK
=
f CLOCK
sound
中央C和其临近音高D的频率是分别是523Hz和587Hz,如果f CLOCK=50MHz,那么这两个音高需要的x值如下:
x C=5.187
x D=4.621
这两个值在整型运算中是区分不出来的。
当音调升高时x的变动还会更小。
因此需要将系统时钟提高到一个更快的频率。
这一步由锁相环倍频电路实现。
最后将获得的24位波形数据跟随驱动程序传递给WM8731即可实现播放。