Где я могу получить реализацию с открытым исходным кодом алгоритма проектирования оптимального КИХ-фильтра 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


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')
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.