Предыстория: часто я делаю какую-то задачу обработки сигналов, которая требует уникального фильтра. Обычно в этот момент я захожу в MATLAB и генерирую новый уникальный фильтр, используя . Функция MATLAB firpm()
реализует этот алгоритм Паркс-Макклеллан. Теперь у меня есть фильтр, и я поместил фильтр в массив с жестким кодом. Но вот проблема, у меня теперь есть жестко закодированный фильтр, который работает только для одного сценария.
Проблема: теперь я могу решить мою проблему с обработкой сигналов, но только для очень ОСОБЕННОЙ одиночной частоты дискретизации или ОСОБЕННОГО сценария.
Цель: я хочу иметь возможность вызывать из кода C или другого языка и сделать мой код обработки сигналов более универсальным. Я не могу найти реализацию с открытым исходным кодом !firpm()
Где я могу получить реализацию с открытым исходным кодом алгоритма проектирования оптимального КИХ-фильтра Parks-McClellan (aka в MATLAB)?
PS Я знаю, что я могу проектировать фильтры по-разному, используя оконные или что-то еще ... не стесняйтесь упоминать те в комментариях. Но смысл этого вопроса не в том, чтобы спросить: «Каковы другие методы проектирования фильтров?» смысл в том, чтобы найти реализацию с открытым исходным кодом ОЧЕНЬ ОЧЕНЬ полезной ... или что-то подобное.
PPS Одна из целей этого вопроса состоит в том, чтобы узнать, как работает алгоритм Паркс-Макклеллана, сначала посмотрев код, а затем я планирую прочесть некоторую базовую теорию.
источник
type firpm.m
в MATLAB? Это покажет вам реализацию функции MATLAB.Ответы:
Вот LGPL-версия алгоритма обмена Remez. Код октавы, кажется, является производным от него. Это было связано со страницей википедии Parks McClellan .
Исходный код Janovetz может быть легче использовать в вашем проекте, поскольку он не имеет октавных вызовов, но было бы целесообразно покопаться в журнале изменений ovave -forge svn для получения любой информации об исправлениях ошибок или ускорениях в файле memz.cc. ,
источник
Существует открытая реализация Parks-McClellan (также известная как алгоритм обмена Remez) в GNU Octave, свободная программная реализация среды, подобной MATLAB. Функция с именем «Remember» содержится в пакете «signal» , который находится в Octave-Forge . Если вы загрузите пакет, вы найдете "Rememberz.cc", реализацию алгоритма на C ++.
Одна из приятных особенностей Octave заключается в том, что он почти совместим по коду с MATLAB, так что вы можете легко перенести код для использования там, если хотите. Это хороший способ заглянуть под капот в реализации алгоритмов, представленных в MEX-форме в MATLAB.
источник
Удобную версию можно найти в Python's scipy.signal.remez . Хорошо, если вы используете numpy / scipy.
источник
Вот еще один источник для алгоритма Parks McClellan в C. Этот код отличается от упомянутого выше кода SciPy тем, что в нем удалено 61 из исходных 69 операторов goto (в коде SciPy по-прежнему около 37 операций goto). Он также исправляет код в 3 местах, где может произойти деление на ноль, и имеет некоторый дополнительный код, который проверяет значения границ полосы.
http://www.iowahills.com/A7ExampleCodePage.html
источник
возможно, вы уже знаете это, но если у вас есть Matlab, вы можете использовать кодер Matlab и создать простую функцию, которая использует функцию, которую вы хотите изучить. Затем запустите его и посмотрите созданный C-код. Я пробовал с FFT и с разложением QR, и хотя это немного грязно, это можно понять просто отлично.
источник
Вот статья, которая представляет собой актуальную версию Matlab «основного» алгоритма запоминания. «Программа проектирования оптимальных многополосных КИХ-фильтров на основе MATLAB, основанная на оригинальной идее алгоритма множественного обмена Ремеза» -2011 Международный симпозиум IEEE по схемам и системам (ISCAS) - авторы (Ahsan, Saramaki)
Эта статья хорошо объясняет основной алгоритм. Целью статьи было избежать использования исходного кода на Фортране, который не очень хорошо объясняет алгоритм и часто просто переводится на другие языки.
Я прокомментирую одну вещь. Одна из основных идей алгоритма состоит в том, чтобы подогнать кривую, а затем найти экстремальные точки. Обычно для объяснения этой идеи используется интерполяция Лагранжа, но интерполяция Лагранжа имеет плохие числовые свойства. В исходном алгоритме используется барицентрическая реализация лагранжевой интерполяции, что позволяет избежать многих связанных с ней ловушек лагранжевой интерполяции. Поэтому, если вы пытаетесь полностью понять код, вы можете поискать барицентрическую интерполяцию.
источник
Остерегайтесь различий между версией Matlab и Scipy. Например, эти два утверждения эквивалентны:
источник