2012-11-06 73 views
3

我使用Rtaudio庫,並且我想實現一個音頻程序,在該程序中我可以控制平移(例如,將聲音從左聲道移至右聲道)。如何用RtAudio調整音頻平移

在我的具體情況,我使用雙工模式(你可以在這裏找到一個例子:duplex mode)。這意味着我將麥克風輸入鏈接到揚聲器輸出。

我應該在輸出緩衝區上應用一個過濾器嗎?什麼樣的過濾器?
任何人都可以幫助我嗎?

回答

0

要減少左側的信號,只需將左側的每個樣本乘以小於或等於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; 
} 
+0

謝謝您的回答。 – user1801724

+0

其實,那不是我所需要的。 如果您從雙工模式示例開始,則在函數inout中有一個audio * outputBuffer。我如何修改緩衝區以平移?我的意思是一個簡單的2D音頻平移 – user1801724

+0

我添加了一些示例代碼,不知道它是否正確,但它會給你的想法。使用我認爲RtAudio支持的浮點數據可能更容易。此外,僅供參考,大多數人都說2D平移,所以沒有混淆,但它確實是一維的。 –