Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

FFT i zwiększanie rozdzielczości

lukasb9 26 Sie 2008 12:30 6131 15
  • #1 26 Sie 2008 12:30
    lukasb9
    Poziom 28  

    Witam zainteresowałem sie ostatnio tematem FFT, znalazłem bardzo sympatyczną stronę:
    http://www.ise.pw.edu.pl/dydaktyka/psap/fft2.html
    gdzie jest nawet algorytm w C, który bez większego problemu udało mi się uruchomić na procesorze ATmega32 i liczy on sobie 32 punktową transformatę pewnego sygnału o częstotliwości podstawowej 50Hz.
    Problem polega na tym, że chciałbym również mierzyć interharmoniczne, czyli częstotliwości o wartościach powiedzmy 75Hz, 125Hz itd...
    Tutaj moje pewnie banalne dla większości pytanie - jak zwiększyć rozdzielczość FFT zostawiając tą samą częstotliwość bazową(50Hz)?
    Interesuje mnie zwiększenie rozdzielczości 2x czyli w wyniku transformaty dostawałbym nie 32 a 64 punkty widma.

  • Pomocny post
    #2 26 Sie 2008 23:54
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #3 27 Sie 2008 00:16
    lukasb9
    Poziom 28  

    chwała Ci za zainteresowanie! ;)

    transformatę z 64 próbek i jako podstawową częstotliwość traktować tą o numerze prążka 2 ?
    takie rozwiązanie również wymyśliłem, ale gdzieś coś mi się obiło o uszy że da się poszerzyć rozdzielczość próbkując dwa okresy sygnału, i poddając je transformacie 64 punktowej. Tak jak napisałem tylko mnie się wydaje...Starałem się jakoś sam rozgryźć jak by to mogło funkcjonować ale za słaby na to jestem ;)
    Więc jeśli masz jakieś sugestie Freddie to pisz będę bardzo wdzięczny.

  • #4 27 Sie 2008 09:08
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ogolnie zaleznosc nr prazka - czestotliwosc rzeczywista zalezy JEDYNIE od czestotliwosci probkowania sygnalu. odstep miedzy prazkami - delta_f - wynosi dokladnie fs/N, gdzie fs to czestotliwosc probkowania, a N to dlugosc transformaty.

    dlatego jesli np probkujesz sygnal tak, ze w tych 32 probkach zmiescisz jeden pelny okres, to mozesz zwiekszyc rozdzielczosc na dwa sposoby:
    1. 2x zwiekszyc fs - czyli ze teraz na 64 probki bedzie znow jeden okres - wtedy czestotliwosci stosownych prazkow sie nie zmienia, a zyskasz po prostu dodatkowe proazki na koncu - wynikajace z zwiekszenia fs. delta_f w koncu sie nie zmienilo, wiec i 'rozdzielczosc' w zasadzie tez nie.
    2. sprobkowac 2x dluzszy okres sygnalu - czyli np 2 okresy - dzieki czemu 2x zmniejszy sie delta_f - pomiedzy twoimi dotychczasowymi prazkami pojawia sie kolejne.

    to o czym mowisz, to wlasnie metoda 2, tyle ze nie mozna po prostu wziasc 32 probek, ustawic ich kolo siebie 2x jako 64 probki i zrobic transformate - w miejscu sklejenia moze byc skok (nieciaglosc), ktory totalnie rozwali owa transformate - musisz po prostu probkowac 2x dluzej, potrzeba ci 2x wiecej pamieci, bedzie to trwalo dluzej (ale niekoniecznie 2x <: ) .

    mozesz sprobowac tez dopelniania zerami, ale to niekoniecznie cos zmieni. pogoogluj za terminem 'zero padding' to dowiesz sie wiecej o wadach i zaletach, bo to zalezy od aplikacji.

    4\/3!!

  • #5 03 Wrz 2008 15:51
    lukasb9
    Poziom 28  

    Dzięki Freddie, ostatecznie próbkuje dwa okresy i robię transformatę 2x większą, w efekcie czego dostaje widmo o rozdzielczości 25Hz. Tematu na razie nie zamykam bo może będę miał jeszcze jakieś pytania.

    pozdrawiam

    --------------

    No i znów potrzebuje pomocy. A więc mam transformatę 64 punktową i prążki rozmieszczone co 25Hz.
    Pytanie teraz czy da się jeśli tak to jak? z rozdzielczością powiedzmy 5Hz zrobić FFT przedziału na przykład 100Hz - 150Hz. Nie mogę liczyć dłuższej transformaty z uwagi na mało pamięci ram w mikrokontrolerze, chciałbym to zrobić "na piechotę" tzn. interesuje mnie konkretny prążek - patrzę (obliczam) co się wokół niego dzieje.

  • #6 04 Wrz 2008 11:57
    Krashan7
    Poziom 17  

    lukasb9 napisał:
    Pytanie teraz czy da się jeśli tak to jak? z rozdzielczością powiedzmy 5Hz zrobić FFT przedziału na przykład 100Hz - 150Hz. Nie mogę liczyć dłuższej transformaty z uwagi na mało pamięci ram w mikrokontrolerze

    Da się, każdy pojedynczy prążek transformaty Fouriera to korelacja sygnału wejściowego z cosinusem i sinusem o danej częstotliwości spróbkowanym tą samą częstotliwością co sygnał. Nie wiem tylko czy to pomoże, bo potrzebujesz tablicy sinusa i cosinusa (albo liczysz go w locie). Jak masz dużo miejsca w ROM to możesz tam upchać taką tablicę. Przykładowo jeżeli masz transformatę 64-próbkową, częstotliwość próbkowania sygnału 1000 Hz, a interesujesz się prążkiem np. 105 Hz to tablica leci tak (jeżeli liczysz na int-ach to trzeba dodać skalowanie):

    Code:
    float tablica_s[64], tablica_c[64];
    
    int i;

    for (i = 0; i < 64; i++)
    {
      tablica_s[i] = sin(2 * M_PI * (105 / 1000) * i / 64);
      tablica_c[i] = cos(2 * M_PI * (105 / 1000) * i / 64);
    }


    Chcąc teraz obliczyć wartość prążka 105 Hz liczysz korelację czyli iloczyn skalarny wektora sygnału przez tablicę sinusa dla składowej urojonej i cosinusa dla składowej rzeczywistej.
    Code:
    float re = 0, im = 0;
    

    for (i = 0; i < 64; i++)
    {
      re += sygnal[i] * tablica_c[i];
      im += sygnal[i] * tablica_s[i];
    }


    Jest to "siłowe" liczenie transformaty i pamiętaj że przy kilkunastu prążkach może być jednak szybciej zrobić pełne FFT. Przy jednym ten sposób z reguły jest szybszy.

  • #7 04 Wrz 2008 12:21
    lukasb9
    Poziom 28  

    Witam robię po prostu DFT dla interesujących mnie prążków mam rację? Co do tablicy cosinusa, mogę zamiast tablicy cosinusa używać przesuniętej o pi/2 tablicy sinusa.

  • #8 09 Paź 2008 12:57
    guffi
    Poziom 2  

    a nie powinno być tak, że:
    delta_f = fs/ 2N?

    ta 2 jest stąd, że sygnał musi być próbkowany z częstotliwością przynajmniej 2* większą od częstotliwości granicznej sygnału próbkowanego.
    Tzn jeśli mamy sygnał do 20kHz, to trzeba go próbkować z fs=40kHz, czyli dla N=1024 delta_f = 19.5Hz, a nie 39Hz.

    Czy mam rację?

  • #9 09 Paź 2008 13:34
    Freddie Chopin
    Specjalista - Mikrokontrolery

    nie masz.

    rozdzielczosc czestotliwosciowa rowna jest fs/N. pamietaj ze transformata daje tez ujemne czestotliwosci i wlasnie tam jest 'zagubiona' ilosc probek.

    4\/3!!

  • #10 09 Paź 2008 13:40
    guffi
    Poziom 2  

    ok,
    to jak obliczę transformatę FFT (N=1024), dla sygnału 20kHz (spróbkowanego fs=40kHz), to f_delta = 39Hz
    A który prążek będzie odpowiadać za DC, a który za najwyższą częstotliwość, czyli (1024 * 39/2 = 19500)?

  • #11 09 Paź 2008 14:56
    Freddie Chopin
    Specjalista - Mikrokontrolery

    to wszystko zalezy od algorytmu. fft udostepniane przez microchipa dla dspicow dla przykladu DC-bin ma na probce 0, potem nastapiloby 511 probek dla dodatnich czestotliwosci, a potem 511 dla ujemnych, w odwrotnej kolejnosci.

    4\/3!!

  • #12 10 Paź 2008 12:46
    guffi
    Poziom 2  

    a jak biore "zwykle" fft z matlaba/ scilaba, to na zerowej mam DC, a pozniej?

    Dodano po 11 [minuty]:

    i właśnie jest tak jak napisałeś prawda? najpierw DC później 511 probek dodatnich czestotliwosci, pozniej jedna probka (wlasnie co to za probka), a pozniej 511 ujemnych.
    Czyli generalnie mnie interesuje pierwsze 512 probek jesli chodzi mi od dodatnie

  • #13 10 Paź 2008 14:28
    Freddie Chopin
    Specjalista - Mikrokontrolery

    jak przeczytasz helpa to sie dowiesz, tam naprawde wszystko jest opisane... zreszta to mozna sprawdzic nawet doswiadczalnie - zrob sinusa i z niego fft - taka transformata ma parzysta czesc rzeczywista i nieparzysta czesc zespolona.

    pozatym w matlabie jest jeszcze polecenie fftshift(), ktore ci ta transformate przestawia tak, abys na srodku mial DC, po lewej ujemne, a po prawej dodatnie (czyli taki zwyczajny wykres wtedy dostajesz).

    4\/3!!

  • #14 12 Paź 2008 17:29
    qrdel
    Poziom 28  

    Co do tablicy sin, cos to można to zredukować do użycia jednego sinusa zespolonego (jeden dla jednego prążka) w algorytmie Goertzla.
    Wielokrotnie opisywany (by me, również), szczególnie ciekawa dla mikroprocków jest możliwość liczenia w miarę pobierania kolejnych próbek.

  • #15 27 Wrz 2017 10:23
    PiotrLenarczyk
    Poziom 5  

    Zastosuj tablicę z gotowymi wartościami sinusa (ang. Look Up Table LUT), co znacznie obniży Ci ilość kosztownych obliczeń, a odczyty pamięci na AT328 są relatywnie wydajne. Dodatkowo gdzieś widziałem dodatkowy moduł wcale niewolnej pamięci SRAM do MCU's Atmela. Nie napisałeś do czego Ci potrzebne FFT - zauważ, że możesz zaimplementować mniej wymagającą obliczeniowo transformatę kosinusową, chyba że używasz gotowej bilioteki FFTW.
    Post Scriptum: prawda to, że na wbudowanym zegarze ATTiny schodzi poniżej 1uA?

  • #16 01 Paź 2017 16:38
    _jta_
    Specjalista elektronik

    Mam wrażenie, że ta strona już nie istnieje. Kiedyś pisałem FFT dla 2^N punktów - to się robiło jakoś tak, że brało się dane z dwóch punktów, jedną mnożyło przez sinus i cosinus pewnego kąta, a potem zapisywało się ich sumę i różnicę - i tak dla wszystkich punktów, a potem to samo dla innego kąta, i w sumie N kątów. Chyba najpierw był kąt π i brało się dane oddalone o połowę ich ilości, potem π/2 i dane 2 razy bliższe (i to było bez liczenia sinusów i cosinusów, bo były tylko -1, 0, 1 i wzory się upraszczały), ale dalej już były od π/4 i dane odległe o 1/4 ilości, i tak dalej - w ostatnim kroku brało się sąsiednie punkty. Na koniec trzeba było poprzestawiać punkty w tablicy. Nie używałem żadnych tablic sinusów i cosinusów, wyliczałem je z wzorów na cosinus i sinus połowy kąta (chyba cos(α/2)=√((1+cos(α))/2), sin(α/2)=sin(α)/cos(α/2)/2). Przy tej metodzie podwojenie ilości punktów odpowiadało podwojeniu początkowej odległości, oraz zwiększeniu ilości przebiegów o 1 (z najmniejszym kątem). Może to FFT też było tak zrobione? To mnożenie przez sinusy i cosinusy to było mnożenie liczb zespolonych przez cos(α)+I*sin(α).

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME