Простой звуковой фильтр-банк - PullRequest
5 голосов
/ 05 мая 2011

Я новичок в звуковых фильтрах, поэтому извините, если я говорю что-то не так.

Мне нравится писать код, который может разбивать звук, хранящийся в сэмплах PCM, на две или три полосы частот ивыполните некоторые манипуляции (например, измените их уровни звука) или проанализируйте их, а затем восстановите аудиосэмплы из вывода.

Насколько я читал в Интернете для этой задачи, я мог бы использовать FFT-IFFT и делать манипуляции насложную форму или использовать набор фильтров на основе временной области, который, например, используется форматом кодирования звука MP2.Может быть, лучше выбрать банк фильтров, по крайней мере, я где-то читал, что это может быть более удобным для использования ЦП в потоковых средах в реальном времени.Однако мне трудно понять математические вещи за набором фильтров.Я пытаюсь найти некоторый исходный код (предпочтительно на Java или C / C ++) по этой теме, но пока безуспешно.

Может кто-нибудь дать мне советы или ссылки, которые могут приблизить меня к примеру фильтрабанк

Ответы [ 3 ]

7 голосов
/ 06 мая 2011

Использование FFT для разделения аудиосигнала на несколько полос - это излишне.

Вам нужен один или два фильтра Линквица-Райли. Эти фильтры разделяют сигнал на высокочастотную и низкочастотную части.

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

Если вам нужно более двух полос, вы можете связать фильтры. Например, если вы хотите разделить сигнал на 100 и 2000 Гц, он будет в псевдокоде примерно так:

low  = linkwitz-riley-low (100, input-samples)
temp = linkwitz-riley-high (100, input-samples)

mids = linkwitz-riley-low (2000, temp)
highs = linkwitz-riley-high (2000, temp);

и т. Д. *

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

Сама секция фильтра может быть реализована с использованием БИХ-фильтров. Поиск в Google по запросу "Linkwitz-Riley digital IIR" должен дать много хороших результатов.

http://en.wikipedia.org/wiki/Linkwitz-Riley_filter

4 голосов
/ 05 мая 2011

Вы должны искать вейвлеты, особенно вейвлеты Добеши. Они позволят вам сделать трюк, это FIR-фильтры и они действительно короткие.

Обновление Понижение рейтинга без объяснения причин не круто. Кроме того, я прав. Вейвлеты - это банки фильтров, и их задача - делать именно то, что описано в вопросе. ИМХО, это так. Я сам делал это много раз.

3 голосов
/ 05 мая 2011

Здесь много исходного кода фильтра здесь

...