3

我正在使用 Altera DE2 FPGA 板并使用 SD 卡端口和音频线路输出。我正在用 VHDL 和 C 编程,但由于缺乏经验/知识,C 部分是我被困的地方。

目前,我可以从 SD 卡播放 .wav 文件到线路输出。我通过读取和发送 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 的速度。

提前致谢!

~萨伦戈

4

1 回答 1

1

如果 IOWR 接口没有提供这样的选项,那么您将不得不自己做:您必须重新采样声音。该理论可以在这里1这里2这里3和 这里4找到。

将频率提高一个倍数很容易:只需删除一些样本,例如,通过从缓冲区中删除每个第二个样本来将频率降低 2 倍,这样它就有一半的大小。

降低频率更难,因为您需要您没有的信息:样本之间的样本。您可以从简单的线性插值开始,如果您认为它听起来不够好,您可以将其更改为更高级的东西。例如,您可以通过在两个具有平均值的样本之间插入样本来降低频率。如果您的波形如下所示: 5 9 7 3 您将得到 5 7 9 8 7 5 3

于 2013-02-22T22:45:18.980 回答