Как вычесть одну звуковую волну из другой? - PullRequest
4 голосов
/ 17 ноября 2009

Как вычесть одну звуковую волну из другой? В общем и в C # (или если мы не можем сделать это в C # в C / C ++)

У меня есть звуковая волна A и звуковая волна B (кстати: они в PCM) Я хочу вычесть B из A

Что мне нужно? Libs с открытым исходным кодом (НЕ GPL, но LGPL будет в порядке) Учебники о том, как сделать такую ​​операцию (с использованием или без использования библиотек) Статьи на эту тему

PS: все дело в AEC ...

Ответы [ 2 ]

5 голосов
/ 18 ноября 2009

Если выборки нормализованы до одного и того же уровня и хранятся в формате со знаком, так что «нулевой уровень» равен 0 или 0.0, ответ довольно прост:

S_C = (S_A / 2) - (S_B / 2);

для каждого образца S_A и S_B в A и B.

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

#define PCM_16U_ZERO 32768

short pcm_16u_to_16s(unsigned short u)
{
    /* Ensure that we never overflow a signed integer value */
    return (u < PCM_16U_ZERO) ? (short)u - PCM_16U_ZERO : (short)(u - PCM_16U_ZERO);
}

unsigned short pcm_16s_to_16u(short s)
{
    /* As long as we convert to unsigned before the addition, unsigned arithmetic
       does the right thing */
    return (unsigned short)s + PCM_16U_ZERO;
}
0 голосов
/ 17 ноября 2009

https://stackoverflow.com/questions/1723563/acoustic-echo-cancellation-aec-in-wpf-with-c Задаёт аналогичный вопрос и имеет принятый ответ. Предлагаемая библиотека имеет своего рода эхоподавление, я думаю.

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

...