Создание коэффициентов фильтра DSP в C / Java для свертки во временной области

Я пишу приложение для смартфонов (Android, iPhone), которое делает некоторые DSP. Я опытный программист. Я также взял один класс EE в DSP и знаю, как использовать Matlab.

Я хотел бы применить фильтры нижних частот и полосы пропускания к сигналу во временной области. По моему мнению, мне нужно выполнить свертку моих образцов временной области и коэффициентов фильтрации. В Matlab я использовал бы функцию fir1 (), чтобы получить коэффициенты фильтра и функции conv () / filter (), чтобы применить свертку.

Я знаю, как написать функцию свертки в Java / C, но я не знаю, как сгенерировать коэффициенты фильтра . Я знаю, что для фильтра нижних частот коэффициенты исходят из функции sinc, а полосовой фильтр в основном представляет собой сдвинутый фильтр нижних частот. Как я могу программно генерировать эти коэффициенты?

Существует код для генерации коэффициентов FIR для фильтров нижних частот и полосовых фильтров с использованием метода windowed-sinc на веб-странице nicholson.com dsp . Код составляет около 10 строк старомодного Basic, но должен быть тривиально конвертируемым на C или Java. На этой странице есть объяснение, если вы хотите повторно получить код.

Искусство, при использовании windowed-sinc, заключается в выборе лучшего окна. Более современный метод, который требует меньше угадывания, заключается в использовании алгоритма Remez-exchange для генерации фильтра из спецификаций.

Я нашел учебник, который генерирует коэффициенты фильтра в C ++-коде, который относительно легко перевести на Java-код. Учебное пособие можно найти здесь: http://baumdevblog.blogspot.com/2010/11/butterworth-lowpass-filter-coefficients.html . Надеюсь, это будет полезно для вас.

Это довольно интересный предмет, и я сам планирую сделать подобный проект в ближайшее время 🙂

Если вы не хотите, чтобы параметры фильтра (полоса пропускания, переходный диапазон и т. Д.) Изменились, самым простым методом является создание коэффициентов в Matlab и их жесткий код в вашей программе. Вы обнаружите, что matlab может генерировать хорошие фильтры со значительно меньшим коэффициентом, который может использовать оконный метод. Учитывая, что свертка является коэффициентом MxN (M = количество коэффициентов фильтра и N – количество выборок), уменьшение M может иметь большое значение в производительности.

В прошлом я успешно использовал версию метода Parks-McClennan (обмен Remez), написанную на C Джейком Яновец, для программной генерации коэффициентов для полосового FIR-фильтра. Вы можете попробовать.