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

[AT91SAM7] Czy DFT to optymalne rozwiązanie do analizy harmonicznej audio?

marenc 15 Cze 2010 10:28 2403 7
REKLAMA
  • #1 8192128
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Witam, zamierzam w projekcie wyświetlić popularne "paski" dla sygnału audio, więc chodzi mi o uproszczoną analizę harmoniczną. Do ich obliczenia planuję posłużyć się algorytmem DFT. Czy jest to optymalne a zarazem proste rozwiązanie?

    W oparciu o http://pl.wikipedia.org/wiki/Dyskretna_transformata_Fouriera mam pytania czy prawidłowo rozumiem zasadę wykonywania tej transformaty.

    1. ω jest pewną stałą, więc mogę umieścić taką tablicę w pamięci.
    2. Aby nie obliczać funkcji sin i cos - mogę umieścić w tablicę w pamięci dla sin od 0 do 90 stopni, co pozwoli na odtworzenie tych funkcji.
    3. Na podstawie równania dla DFT będę mógł obliczyć wartość Re oraz Im dla danej próbki, co z kolei pozwoli na obliczenie kąta i amplitudy?(mi chodzi tylko o amplitudę)

    Czy prawidłowo to zrozumiałem? Biblioteki czy projekty znalezione w sieci są bardzo złożone i nie pozwala mi to na zrozumienie ich zasady działania...
  • REKLAMA
  • #2 8192238
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    FFT jest wydajniejsze niż DFT i nikt nigdy nie zaleci Ci pisania tego samodzielnie, ponieważ optymalne zaimplementowanie tej funkcji jest niesamowicie skomplikowane.

    4\/3!!
  • REKLAMA
  • #3 8192835
    koodpl
    Poziom 12  
    Posty: 38
    Pomógł: 3
    Hmm... FFT to pomysł na szybką implementacje DFT, ale liczy to samo...
    Można się zastanawiać czy lepiej czasem coś zrozumieć i napisać samemu czy używać gotowców... zawsze myślałem, że w amatorskich projektach większą satysfakcje daje nie używanie gotowców, a zrozumienie idei działania.
    Generalnie to prawda, że nie jest prosto napisać zoptymalizowaną wersję FFT, ale do "pasków" w zupełności wystarczy prosta wersja napisana w 20linijkach...
    BTW. Jeżeli bardziej od profesjonalnego podejścia zależy Ci na "ładnych" paskach to może zainteresuj się pasmowymi filtrami IIR.
  • #4 8193031
    Banan-PL
    Poziom 12  
    Posty: 61
    Pomógł: 2
    Ocena: 12
    W książce Mikrokontrolery LPC2000 w przykładach Emila Stawskiego masz przykład implementacji FFT wraz z całkiem klarownym opisem teoretycznym.
  • REKLAMA
  • #5 8193038
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Super... Zaraz przejrzę wiadomości o cyfrowych filtrach oraz poszukam, czy w pobliżu ktoś nie ma tej książki. W razie dalszych problemów będę pisał ;)
  • #6 8193389
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    W załączniku moja implementacja FFT w asemblezre (Bazowałem na e-book'u "ARM System Developers Guide"). Działa pod gcc. Mam nadzieje że pomoże :)
    Załączniki:
    • arm_fft.zip (2.09 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #7 8195456
    jarekz_2
    Poziom 16  
    Posty: 138
    Pomógł: 18
    Freddie Chopin napisał:
    FFT jest wydajniejsze niż DFT i nikt nigdy nie zaleci Ci pisania tego samodzielnie, ponieważ optymalne zaimplementowanie tej funkcji jest niesamowicie skomplikowane.

    Jezeli ma to byc tylko kilka czy kilkanascie "slupkow", to jednak lepiej bedzie uzyc DFT w postaci "kanonicznej", a nie FFT, bo czestotliwosci "slupkow" tworza szereg geometryczny (np. 63Hz, 125Hz, 250Hz, ...) a nie arytmetyczny. Kilkanascie wyliczen DFT zajmie mniej czasu niz 512- lub 1024-punktowa FFT.
  • #8 8195655
    marenc
    Poziom 24  
    Posty: 881
    Pomógł: 37
    Ocena: 5
    Napisałem w Matlabie prosty skrypt, aby przekonać się jak działa DFT. Wydaje mi się, że ARM powinien sobie z nią poradzić... po testach napisze jak szybko ona działa i może wrzucę jakiś opis dla innych...

    //Edit:
    Algorytm działa bardzo sprawnie, jednak jest stosunkowo trudny w realizacji mikroprocesorowej. Napisany program dla AVR w C działał w czasie rzeczywistym(obserwacja wizualna), jednak nie miałem czasu przetestować kodu, więc go nie zamieszczam w tym poście. Poniżej znajduje się skrypt dla Matlab'a aby każdy mógł zrozumieć ideę działania algorytmu DFT.

    %Obliczanie DFT - test do przygotowania algorytmu dla ARM
    
    %Przykładowe dane pomiarowe
    input=zeros(128,1);
    for i=1:128
       input(i)=sin(deg2rad((i*360)/32));
    end
    
    complex=zeros(16,1);
    for k=1:16
       for n=0:127
          complex(k)= complex(k)+input(n+1)*(exp(j*((2*pi)/(128)))^(-(k*n)));
       end
    end
    
    re=zeros(16,1);
    im=zeros(16,1);
    for k=1:16
       for n=0:127
          re(k)=re(k)+input(n+1)*cos(((2*pi)/(128))*(-(k*n)));
          im(k)=im(k)+input(n+1)*sin(((2*pi)/(128))*(-(k*n)));
    
          %complex(k)= complex(k)+input(n+1)*(exp(j*((2*pi)/(128)))^(-(k*n)));
       end
    end
    
    output=zeros(16,1);
    for k=1:16
       output(k)=sqrt((real(complex(k))^2)+(imag(complex(k))^2));
    end
    
    output2=zeros(16,1);
    for k=1:16
       output2(k)=sqrt((re(k)^2)+(im(k)^2));
    end
    
    plot(output);
    plot(output2);

Podsumowanie tematu

✨ W dyskusji poruszono temat zastosowania dyskretnej transformaty Fouriera (DFT) do analizy harmonicznej sygnału audio w kontekście wyświetlania "pasków" audio. Użytkownik zastanawia się, czy DFT jest optymalnym rozwiązaniem, a także pyta o szczegóły dotyczące implementacji. Odpowiedzi wskazują, że algorytm FFT (Fast Fourier Transform) jest bardziej wydajny niż DFT, jednak dla prostych zastosowań, takich jak kilka "słupków", DFT w postaci kanonicznej może być wystarczająca. Uczestnicy dyskusji sugerują również, że zrozumienie algorytmu i samodzielne jego zaimplementowanie może przynieść większą satysfakcję. Wskazano na dostępność książek i przykładów implementacji FFT, co może pomóc w nauce. Użytkownik podzielił się również doświadczeniami z testowaniem DFT w Matlabie oraz z realizacją algorytmu na mikroprocesorach.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA