更改C中缓冲区的播放速率?
Posted
技术标签:
【中文标题】更改C中缓冲区的播放速率?【英文标题】:Changing the play back rate of a buffer in C? 【发布时间】:2013-02-22 22:25:34 【问题描述】:我正在使用 Altera DE2 FPGA 板并使用 SD 卡端口和音频线路输出。我正在用 VHDL 和 C 编程,但由于缺乏经验/知识,C 部分是我卡住的地方。
目前,我可以将 .wav 文件从 SD 卡播放到线路输出。我通过读取和发送 SD 卡数据 > FIFO > 音频编解码器 > 线路输出来做到这一点。忽略所有其他细节,代码就是:
UINT16 Tmp1=0;
...
Tmp1=(Buffer[i+1]<<8)|Buffer[i]; //loads the data from the SD card to Tmp1
//change the buffer rate?
IOWR(AUDIO_BASE, 0, Tmp1); //sends Tmp1 data to Line Out
如果我要打印 Tmp1,它基本上是正弦波上的点。我现在要做的是通过更改播放速率来调整声音的播放方式(理想情况下,我想将声音向上或向下播放一个八度音阶,这只是频率的两倍或一半)。任何人都可以在该部分中提供一些关于我如何做到这一点的建议:
//change the buffer rate?
是否可以用 C 语言在该部分中编写几行代码来获得我正在寻找的内容? IE。更改我从 Tmp1 缓冲区读取到 AUDIO_BASE 的速度。
提前致谢!
~萨伦戈
【问题讨论】:
【参考方案1】:如果 IOWR 接口没有提供这样的选项,那么您将不得不自己做:您必须重新采样声音。该理论可以在这里找到 1 这里 2 这里 3 和这里 4 .
将频率提高倍数很容易:只需删除一些样本,例如,通过从缓冲区中删除每个第二个样本来将频率降低 2 倍,使其大小减半。
降低频率更难,因为您需要您没有的信息:样本之间的样本。您可以从简单的线性插值开始,如果您认为它听起来不够好,您可以将其更改为更高级的东西。例如,您可以通过在两个具有平均值的样本之间插入样本来降低频率。如果您的波形如下所示: 5 9 7 3 您将得到 5 7 9 8 7 5 3
【讨论】:
以上是关于更改C中缓冲区的播放速率?的主要内容,如果未能解决你的问题,请参考以下文章