2013-02-22 38 views
3

我正在使用Altera DE2 FPGA開發板並使用SD卡端口和音頻線路輸出。我使用VHDL和C編程,但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寫的幾行代碼在這一節中獲得什麼,我找?即。改變我從Tmp1緩衝區讀取到AUDIO_BASE的速度。

在此先感謝!

〜Sarengo

回答

1

如果IOWR接口提供沒有這樣的選項,那麼你將不得不自己做:你要重新採樣的聲音。這個理論可以在這裏1這裏2這裏3這裏4發現。

通過倍數提高頻率很容易:只需放下一些樣本,例如,通過從緩衝區中刪除每個第二個樣本以降低頻率的一半來降低頻率。

降低頻率比較困難,因爲您需要的信息是您沒有的:樣本之間的樣本。你可以從簡單的線性插值開始,如果你認爲它聽起來不夠好,你可以改變它以獲得更高級的內容。例如,通過在兩個樣本之間插入一個平均值的樣本,可以減少一半的頻率。如果您的波形如下所示:5 9 7 3您將得到5 7 9 8 7 5 3