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()
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()
Gdzie mogę uzyskać implementację Open Source optymalnego algorytmu projektowania filtrów FIR-Parks w parkach McClellana (znanego również jako ?)
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.
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.
źródło
type firpm.m
w MATLAB? To pokaże implementację funkcji MATLAB.Odpowiedzi:
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 .
źródło
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.
źródło
Wygodną wersję można znaleźć w scipy.signal.remez Pythona . Fajnie, jeśli używasz numpy / scipy.
źródło
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
źródło
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ć.
źródło
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.
źródło
Uważaj na różnice między firpm Matlaba a remezem Scipy.signal. Na przykład te dwie instrukcje są równoważne:
źródło