Де я можу отримати реалізацію оптимального алгоритму проектування фільтрів FIR з відкритим кодом?


20

Передумови: Часто я роблю якусь задачу по обробці сигналу, яка вимагає унікального фільтра. Зазвичай в цей момент я до MATLAB і новий унікальний фільтр, використовуючи . Функція MATLAB реалізує алгоритм Паркс-МакКлеллан. Тепер у мене є фільтр, і я ставлю його в масив із твердим кодом. Але ось проблема у мене зараз фільтр жорсткого коду, який працює лише для одного сценарію.firpм()firpm()

Проблема: тепер я можу вирішити свою проблему з обробкою сигналу під час поїздки ... але лише для дуже СПЕЦИФІЧНОЇ єдиної швидкості вибірки або СПЕЦИФІЧНОГО сценарію.

Мета: Я хочу мати можливість зателефонувати з коду С або іншої мови та зробити свій код обробки сигналів більш загальним. Я не можу знайти реалізацію з відкритим кодом !firpм()firpm()

Де я можу отримати реалізацію оптимального алгоритму проектування фільтра Parks-McClellan з відкритим кодом (aka у MATLAB)?firpм()

  • PS Я знаю, що я можу розробити фільтри по-різному за допомогою вікон або чогось іншого ... не соромтесь згадувати про це в коментарях. Але суть цього питання не в тому, щоб запитати "які інші методи проектування фільтрів?" справа в тому, щоб знайти реалізацію з відкритим кодом ДУЖЕ ДУЖЕ корисних ... чи щось подібне.firpм()

  • PPS Однією з цілей цього питання є дізнатися, як працює алгоритм Паркс-МакКлеллан, спочатку переглянувши код, а потім я планую прочитати деяку фонову теорію.


Чи важливо, щоб рішення було безкоштовним? Ви досліджували API Matlab C?

2
Найвищий пріоритет - я хочу бачити вихідний код (бажано, не fortran, тому мені не доведеться колоти очей). Я не буду ставити обмеження, що воно повинно бути вільним (можливо, є якийсь відкритий код, але невільний вихідний код).
Тревор Бойд Сміт

3
Я знаю, що ви можете компілювати Matlab за допомогою компілятора Matlab, а потім розповсюджувати за допомогою Runtime Matlab ... тому технічно вашому клієнту не доведеться платити за ліцензію Matlab. Я також обізнаний з двигуном Matlab (він же C до Matlab API). І те й інше не має значення, оскільки я зазвичай працюю на вбудованій платформі, де немає жодної.
Тревор Бойд Сміт

1
@TrevorBoydSmith Оскільки ви просто хочете подивитися вихідний код, ви спробували type firpm.mв MATLAB? Це покаже вам реалізацію функції MATLAB.
Lorem Ipsum

1
Дизайн фільтрів FIR дуже корисний для обробки сигналів, а парки-mcclelan - нетривіальна тема. І все ж мене неодноразово проголосували за запитання про те, що IMO прямо вписується у статут dsp.stackexchange. Поясніть, будь ласка, свої голоси.
Тревор Бойд Сміт

Відповіді:


5

Ось версія LGPL алгоритму обміну Remez. Код октави, здається, походить із нього. Це було пов’язано зі сторінки вікіпедії Parks McClellan .
Оригінальний код Janovetz може бути простішим у використанні у вашому проекті, оскільки він не має викликів октави, але було б розумно прокопати журнал змін октави forge svn для отримання будь-якої інформації про виправлення або прискорення у файлі remez.cc .


Я погоджуюсь, що використовувати код Janovetz у проекті було б простіше, оскільки це прямо C. Я також безумовно погоджуюся, що перевірити журнал змін реалізації октави було б дуже розумно.
Тревор Бойд Сміт

IMO-код Janovetz - це, мабуть, перший або другий проект ... але він не використовувався так сильно, як код Octave.
Тревор Бойд Сміт

ДУЖЕ ВАЖЛИВО ПРИМІТКА: код Janovetz - це LGPL, тому ви можете використовувати його в комерційних умовах.
Тревор Бойд Сміт

Перше посилання з відповіді розривається, тому тут посилання на бібліотеку, де використовується та сама реалізація.
Махта

11

Існує реалізація Parks-McClellan з відкритим кодом (також відомий як алгоритм обміну Remez) в GNU Octave, реалізація вільного програмного забезпечення середовища, подібного MATLAB. Функція, яка називається "remez", міститься в пакеті "сигнал" , який розміщується в Octave-Forge . Якщо ви завантажите пакет, ви знайдете "remez.cc", реалізацію алгоритму на C ++.

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


"Алгоритм Паркс-МакКлеллан - це варіація алгоритму Remez або алгоритму обміну Remez, із зміною, що він спеціально розроблений для фільтрів FIR і став стандартним методом проектування фільтрів FIR." Також в SciPy: docs.scipy.org/doc/scipy/reference/generated / ...
ендоліти


2

Ось ще одне джерело алгоритму Паркса Макклеллана в C. Цей код відрізняється від згаданого вище коду SciPy тим, що в ньому було видалено 61 оригінальну заявку 69 goto (у коду SciPy все ще близько 37 goto). Він також фіксує код у 3-х місцях, де може відбутися ділення на нуль, і у нього є додатковий код, що діапазон перевіряє значення меж смуги.

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


1

можливо, ви вже це знаєте, але якщо у вас є matlab, ви можете використовувати кодер matlab та створити просту функцію, яка використовує функцію, яку ви хочете вивчити. Потім запустіть його і подивіться створений код C. Я намагався з FFT, і з розкладанням QR, і хоча він трохи безладний, його можна зрозуміти просто чудово.


1

Ось документ, який робить фактичну версію Matlab "основного" алгоритму remez. «Оптимальна програма для розширення багатодіапазонних фільтрів FIR на основі MATLAB за оригінальною ідеєю алгоритму множинного обміну Remez» -2011 Міжнародний симпозіум IEEE з мікросхем і систем (ISCAS) - Автори (Ahsan, Saramaki)

Цей документ добре справляється з поясненням основного алгоритму. Метою статті було уникнути використання оригінального коду Fortran - який не дуже добре пояснює алгоритм і часто просто перекладається безпосередньо на різні інші мови.

Я буду коментувати одне. Однією з основних ідей алгоритму є встановити криву і потім знайти крайні точки. Зазвичай для пояснення цієї ідеї використовується Інтерполяція Лагранжа, але Інтерполяція Лагранжа має слабкі числові властивості. В оригінальному алгоритмі використовується баріцентрична реалізація інтерполяції Лагранжа - це дозволяє уникнути багатьох супутніх підводних каменів інтерполяції Лагранжа. Отже, якщо ви намагаєтеся повністю зрозуміти код, можливо, ви захочете шукати барицентричну інтерполяцію.


Дивлячись на папір - це модифікована версія коду Паркс-МакКлеллан. Він все ще заснований на алгоритмі обміну Remez, але він, як правило, має кращу продуктивність і дозволяє розробляти фільтри, які набагато довші, ніж ті, які ви отримуєте з алгоритму PM (або реалізації його від Matlab).
Девід

1

Остерігайтеся відмінностей між стрільбою Матлаба та ремезом Scipy.signal. Наприклад, ці два твердження рівнозначні:

% 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.