Gdzie mogę uzyskać implementację open source optymalnego algorytmu projektowania filtrów FIR-Parks w parkach McClellana?


20

Tło: Często wykonuję jakieś zadanie przetwarzania sygnału, które wymaga unikalnego filtra. Zwykle w tym momencie idę do MATLAB i nowy unikalny filtr za pomocą . Funkcja MATLAB implementuje algorytm Parks-McClellan. Teraz mam filtr i umieszczam go w zakodowanej tablicy. Ale oto problem: mam teraz zakodowany filtr, który działa tylko w jednym scenariuszu.firpm()firpm()

Problem: Mogę teraz rozwiązać problem przetwarzania sygnału du-Jour ... ale tylko w przypadku bardzo SZCZEGÓLNEJ częstotliwości próbkowania pojedynczego lub scenariusza SPECIFIC.

Cel: Chcę móc wywoływać z kodu C lub innego języka i sprawić, że mój kod przetwarzania sygnału będzie bardziej ogólny. Nie mogę znaleźć implementacji open source !firpm()firpm()

Gdzie mogę uzyskać implementację Open Source optymalnego algorytmu projektowania filtrów FIR-Parks w parkach McClellana (znanego również jako ?)firpm()

  • PS Zdaję sobie sprawę, że mogę projektować filtry w inny sposób, korzystając z okienkowania lub czegoś innego ... możesz wspomnieć o tych w komentarzach. Ale celem tego pytania nie jest pytanie „jakie są inne techniki projektowania filtrów?” chodzi o to, aby znaleźć implementację typu open source BARDZO BARDZO użytecznego ... lub czegoś podobnego.firpm()

  • PPS Jednym z celów tego pytania jest poznanie działania algorytmu Parksa-McClellana, najpierw patrząc na kod, a następnie planuję przeczytać teorię tła.


Czy ważne jest, aby rozwiązanie było bezpłatne? Czy sprawdziłeś interfejs API Matlab C.

2
Najwyższy priorytet to chcę zobaczyć kod źródłowy (najlepiej nie fortran, więc nie muszę dźgać oczu). Nie narzucę ograniczenia, że ​​musi być wolne (może istnieje jakiś otwarty kod źródłowy, ale niewolny kod źródłowy).
— Trevor Boyd Smith

3
Wiem, że możesz skompilować Matlab za pomocą kompilatora Matlab, a następnie rozpowszechniać go za pomocą środowiska wykonawczego Matlab ... więc technicznie klient nie musi płacić za licencję Matlab. Znam też silnik Matlab (znany również jako C do Matlab API). Oba są nieistotne, ponieważ zwykle działam na platformie osadzonej, na której żadna z nich nie jest dostępna.
— Trevor Boyd Smith

1
@TrevorBoydSmith Ponieważ po prostu chcesz spojrzeć na kod źródłowy, próbowałeś type firpm.mw MATLAB? To pokaże implementację funkcji MATLAB.
— Lorem Ipsum

1
Konstrukcja filtra FIR jest bardzo przydatna do przetwarzania sygnałów, a park-mcclelan jest nietrywialnym przedmiotem. A jednak wielokrotnie mnie głosuje za pytaniem o temat, który IMO pasuje dokładnie do karty dsp.stackexchange. Proszę wyjaśnić swoje opinie negatywne.
— Trevor Boyd Smith

Odpowiedzi:


5

Oto wersja LGPL algorytmu wymiany Remeza. Kod oktawy wydaje się pochodzić z niego. Został link ze strony wikipedii Park McClellan .
Oryginalny kod Janovetz może być łatwiejszy w użyciu w twoim projekcie, ponieważ nie ma wywołań oktaw, ale rozsądnie byłoby przekopać się przez dziennik zmian svn oktawy-forge w celu uzyskania jakichkolwiek informacji o poprawkach błędów lub przyspieszeniach w pliku remez.cc .


Zgadzam się, że użycie kodu Janovetz w projekcie byłoby łatwiejsze, ponieważ jest proste C. Zdecydowanie zgadzam się również, że sprawdzanie dziennika zmian implementacji oktawy byłoby bardzo sprytne.
— Trevor Boyd Smith

