2013-10-12 45 views
3

我正在創建音頻延遲單元。本質上來說,傳入的樣本進入循環緩衝區,並從一些讀指針中取出,該指針是寫指針後面的一些樣本。對於每個新樣本,這些指針會加1。實現音頻延遲效果單元

此外,爲了允許分數延遲,我實際上有兩個讀取指針分開一個樣本,並使用雙線性插值根據浮點延遲參數在它們之間進行混合。 (我可以使用sinc插值或其他東西,但還沒有打擾過。)

當延遲設置爲特定值時,它都可以正常工作。但是當用戶在播放聲音時改變延遲時,由於變化的延遲抽頭,crack啪聲也很明顯。據推測,它是在不同的採樣點採集信號並在音頻波形中引入隨機步長不連續。

我想知道是否有任何DSP音頻愛好者知道如何解決這個問題,因爲我知道我已經玩過延遲盒,但這種效果沒有發生,但目前我無法想象的解決方案。

+0

您不是在執行雙線性插值,而是在進行常規的舊線性插值。將使用雙線性插值,例如,用於成像。 http://en.wikipedia.org/wiki/Bilinear_interpolation –

回答

3

當你改變延遲時,總會有某種失真。這只是一個挑選你想要的東西的問題。

正如你發現的那樣,如果你只是掉進一個隨機點,從一個樣本值到下一個樣本值的急劇跳轉往往會導致聽得見的流行音樂。一種選擇是簡單地將音頻靜音一小段時間並重新啓動。如果這仍然太突然,可以在幾毫秒內將值縮小到零,並在幾毫秒內將它們縮放到新緩衝區位置。 (有效地快速調低音量,然後在您處於新位置時再備份。)

Propellerhead的原因實際上模擬加速和減慢錄音,就好像它是磁帶延遲一樣,並且您正在移動頭。這非常複雜......您將動態地重新採樣緩衝區音頻,直到您到達新的緩衝區位置。

+0

這是一個很酷的答案。我對最後一個感興趣。問題在於用戶動態地改變了控制器的延遲,所以我得到的控制消息可能很常見,所以靜音不是一種選擇,因爲我不想中斷音頻。 我確實想出了一種類似於你的解決方案,即將音頻從一個延遲交叉淡入到另一個,比如說10ms。這引入了控制延遲,但我懷疑它會混合過渡。但是,簿記相當複雜,特別是在交叉淡入淡出完成之前新的控制消息可以到達。 – Robotbugs

+0

這是一個很好的答案。請注意,它會引入人爲因素,因爲您正在對信號進行重採樣。特別是,如果您正在調整(縮短延遲時間),則可能會產生混疊失真。 –

0

當用戶在播放聲音時改變延遲時,由於變化的延遲抽頭,噪音也很明顯。據推測,它在不同樣本處拾取信號並在音頻波形中引入隨機步驟不連續。

是的。這是完全正確的。我認爲最自然的解決方法是平滑延遲時間的變化。例如,不是從200毫秒延遲跳躍到500毫秒,延遲效應應該在一段時間內平穩地從200毫秒變爲500毫秒。利用這種技術,延遲音頻將會下降或上升,這取決於延遲時間改變的速度。

這種技術可以引入別名(正如Bjorn Roche在評論中指出的那樣)。如果這是一個問題,一個解決方案是使用bandlimited interpolation

0

我不知道DSP單元如何去做,但我建議您將低通濾波器應用於用戶設置的延遲,以消除任何突然的變化。

set_delay[n]表示用戶在時間樣本n處設置的延遲,並且讓filtered_delay[n]爲過濾後的延遲。最簡單的低通濾波器是一個單極IIR濾波器:

filtered_delay[n] = (1-alpha)*filtered_delay[n-1] + alpha*set_delay[n] 

alpha控制濾波器的時間常數的值。應該選擇它作爲響應性和平滑性之間的折衷。

例如,如果用戶突然改變set_delay從100到50個樣品中,用filtered_delayalpha=0.1將是:95,90.5,86.45,...,從而慢慢從100降低至50。