Где я могу получить реализацию с открытым исходным кодом алгоритма проектирования оптимального КИХ-фильтра Parks-McClellan?

20

Предыстория: часто я делаю какую-то задачу обработки сигналов, которая требует уникального фильтра. Обычно в этот момент я захожу в MATLAB и генерирую новый уникальный фильтр, используя firpm() . Функция MATLAB firpm()реализует этот алгоритм Паркс-Макклеллан. Теперь у меня есть фильтр, и я поместил фильтр в массив с жестким кодом. Но вот проблема, у меня теперь есть жестко закодированный фильтр, который работает только для одного сценария.

Проблема: теперь я могу решить мою проблему с обработкой сигналов, но только для очень ОСОБЕННОЙ одиночной частоты дискретизации или ОСОБЕННОГО сценария.

Цель: я хочу иметь возможность вызывать из кода C или другого языка и сделать мой код обработки сигналов более универсальным. Я не могу найти реализацию с открытым исходным кодом !firpm()firpm()

Где я могу получить реализацию с открытым исходным кодом алгоритма проектирования оптимального КИХ-фильтра Parks-McClellan (aka в MATLAB)?firpm()

  • PS Я знаю, что я могу проектировать фильтры по-разному, используя оконные или что-то еще ... не стесняйтесь упоминать те в комментариях. Но смысл этого вопроса не в том, чтобы спросить: «Каковы другие методы проектирования фильтров?» смысл в том, чтобы найти реализацию с открытым исходным кодом ОЧЕНЬ ОЧЕНЬ полезной ... или что-то подобное.firpm()

  • PPS Одна из целей этого вопроса состоит в том, чтобы узнать, как работает алгоритм Паркс-Макклеллана, сначала посмотрев код, а затем я планирую прочесть некоторую базовую теорию.

Тревор Бойд Смит
источник
Важно ли, чтобы решение было бесплатным? Вы исследовали Matlab C API?
2
Наивысшим приоритетом является то, что я хочу увидеть исходный код (желательно не фортран, поэтому мне не нужно высовывать глаза). Я не буду ставить ограничение на то, что он должен быть бесплатным (может быть, есть какой-то открытый исходный код, но несвободный исходный код).
Тревор Бойд Смит
3
Я знаю, что вы можете скомпилировать Matlab с помощью компилятора Matlab, а затем распространять с использованием Matlab Runtime ... так что технически ваш клиент не должен платить за лицензию Matlab. Я также знаю о Matlab Engine (он же C для Matlab API). Оба из них не имеют значения, потому что я обычно работаю на встроенной платформе, где ни один не доступен.
Тревор Бойд Смит
1
@TrevorBoydSmith Так как вы просто хотите посмотреть на исходный код, пробовали ли вы type firpm.mв MATLAB? Это покажет вам реализацию функции MATLAB.
Lorem Ipsum
1
Конструкция FIR-фильтра очень полезна для обработки сигналов, и parks-mcclelan - нетривиальный предмет. И все же меня неоднократно голосовали за то, что я спрашиваю о предмете, который IMO прямо вписывается в устав dsp.stackexchange. Пожалуйста, объясните ваши отрицательные голоса.
Тревор Бойд Смит

Ответы:

5

Вот LGPL-версия алгоритма обмена Remez. Код октавы, кажется, является производным от него. Это было связано со страницей википедии Parks McClellan .
Исходный код Janovetz может быть легче использовать в вашем проекте, поскольку он не имеет октавных вызовов, но было бы целесообразно покопаться в журнале изменений ovave -forge svn для получения любой информации об исправлениях ошибок или ускорениях в файле memz.cc. ,

Марк Боргердинг
источник
Я согласен, что использование кода Janovetz в проекте было бы проще, потому что это просто C. Я также определенно согласен, что проверка журнала изменений реализации октавы была бы очень разумной.
Тревор Бойд Смит
Код Janovetz IMO, вероятно, является первым или вторым проектом ... но он не использовался так сильно, как код Octave.
Тревор Бойд Смит
ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ: код Janovetz - LGPL, так что вы можете использовать его в коммерческих условиях.
Тревор Бойд Смит
Первая ссылка в ответе не работает, поэтому здесь ссылка на библиотеку, в которой используется та же реализация.
Machta
11

Существует открытая реализация Parks-McClellan (также известная как алгоритм обмена Remez) в GNU Octave, свободная программная реализация среды, подобной MATLAB. Функция с именем «Remember» содержится в пакете «signal» , который находится в Octave-Forge . Если вы загрузите пакет, вы найдете "Rememberz.cc", реализацию алгоритма на C ++.

Одна из приятных особенностей Octave заключается в том, что он почти совместим по коду с MATLAB, так что вы можете легко перенести код для использования там, если хотите. Это хороший способ заглянуть под капот в реализации алгоритмов, представленных в MEX-форме в MATLAB.

Джейсон Р
источник
«Алгоритм Паркс-Макклеллана представляет собой разновидность алгоритма Ремеза или алгоритма обмена Ремеза, с тем изменением, которое он специально разработан для FIR-фильтров и стал стандартным методом для проектирования FIR-фильтров». Также в SciPy: docs.scipy.org/doc/scipy/reference/generated/...
эндолиты
2

Вот еще один источник для алгоритма Parks McClellan в C. Этот код отличается от упомянутого выше кода SciPy тем, что в нем удалено 61 из исходных 69 операторов goto (в коде SciPy по-прежнему около 37 операций goto). Он также исправляет код в 3 местах, где может произойти деление на ноль, и имеет некоторый дополнительный код, который проверяет значения границ полосы.

http://www.iowahills.com/A7ExampleCodePage.html

user5108_Dan
источник
1

возможно, вы уже знаете это, но если у вас есть Matlab, вы можете использовать кодер Matlab и создать простую функцию, которая использует функцию, которую вы хотите изучить. Затем запустите его и посмотрите созданный C-код. Я пробовал с FFT и с разложением QR, и хотя это немного грязно, это можно понять просто отлично.

кость
источник
1

Вот статья, которая представляет собой актуальную версию Matlab «основного» алгоритма запоминания. «Программа проектирования оптимальных многополосных КИХ-фильтров на основе MATLAB, основанная на оригинальной идее алгоритма множественного обмена Ремеза» -2011 Международный симпозиум IEEE по схемам и системам (ISCAS) - авторы (Ahsan, Saramaki)

Эта статья хорошо объясняет основной алгоритм. Целью статьи было избежать использования исходного кода на Фортране, который не очень хорошо объясняет алгоритм и часто просто переводится на другие языки.

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

Дэвид
источник
Глядя на статью - это модифицированная версия кода Паркс-Макклеллан. Он по-прежнему основан на алгоритме обмена Remez, но, как правило, имеет лучшую производительность и позволяет создавать фильтры, которые намного длиннее, чем те, которые вы получаете из алгоритма PM (или его реализации в Matlab).
Дэвид
1

Остерегайтесь различий между версией Matlab и Scipy. Например, эти два утверждения эквивалентны:

% Matlab
firpm(10,[.2 .8],[1 1],'Hilbert')
# Python
from scipy.signal import remez

remez(11, [0.1, 0.4], [1], type='hilbert')
Чжанвэнь Чен
источник