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.

Trevor Boyd Smith
źródło
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 .

Mark Borgerding
źródło
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.

Jason R.
źródło
„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

user5108_Dan
źródło
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ć.

kość
źródło
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.

David
źródło
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')
Zhanwen Chen
źródło