logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Nieprosty dobór wspólczynników do prostego filtru FIR

Aquagen 04 Kwi 2010 16:32 2763 6
REKLAMA
  • #1 7919720
    Aquagen
    Poziom 10  
    Witam

    Niniejszy post zastępuje moje wcześniejsze pytanie dotyczące projektowania filtrów FIR przy użyciu Python'owej biblioteki scipy.signal. Po prostu zreflektowałem się co tak na prawdę nie działa i nie chodzi tu o żadne niuanse programistyczne, ale wyczucie (właściwie to jego brak) w dziedzinie DSP.
    Chcę zaprojektować współczynniki do filtrów FIR (1 pasmowo przepustowy albo 2 filtry, jeden dolno- drugi górnoprzepustowy). Mam sygnał o częstotliwości nośnej 5 MHz i częstotliwości próbkowania 50 MHz. Chcę z całego sygnału wydobyć jedynie pasmo 100 - 200 Hz (tak, tu są Hz a wcześniej Mega Hz). Wydaje się, że nie uda się tego uczynić w jakiś bardzo prosty sposób.
    Natrafiłem na problem, z którym chyba sam sobie nie poradzę. Niech dany będzie sygnał w dziedzinie czasu, który ma okres/podstawę długości $$T_{0}$$. Jeżeli teraz przeniosę się do dziedziny częstotliwości i będę mierzył odstęp pomiędzy kolejnymi "prążkami" z widma częstotliwości to ten odstęp wyniesie $$f_{u} = \frac{1}{T_{0}}$$. Może mało formalnie mówiąc, sygnał, który mnie interesuje 100 - 200 Hz jest schowany przed pierwszym prążkiem. Potrzebuję w jakimś sensie "zwiększyć rozdzielczość" tego sygnału. (Jak do sygnału z dziedziny czasu dodam na końcu zera i na tak uzupełnionym wykonam DFT to "rozdzielczość" wzrośnie, tak ja to widzę).
    Byłbym bardzo wdzięczny osobie, która umiałaby mi w prosty sposób wyjaśnić ten problem i najlepiej pokazała jak w takim przypadku zaprojektować najprostszy filtr FIR dolnoprzepustowy w takim przypadku.

    Z góry dziękuję za odpowiedź.
  • REKLAMA
  • Pomocny post
    #2 7920768
    Dr.Vee
    VIP Zasłużony dla elektroda
    Zauważ, że stromość charakterystyki FIR wyrażana jest jako ułamek Fs. Z tego względu dużo łatwiej zrealizować selektywny filtr dla niskiej częstotliwości próbkowania. Można zaprojektować filtr który będzie spełniał Twoje wymagania przy Fs=50MHz, ale długość tego filtra będzie bardzo duża (rzędu 4M punktów dla dolno/górno przepustowego).

    Z tego powodu najprościej będzie wykonać co następuje:

    1. filtrowanie "zgrubne" + mocny downsampling (np. do Fs ~ 1kHz)
    2. filtrowanie precyzyjne

    Zapewnie optymalnie będzie podzielić 1. na kilka segmentów w postaci: filtr + downsampling, ale to już dopracuj samemu.

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #3 7921728
    Aquagen
    Poziom 10  
    Dziękuję Dr.Vee.

    Jak ja próbowałem projektować (ale i tak coś nie działał, wycinał wszystko ;-) ) to rzeczywiście liczba współczynników była ogromna, ponad 5 mln. Ja implementuję to na Nvidia CUDA, ale taka długość filtru nie przechodzi nawet na Fermi GTX 480 (potrzebuję real time).
    Czy możesz mi polecić jakieś strony lub książki traktujące o wymienionej przez Ciebie tematyce, najlepiej byłoby aby zawierały nie tylko suchą teorię, ale jakiś prosty przykład. Tak jak mówię, DSP douczałem się sam i nie chciałbym "zmasakrować" tego fragmentu projektu.
    Po wstępnej lekturze na temat downsamplingu np. zastanawiam się, czy takie zabiegi nie będą miały negatywnego skutku na rezultaty reszty mojego projektu (a raczej jak oszacować ten skutek).
  • Pomocny post
    #4 7922406
    Dr.Vee
    VIP Zasłużony dla elektroda
    Projektowanie FIR: http://www.dspguide.com/ch16/2.htm
    Przyspieszenie operacji splotu za pomocą FFT: http://www.dspguide.com/ch18.htm

    Ogólnie cała książka jest godna polecenia, w miarę prosto opisuje większość tematów - o ile nie zaczniesz się wgłębiać we fragmenty kodu w BASICu ;)

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #5 7922619
    Aquagen
    Poziom 10  
    OK, o projektowaniu jeszcze poczytam.
    Splot za pomocą FFT i tak już w ten sposób realizuję. Na CUDA to tylko FFT, wcześniej próbowałem z takim zwykłym splotem z podwojoną tablicą współczynników, ale strasznie wolno to działało. Znalazłem opis tej techniki overlapadd pod adresem http://www.kemt.fei.tuke.sk/Predmety/KEMT421_DF/_materialy/Lectures/df_lesson_09.pdf . Tylko musiałem ją dostosować, bo pracuję z relatywnie krótkimi liniami sygnału począwszy od 512 próbek (ponad 1024 nie wyjdę na pewno), ale za to liczba współczynników jest dość duża (taps przekracza znacząco długość sygnału, co trochę niepokojące/bez sensu jest). Standardowa implementacja Nvidii CUFFT działa w czasie O(NlogN) a jeszcze jak zaimplementuję sam FFT za pomocą pomysłu panów Rief i Tate z 1997 w czasie $$O(\sqrt{N})$$ za pomocą gridu procesorów to w ogóle przerodzi się w demona prędkości.
    Jeszcze poszukam o filtracji "zgrubnej", ponieważ z takim terminem się jeszcze nie spotkałem.
    Czy chodzi tu po prostu o odcięcie sygnału np. w $$\frac{1}{20}$$ częstotliwości, lowpass do 2.5 MHz; potem downsampling i na koniec filtrowanie już pasma 100-200 Hz? Czy to tak proste jest, czy pod tą nazwą kryje się coś jeszcze? Jeżeli tak to super.
  • REKLAMA
  • Pomocny post
    #6 7924331
    Dr.Vee
    VIP Zasłużony dla elektroda
    Pisząc o filtracji "zgrubnej" miałem na myśli filtrowanie z szerokim regionem przejścia od pasma przenoszenia do pasma blokowania sygnału. Np. przy Fs=50MHz stosujemy FIR długości N~40 (albo nawet IIR!) odcinający wszystko od 6MHz wzwyż, a przepuszczający wszystko od 0 do 1MHz. Po filtrowaniu odrzucamy 75% próbek i mamy signal BW=6MHz , Fs=12,5MHz.
    Aplikujemy procedurę jeszcze kilka razy itd...

    Być może w Twoim systemie takie podejście nie jest optymalne, ale warto je rozważyć.

    Pozdrawiam,
    Dr.Vee
  • #7 7926376
    Aquagen
    Poziom 10  
    Dzięki, wydaje mi się, że to już koniec tego wątku. Udało mi się jakoś poradzić z tym zagadnieniem.
    Poprzez wystosowanie pytania przewodniego tegoż wątku wykazałem się zupełnym brakiem znajomości DSP, ale cóż uczyłem się sam tego i do tego bardzo wyrywkowo :| Oczywiście to co napisał Dr.Vee jest w 100% słuszne, ale w moim projekcie nie ma zupełnie zastosowania. Zadałem pytanie wyrwane zupełnie z kontekstu. Przy takiej rozdzielczości częstotliwościowej widma nic z tego nie będzie.
    Dlaczego zadałem taką zagwozdkę: Chodziło mi o wycięcie składowej stałej, czyli prążka zerowego.

    Przecież ja mam zaimplementowany Matched Filtering, czyli podana przez mnie filtracja jest już załatwiona. Ja mam wzór sygnału nadawczego, więc North Filtering implementuję bez przeszkód, ale nawet jeśli nie miałbym tego wzoru to mogę naciągnąć i zrobić filtrację dopasowaną tak: Przyjmuję dość odważnie, że odwrotność czasu trwania impulsu nadawczego jest pasmem systemu (Znam częstotliwość podstawową i czas trwania impulsu nadawczego ok. 1-2 okresy częstotliwości podstawowej). Wystarczy teraz odwrócić czas trwania i mamy prostokątne pasmo wokół częstotliwości podstawowej za pomocą której filtrujemy.
    Voilà
REKLAMA