Kod Janovetz IMO jest prawdopodobnie pierwszą lub drugą wersją roboczą ... ale nie był używany tak mocno jak kod Octave.
— Trevor Boyd Smith

BARDZO WAŻNA UWAGA: Kod Janovetz to LGPL, dzięki czemu można go używać w warunkach komercyjnych.
— Trevor Boyd Smith

Pierwszy link z odpowiedzi jest zepsuty, więc tutaj jest link do biblioteki, w której używana jest ta sama implementacja.
— Machta

11

W GNU Octave znajduje się implementacja typu Parks-McClellan (znana również jako algorytm wymiany Remeza), darmowa implementacja środowiska podobnego do MATLAB. Funkcja, zwana „remez”, jest zawarta w pakiecie „signal” , który jest hostowany w Octave-Forge . Jeśli pobierzesz pakiet, znajdziesz „remez.cc”, implementację algorytmu w C ++.

Jedną fajną rzeczą w Octave jest to, że jest ona prawie kompatybilna z MATLAB-em, więc możesz łatwo przenieść kod, aby użyć go tam, jeśli chcesz. To dobry sposób, aby zajrzeć pod maską przy implementacjach algorytmów, które są dostarczane w formacie MEX w MATLAB.


„Algorytm Parks-McClellan jest odmianą algorytmu Remeza lub algorytmu wymiany Remeza, z tą zmianą, że został specjalnie zaprojektowany dla filtrów FIR i stał się standardową metodą projektowania filtrów FIR”. Również w scipy: docs.scipy.org/doc/scipy/reference/generated/...
— endolit


2

Oto inne źródło algorytmu Parks McClellan w C. Ten kod różni się od wspomnianego powyżej kodu SciPy tym, że usunął 61 oryginalnych 69 instrukcji goto (kod SciPy wciąż ma około 37 gotów). Naprawia również kod w 3 miejscach, w których może wystąpić dzielenie przez zero, i ma dodatkowy kod, który zakres sprawdza wartości krawędzi pasma.

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


1

może już to wiesz, ale jeśli masz matlab, możesz użyć kodera matlab i stworzyć prostą funkcję, która będzie korzystała z funkcji, którą chcesz zbadać. Następnie uruchom go i zobacz utworzony kod C. Próbowałem z FFT i rozkładem QR, i chociaż jest nieco niechlujny, można to dobrze zrozumieć.


1

Oto artykuł, który robi rzeczywistą wersję Matlaba algorytmu „core” remeza. „Oparty na MATLAB optymalny program do projektowania filtrów wielopasmowych FIR zgodnie z pierwotnym pomysłem algorytmu wielokrotnej wymiany Remeza” -2011 Międzynarodowe sympozjum IEEE na temat układów i układów (ISCAS) - Autorzy (Ahsan, Saramaki)

Ten artykuł dobrze objaśnia podstawowy algorytm. Celem artykułu było uniknięcie użycia oryginalnego kodu Fortran - co nie wyjaśnia dobrze algorytmu i często jest bezpośrednio tłumaczone na inne języki.

Jedną rzecz skomentuję. Jedną z podstawowych idei algorytmu jest dopasowanie krzywej, a następnie znalezienie skrajnych punktów. Zwykle do wyjaśnienia tego pojęcia używana jest interpolacja Lagrange'a, ale interpolacja Lagrange'a ma słabe właściwości liczbowe. W oryginalnym algorytmie wykorzystano Barycentryczną implementację interpolacji Lagrange'a - która pozwala uniknąć wielu powiązanych pułapek interpolacji Lagrange'a. Więc jeśli próbujesz w pełni zrozumieć kod, możesz poszukać Interpolacji Barycentrycznej.


Patrząc na artykuł - jest to zmodyfikowana wersja kodu Parks-McClellan. Nadal jest oparty na algorytmie wymiany Remeza, ale zazwyczaj ma lepszą wydajność i pozwala projektować filtry, które są znacznie dłuższe niż filtry otrzymywane z algorytmu PM (lub implementacji Matlaba).
— David

1

Uważaj na różnice między firpm Matlaba a remezem Scipy.signal. Na przykład te dwie instrukcje są równoważne:

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

remez(11, [0.1, 0.4], [1], type='hilbert')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.