Программное объединение двух аудио - PullRequest
3 голосов
/ 26 февраля 2011

У меня есть два массива сэмплов двух разных аудиоклипов. Если я просто программно добавлю их вместе, будет ли это эквивалентно наложению одной дорожки на другую в комплекте для редактирования аудио? Например, если у меня есть один аудиоклип с басом, а другой барабан, и я хочу, чтобы они играли вместе.

Я бы, наверное, сделал что-то вроде этого:

 for (int i = 0; i < length_of_array; i++){
   final_array[i] = first_array[i] + second_array[i];
 }

Если это не так, могу ли я получить какое-то указание на то, что будет правильным?

Ответы [ 3 ]

10 голосов
/ 26 февраля 2011

Это правильный путь.В аудио-жаргоне слияние называется MIXING.

НО:

Если у вас короткие сэмплы (16-битная подпись) - вам придется использовать int (32-битная подпись) для добавления, а затем обрезатьобразцы вручную.Если вы этого не сделаете, ваши значения обернутся, и вам будет очень весело слушать то, что вы сделали:)

Вот код:

short first_array[1024];
short second_array[1024];
short final_array[1024];
for (int i = 0; i < length_of_array; i++)
{
    int mixed=(int)first_array[i] + (int)second_array[i];
    if (mixed>32767) mixed=32767;
    if (mixed<-32768) mixed=-32768;
    final_array[i] = (short)mixed;
}

В большинстве случаев вы надеваетеДля обычных аудиосэмплов больше ничего не нужно, так как отсечение будет происходить в крайне редких условиях.Я говорю это из практики, а не из теории.

5 голосов
/ 26 февраля 2011

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

mixed_result[i] = rescale_and_clip_fix( volume1 * input1[i] + volume2 * input2[i] );

Где rescale_and_clip_fix () может быть ограничителем или компрессором, после проверки правильности масштаба после умножения для типа данных результата. Если массив результатов является целочисленным типом данных, то при масштабировании может также потребоваться округление или фильтрация шума.

Если частоты дискретизации различаются, вам необходимо сначала выполнить преобразование частоты дискретизации на одном из входных каналов и / или результат позже.

1 голос
/ 26 февраля 2011

В общем, это даст вам то, что вы хотите - однако, следите за clipping .То есть будьте осторожны, чтобы не привести к переполнению целого числа;и не избегайте этого, просто ограничивая значение до максимума / минимума рассматриваемого типа.Возможно, вам придется применить компрессор , чтобы вернуть значения в диапазон после их добавления.

...