Удалить известный аудиовыход с микрофонного входа

Я пытаюсь научиться работать со звуком в максимально возможной степени.

Учитывая известный аудиопоток (позволяет вызывать его stream1) и неизвестный аудиопоток (stream2), которые смешиваются в один поток (mix1).

Теперь, предполагая, что мы знаем stream1 заранее, но не stream2, можно ли использовать stream1 для отмены себя из mix1 и, следовательно, дать нам stream2 с минимумом шума/помехи?

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

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

Ответ 1

Да, это возможно. Два метода:

Временной домен

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

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

Частотная область

В то время как обычный аудио с PCM-кодированием - это всего лишь выборка давления много раз в секунду, это не то, как звук полностью воспринимается. Мы слышим разные частоты. Если вы используете преобразование Фурье (обычно выполняемое с помощью алгоритма FFT), вы конвертируете образцы звука из временной области в частотную область, предоставляя вам уровень звука в разных частотных кодах вдоль пути.

Если вы конвертируете как stream1, так и mix в частотную область, вычитаете stream1 из микса, а затем конвертируете обратно во временную область для вывода, вы можете эффективно удалить большую часть stream1 из микса. Чем больше частотных ковшей вы используете, тем больше требуется процессор, но тем точнее это удаление будет. Обратите внимание, что в то время как это означает, что вам не нужно быть точным, точным, это обычно вредит качеству звука из микса.

Многие программы редактирования аудио используют этот метод для удаления фонового шума.

Ответ 2

Звук - это просто кривая - обычно она колеблется выше и ниже нуля с течением времени (16-битный звук имеет 2 ^ 16 возможных целых чисел, поэтому сырой звук PCM представляет собой всего лишь поток целых чисел в диапазоне + - 32768) - один раз в этот формат - просто переключите знак (+ -) целого числа stream1, а затем добавьте его в соответствующее целое число микса, когда вы проходите через данные как stream1, так и смешайте целое число за раз, а затем перенормируете обратно на + - 32768, чтобы восстановить том - это эффективно стирает stream1 из вашего микширования - звуковой инструмент Audacity дает вам эту опцию

Ответ 3

Я искал везде пример кода, который делает то, что вы хотели сделать. Если бы вы закончили писать какой-нибудь код, вы не против поделиться им? Я был бы счастлив заплатить за ваше время, создавая это + копая это для меня! @m3z