1

4 つのバッファーを混合し、パンニングを適用しています。ただし、パンの変更をトリガーすると、クリップが聞こえます。次のコードの潜在的な問題を特定できる人はいますか :-

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 を使用してタイム ストレッチ アルゴリズムを適用します。

Dirac による処理なしでクリッピングが発生します。

4

3 に答える 3

2

4 つの潜在的なフルスケール信号を取得し、それらを加算してから、結果の出力信号を飽和させる前に 0.6 でスケーリングします。したがって、飽和する前の最大範囲は +/- 4 * 0.6 = +/- 2.4 です。したがって、クリッピングが聞こえてもそれほど驚くことではありません。0.6 ではなく 0.25 を乗算すると、最も極端な場合でもクリッピングが解消されますが、一般的なケースでは出力信号レベルが少し低くなる可能性があります。

これを確認するには、飽和コードにデバッグ ログを追加します。

#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;
于 2011-10-13T09:08:37.400 に答える
0

あなたが聞くのは、おそらくクリッピングではなく、4096サンプルごと(またはバッファ長が何であれ)の不連続からポップすることです。急激な変化を避けるために、パン値をスムーズに補間する必要があります。これを行う 2 つの簡単な方法: 1) サンプルごとの最大変化を定義するか、2) バッファー長全体にわたって新しい値に補間します。

いずれにせよ、本質的なイノベーションは、現在の実際のパン値と移動先のパン値を保存することです。

于 2011-10-25T22:25:14.257 に答える