我使用Rtaudio庫,並且我想實現一個音頻程序,在該程序中我可以控制平移(例如,將聲音從左聲道移至右聲道)。如何用RtAudio調整音頻平移
在我的具體情況,我使用雙工模式(你可以在這裏找到一個例子:duplex mode)。這意味着我將麥克風輸入鏈接到揚聲器輸出。
我應該在輸出緩衝區上應用一個過濾器嗎?什麼樣的過濾器?
任何人都可以幫助我嗎?
我使用Rtaudio庫,並且我想實現一個音頻程序,在該程序中我可以控制平移(例如,將聲音從左聲道移至右聲道)。如何用RtAudio調整音頻平移
在我的具體情況,我使用雙工模式(你可以在這裏找到一個例子:duplex mode)。這意味着我將麥克風輸入鏈接到揚聲器輸出。
我應該在輸出緩衝區上應用一個過濾器嗎?什麼樣的過濾器?
任何人都可以幫助我嗎?
要減少左側的信號,只需將左側的每個樣本乘以小於或等於1的數字,我們稱它爲l。同樣的權利,我們會打電話給那個號碼r。一般而言,您不想乘以大於1的數字,否則可能會導致信號失真。
l和r都是「平移位置」的函數。你如何從泛位置到你的數字是一個討論的問題。如果這是簡單的東西,你可以匝道值線性下降,在極端使用這些值:
Hard Left:
l=1; r=0
Center:
l=1; r=1
Hard Right:
l=0; r=1;
如果這是什麼發燒友,你應該谷歌爲「泛法律」。下面是一個看起來像一個良好的開端的例子:
http://www.kvraudio.com/forum/viewtopic.php?p=4264576
更新: 我從來沒有使用RT音頻(我一般用PortAudio,這是類似),但我認爲代碼平移會看起來像這與上面定義的l和r(假設類型爲int32_t - 帶符號的32位整數):
int inout(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
double streamTime, RtAudioStreamStatus status, void *data)
{
if (status) std::cout << "Stream over/underflow detected." << std::endl;
int32_t *ob = (int32_t *)outputBuffer;
int32_t *in = (int32_t *)inputBuffer;
unsigned long *bytes = (unsigned long *) data;
int i =0;
while(i < bytes/4) {
ob[i] = (int32_t) (ib[i] * l + .5);
++i;
ob[i] = (int32_t) (ib[i] * r + .5);
++i;
}
return 0;
}
謝謝您的回答。 – user1801724
其實,那不是我所需要的。 如果您從雙工模式示例開始,則在函數inout中有一個audio * outputBuffer。我如何修改緩衝區以平移?我的意思是一個簡單的2D音頻平移 – user1801724
我添加了一些示例代碼,不知道它是否正確,但它會給你的想法。使用我認爲RtAudio支持的浮點數據可能更容易。此外,僅供參考,大多數人都說2D平移,所以沒有混淆,但它確實是一維的。 –