2011-10-13 136 views
1

我混合了四個緩衝區並應用平移。但是,當我觸發平移的變化時,我聽到一個剪輯。任何機構可以看到什麼是潛在的錯誤與下面的代碼: -DSP /手動混合和平移法

for (int i = 0 ; i < numFrames; i++) { 
    //Convert buffer to float 
    float s1 = track1[0][i]/32768.0f; 
    float s2 = track2[0][i]/32768.0f;; 
    float s3 = track3[0][i]/32768.0f;; 
    float s4 = track4[0][i]/32768.0f;; 

    //Apply pan on track one 
    float s1R = s1 * sqrt(1 - panA); 
    float s1L = s1 * sqrt(panA); 

    //Apply pan on track two 
    float s2R = s2 * sqrt(1 - panB); 
    float s2L = s2 * sqrt(panB); 

    //Apply pan on track three 
    float s3R = s3 * sqrt(1 - panC); 
    float s3L = s3 * sqrt(panC); 

    //Apply pan on track four 
    float s4R = s4 * sqrt(1 - panD); 
    float s4L = s4 * sqrt(panD); 

    //Mix the right channel 
    float mixedR = s1R + s2R + s3R + s4R; 

    mixedR *= 0.6f; 
    if(mixedR > 1.0f) mixedR = 1.0f; 
    if(mixedR < -1.0f) mixedR = -1.0f; 

    //Mix the Left channel 
    float mixedL = s1L + s2L + s3L + s4L; 

    mixedL *= 0.6f; 
    if(mixedL > 1.0f) mixedL = 1.0f; 
    if(mixedL < -1.0f) mixedL = -1.0f; 

    //Apply the Left channel 
    audioIn[0][i] = (short) (mixedL * 32768.0f); 

    //Apply the right channel 
    audioIn[1][i] = (short) (mixedR * 32768.0f); 
} 

掃視算法可以改進,我把它從這裏: -

http://www.kvraudio.com/forum/viewtopic.php?t=181222&postdays=0&postorder=asc&start=0

NumFrames爲512;一旦音頻混合,我正在應用使用狄拉克的時間伸縮算法。

裁剪髮生時未經Dirac處理。

回答

2

您正在採集4個潛在的滿量程信號,將它們加在一起,然後在將結果輸出信號飽和之前縮放0.6。所以在飽和之前,最大範圍是+/- 4 * 0.6 = +/- 2.4。因此,你聽到一些裁剪並不令人感到意外。如果乘以0.25而不是0.6,那麼即使在最極端的情況下也應該消除削波,但在一般情況下,輸出信號電平可能會有點低。

要驗證這一點,您可以在飽和代碼中添加一些調試日誌記錄,例如,

#if DEBUG 
    if (mixedR > 1.0f || mixedR < -1.0f) 
     fprintf(stderr, "Clipping occurred for mixedR = %g\n", mixedR); 
#endif 
    if(mixedR > 1.0f) mixedR = 1.0f; 
    if(mixedR < -1.0f) mixedR = -1.0f; 
+0

@peter - 感謝您的回覆。我剛剛嘗試乘以0.25,並得到相同的剪輯。這隻發生在我動態改變平移時。 – Carl

+0

好的 - 有沒有可能您的鍋值超出範圍,即< 0 or > 1? –

+0

@peter - 永遠,我將它們編碼爲浮點數,1或0作爲測試。 – Carl

0

你聽到的可能不是剪裁,而是每4096個樣本(或任何你的緩衝區長度)從不連續點彈出。你需要平滑地插入你的平移值以避免突然的變化。兩種簡單的方法: 1)定義每個樣本的最大變化量或2)在整個緩衝區長度上內插到新值。

無論哪種方式,重要的創新是存儲當前的實際鍋值和目的鍋值向前移動。

0

您的「將緩衝區轉換爲浮點數」函數是錯誤的。您必須除以32767而不是32768,否則由於翻轉MSB會導致裁剪。