DSP / Ручное смешивание и панорамирование - PullRequest
1 голос
/ 13 октября 2011

Я смешиваю четыре буфера и применяю панорамирование.Однако, когда я запускаю смену панорамы, я слышу клип.Может ли кто-либо увидеть, что потенциально может быть не так со следующим кодом: -

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.

Отсечение происходит без обработки Дираком.

Ответы [ 3 ]

2 голосов
/ 13 октября 2011

Вы принимаете 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 голосов
/ 28 октября 2013

Ваша функция "Конвертировать буфер в плавающее число" неверна.Вы должны разделить на 32767 вместо 32768, иначе вы получите отсечение из-за переворота MSB.

0 голосов
/ 26 октября 2011

То, что вы слышите, вероятно, не обрезка, а извлечение из разрывов каждые 4096 выборок (или независимо от того, какая у вас длина буфера). Вы должны плавно интерполировать значения панорамирования, чтобы избежать резких изменений. Два простых способа сделать это: 1) определить максимальное изменение для выборки или 2) интерполировать до нового значения по всей длине буфера.

В любом случае, существенным нововведением является сохранение текущего фактического значения панорамирования и целевого значения панорамирования для движения в направлении.

...