更改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中缓冲区的播放速率?的主要内容,如果未能解决你的问题,请参考以下文章

spi flash支持哪些文件系统

C++ 以缓冲速率从 STDIN 读取输入

更改缓冲区大小以在 C 中复制文件

谷歌协议缓冲区是不是支持序列化前的大小计算?

目标 c - 从远程服务器播放音频时显示缓冲进度

如何从音频队列缓冲区中提取整数样本并将修改后的样本写回?