logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.
REKLAMA
  • #1 961773
    xexecute
    Poziom 11  
    Mam podejrzewam, że trywialne pytanie. Mam do napisania program, który przepuszcza prze FFT pliki WAV. Nie wiem jak pobrac dane z pliku i w jaki sposób przedstawic je dla FFT, nie mam też biblioteki FFT. Jeśli macie jakieś sugestie, bądź gotowe roziązania proszę o pomoc.
  • REKLAMA
  • #3 963725
    xexecute
    Poziom 11  
    Pobrałem juz nagłówek itd. ale mieszma sie z liczbami zespolonymi które mam przedstawiec dla FFT i co uzyskuje na wyjsciu FFT ? musze przedstawic przebieg w dziedzinie dczasu i przebieg w dziedzinie czestotliwosci i nie mam pojecia jak to zaczac ...
  • #4 964033
    h-doc
    Poziom 27  
    No więc robisz to tak:
    1. Danymi wejściowymi dla procedury FFT jest bufor próbek o długości równej ilości punktów FFT (czyli jeśli FFT jest np. 512-punktowa, to bufor wejściowy musi mieć 512 próbek dźwięku).
    2. Danymi wejściowymi są liczby rzeczywiste, więc zerujesz bufor części urojonej (jeśli takowy w ogóle jest).
    3. Wyjście procedury FFT to 2 bufory - jeden z częścią rzeczywistą, drugi urojoną transformaty. Oba bufory mają długość równą liczbie punktów FFT. Niektóre procedury mogą zwracać tylko połowę punktów FFT, ponieważ dla sygnałów rzeczywistych jedna połowa widma stanowi lustrzane odbicie drugiej połowy. Musisz zwrócić na to uwagę.
    4. Na czym polega problem z przedstawieniem przebiegów? Obie osie (czyli numer próbki i wartość próbki) wystarczy odpowiednio przeskalować i wyświetlić. Chyba, że widmo chcesz przedstawić w postaci moduł-faza, wtedy jeszcze musisz to przeliczyć.
  • #5 964477
    xexecute
    Poziom 11  
    Problem wyglada tak, że mam do napisania program który rozpoznaje dzwieki 4 zadanych instrumentow. Mam 2 zbiory uczacy i testowy ... mam rozpoznawac je na podstawie przebiegu w dziedzinie czasu i w dziedzinie czestotliwosci, tak to wyglada ...
  • #6 964503
    elektryk
    Poziom 42  
    xexecute napisał:
    Problem wyglada tak, że mam do napisania program który rozpoznaje dzwieki 4 zadanych instrumentow. Mam 2 zbiory uczacy i testowy ... mam rozpoznawac je na podstawie przebiegu w dziedzinie czasu i w dziedzinie czestotliwosci, tak to wyglada ...
    Ładujesz potem wynik FFT na odpowiednio wyuczoną sieć neuronową i gotowe. A co do budowy i typu sieci neuronowej to musiałbyś zrobić badania co do stopy błedu w odpowiedziach i czasu uczenia.
  • REKLAMA
  • #7 965470
    h-doc
    Poziom 27  
    hmmm, trudna sprawa. Może dałoby się to zrobić przy pomocy podobnych metod jak kodowanie LPC (Linear Predictive Coding)?. Poszukaj też o technikach rozpoznawania mowy (cepstrum zespolone i tym podobne sprawy). Myślę, że sprawę ułatwiłaby wstępna obróbka danych. Czyli np. z przebiegu czasowego interesujące byłoby wyznaczenie obwiedni, a z przebiegu częstotliwościowego zawartość harmonicznych. Do rozróżnienia 4 instrumentów nie musisz robić dokładnej analizy, wystarczy zgrubna.
  • #8 969158
    xexecute
    Poziom 11  
    Powiedzcie mi na poczatek, czemu odpowiadaja kolenje probli pliku WAVE ? aplitudzie ? wartoscie czestotliwosci ? ... i czemu odpowiadaja kolejne wartosci tych probrk po wyjsciu z transformaty fouriera ?
  • #9 973668
    h-doc
    Poziom 27  
    Kolejne próbki pliku wave są proporcjonalne do amplitudy sygnału. Kolejne próbki transformaty FFT odpowiadają kolejnym prążkom widma (częstotliwościom).
  • #10 976922
    Paweł Es.
    VIP Zasłużony dla elektroda
    Przypuszczam, że przed uczeniem sieci neuronowej trzeba te kolejne widma cząstkowe jakoś normalizować, bo sieć może mieć problemy z rozpoznaniem obwiedni widma przy różnych głośnościach dźwięku (analizować trzeba przyrosty składowych widma pomiędzy kolejnymi ramkami - taka składowa zmienna ewolucji widma częstotliwościowego).

    Czy to będą instrumenty z ustaloną amplitudą (organy, skrzypce) czy zmienną (fortepian, klawesyn).

    Przed poddaniem ciągu próbek przekształceniu Fouriera trzeba pomnożyć je przez funkcję okna (np. Hanna), bo zwykle okres dźwięku nie jest idealnie równy np 128 próbkom.
    FFT liczy się dla ciągów o długości będącej potęgą liczy 2 tj. 128,256,512,....
    Można zwiększać rozdzielczość FFT przez uzupełnianie przebiegu próbkami o wartości zerowej (np. 128 próbek przebiegu + 128 zer) liczymy 256 punktową FFT i taką mamy rozdzielczość a jednocześnie mamy zanalizowane okno o połowę krótsze (lepsza rozdzielczość czasowa). Okna mogą też zachodzić na siebie (co jest ważne przy przebiegach o szybkich zmianach widma).
    Co do FFT to np. 128 próbek sygnału wejściowego daje 128 próbek widmowych:

    X[0] - składowa stała
    X[1] do X[63] - składowe widma o kolejnych częstotliwościach n*fp/128
    X[64] do X[127] - składowe widma ale w odwróconej kolejności

    fp - częstotliwość próbkowania.

    Polecam książkę pt. "Dźwięk cyfrowy" Andrzeja Czyżewskiego
    i "Dźwięk i jego percepcja - aspekty fizyczne i psychoakustyczne" Edwarda Ozimka
  • #11 977588
    koodłaty
    Poziom 14  
    xexecute napisał:
    Problem wyglada tak, że mam do napisania program który rozpoznaje dzwieki 4 zadanych instrumentow. Mam 2 zbiory uczacy i testowy ... mam rozpoznawac je na podstawie przebiegu w dziedzinie czasu i w dziedzinie czestotliwosci, tak to wyglada ...


    h-doc napisał:
    hmmm, trudna sprawa. Może dałoby się to zrobić przy pomocy podobnych metod jak kodowanie LPC (Linear Predictive Coding)?


    Nie bardzo - LPC jest modelem analizy/syntezy przystosowanym dla ludzkiej mowy. W najprostszej wersji nie radzi sobie z kodowaniem dźwięku. Dopiero kodek MPEG-4 (który bazuje na LPC) dysponuje modułem HVXC oraz HILN. Ten drugi odpowiada wlaśnie za rozpoznawanie dźwięków, ale sprawa, że tak powiem, jest o wiele trudniejsza do napisania (nie mówiąc już o trudnościach prawnych związanych z MPEG-4).
  • #12 978226
    h-doc
    Poziom 27  
    koodłaty - no więc właśnie z tego powodu LPC nadawałoby się znakomicie (ponieważ analizuje sygnał). A tutaj właśnie chodzi nam o analizę sygnału. Pewnie, że nie można zastosować LPC wprost, ale bazując na tej metodzie można by stworzyć coś podobnego (zwłaszcza, że sporo instrumentów można modelować podobnie jak głos).
  • REKLAMA
  • #13 983890
    Paweł Es.
    VIP Zasłużony dla elektroda
    LPC to oblicza współczynniki odbicia dla filtru symulującego tubę akustyczną o zmiennych przekrojach naśladującą trakt głosowy człowieka a nie analizuje dźwięk jako taki.
  • #14 984608
    h-doc
    Poziom 27  
    No tak - i właśnie współczynniki odbicia modelują instrument/trakt głosowy.
  • #15 985415
    xexecute
    Poziom 11  
    Jakie cechy w dziedzinie czasu i w dziedzinie częstotliwości mam wybrac dla sygnału na podstawie których porównam danyc sygnał z innym ???
  • #16 985515
    koodłaty
    Poziom 14  
    xexecute napisał:
    Jakie cechy w dziedzinie czasu i w dziedzinie częstotliwości mam wybrac dla sygnału na podstawie których porównam danyc sygnał z innym ???


    Proponuje kwantyzację wektorową. Tworzysz zbiór wektorów (nazywany książką kodową) oparty na liczbach zespolonych. W procesie rozpoznawania, wyszukujesz najbliższy (np. w poprzez użycie metryki Euklidesowej) wektor do wektora w książce kodowej. Literatura:
    "Vector quantisation and signal compression", Allen Gersho, Robert M. Gray
    "Kompresja danych - wprowadzenie", Khalid Sayood
    www.google.pl
    Jak znajdę jakieś dodatkowe materiały na dysku to podam je tutaj.
  • #17 985571
    h-doc
    Poziom 27  
    xexecute:
    1. W dziedzinie czasu - moim zdaniem (już pisałem o tym wcześniej) trzeba wyznaczyć obwiednię. Po jej wyznaczeniu trzeba ją zaklasyfikować wg jakiegoś kryterium, np. prędkości opadania/ narastania. Np. instrumenty perkusyjne i szarpane mają obwiednię bardzo szybko opadającą na początku przebiegu. Z kolei instrumenty dęte/smyczkowe mają z grubsza stałą obwiednię.
    2. W dziedzinie częstotliwości - rozkład harmonicznych. Tutaj ciężko mi coś powiedzieć. Wydaje mi się, że instrumenty smyczkowe mają stosunkowo niewielką zawartość harmonicznych w porównaniu z dętymi blaszanymi. Z kolei np. flet ma chyba zupełnie ich znikomą zawartość. Musisz popróbować. Oprócz tego możesz analizować częstotliwość podstawową - inny zakres ma kontrabas a inny skrzypce.

    Możesz również spróbować, jakie efekty daje zastosowanie LPC. Być może wyznaczone współczynniki odbicia ułatwią klasyfikację instrumentów.
  • #18 1002065
    xexecute
    Poziom 11  
    jaki znaczenie mayematyczne ma pierwsza wartos w tablicy po FFT ??? to jest jakas składowa stała, ale co ona odzwierciedla w dziedzinie matematycznej ???
  • REKLAMA
  • #19 1002435
    koodłaty
    Poziom 14  
    xexecute napisał:
    jaki znaczenie mayematyczne ma pierwsza wartos w tablicy po FFT ??? to jest jakas składowa stała, ale co ona odzwierciedla w dziedzinie matematycznej ???


    Składowa stałą jest wartością średnią ze wszystkich próbek. Jak się przyjrzysz, to zauważysz, ze X(0)=(1/N)Σx(n), bo W^0=1.
  • #20 1108777
    RaInMan
    Poziom 12  
    mam pytanie moze troche nie na temat ale nie chce odzielnego topicu zakladac bo moja sprawa tez Wav'ów dotyczy.
    wczytuje plik WAV po jednym kB robie FFT , modyfikuje, pozniej IFFT (oczywiscie wszystko z zakladkowaniem i okienkowaniem) i chcialbym ten plik odtwarzac jakby w czasie rzeczywistym czyli umieszczac otrzymane nowe wartosc w jakims buforze i odtwarzac go na bierzaco czy istenieje mozliwosc w visual'u c++ ???
    bo wiem playsoudem mozna wava odtwarzac ale juz gotowego z pliku, a ja bym wlasnie chcial tak na bierzaco to robic.
  • #21 1110746
    h-doc
    Poziom 27  
    Da się to zrobić. Kumpel robił coś takiego w visualu, ale nie wiem dokładnie jak. Gdybym ja miał się za to zabrać, najpewniej sięgnąłbym po DirectX.

    BTW - jak chodzi Ci przetwarzanie typu plik oryginalny->FFT->modyfikacje->IFFT->plik końcowy? Pytam, bo kiedyś dyskutowaliśmy tu na ten temat i ja byłrm przeciwnikiem tego typu rozwiązania? Jak z jakością dźwięku? Jakiego typu zniekształcenia pojawiają się?
  • #22 1122457
    RaInMan
    Poziom 12  
    h-doc : masz racje jesli robimy FFT np. po 1024 probki i pozniej
    ->modyfikacje -> IFFT to powstaja znieksztalcenia ( trzaski ) dlatego musimy z zakladkowaniem i okienkowaniem to realizowac zeby te trzaski wyeliminowac.
    a z tym DirectX to ciezka sprawa i nie wiem czy to za pomoca tego da sie odtwarzac dodajac to odtwarzanego pliku kolejne przetworzone probki
  • #23 1126480
    shg
    Poziom 35  
    RainInMan - te trzaski są dlatego, że "naruszyłeś" informację o fazie sygnału, o co nie trudno.

    Tutaj są źródła różnych playerów i pewnie wszystkie windowsowe odtwarzają pliki po kawałku:
    http://sourceforge.net/softwaremap/trove_list.php?form_cat=122
    Szukania na parę godzin :D

    A możesz napisać co ciekawego kombinujesz, czy to jakiś ściśle tajny projekt? :D

    -------

    A ja sobie takie coś ściągnąłem:
    http://sourceforge.net/projects/arkadianalysis/
    tam jest odtwarzanie i chyba na buforach, ale nie jestem pewien, bo nie kumam windozowego API.
  • #24 1128365
    zgubek
    Poziom 11  
    O Stary :sm28: Troche tego tutaj jest jak wroce do domu to zaczne przeszukanie moze znajde dla siebie aplikacje bazowa na podstawie ktorej rusze sobie dalej :D

    Znasz moze jeszcze jakies podobne stronki z takimi aplikacjami?
    Pozdrowa.
  • #25 1128490
    RaInMan
    Poziom 12  
    shg - docelowo mam zamiar Vocoder zrobic jednak ja za dobry w C++ nie jestem wiec powoli, krok po kroku sie douczam :)
    w tej chwili mam problem bo po FFT jak chce zwiekszyc skladowe niektorych czestotliwosci np od 500 Hz do 1kHz generuja mi sie dziwne szumy i zaklocenia a barwa glosu sie wogole nie zmienia ... ale walcze dalej moze w koncu zadziala ;)
    pozdrawiam
  • #26 1130257
    shg
    Poziom 35  
    szumy... to faktycznie dziwne, mógłbyś jakąś próbkę wrzucić? Rozumiem, trzaski na granicy "obrabianych" buforów, to jeszcze normalka, ale żeby szum?
    Vocoder robisz tak, że przez zespół sterowanych filtrów (za pomocą np. mowy) przepuszczasz jakiś sygnał (instrument), tak?

    ----------

    Cuś takiego wyczytałem, że da się vocoder na FFT zrobić, bez zabawy w filtry, czyli nie tworząc żadnych krzywych odpowiadających poszczególnym filtrom, a zrobić tak, że jeden prążek widma sygnału sterującemu odpowiada jednemu prążkowi w sygnale przepuszczanym przez vocoder.

    W praktyce:
    sygnał sterujący (mowe) -> FFT -> moduły, czyli wartości poszczególnych prążków (zakres 0 do 1) -> s (sygnał sterujący)

    sygnał "obrabiany" -> FFT -> * s (i tu trzeba zrobić mnożenie liczb zespolonych przez skalar) -> IFFT -> sygnał wyjściowy

    Powinno działać bez okienkowania i zakładek nie powinno być zniekształceń fazy, bo stosunk Re/Im zostanie zachowany, no chyba że powstaną przez "wycięcie" niektórych składników widma, co też jest możliwe. Jeszcze to sprawdzę, a mam "po drodze", bo właśnie bawię się zestawem kiss_fft :D
  • #27 1130434
    zgubek
    Poziom 11  
    Shg w tym programie co podales, czyli ttp://sourceforge.net/projects/arkadianalysis/
    jest taka aplikacja VieV DCS, czy te suwaczki sa zrobione na zasadzie filtrow cyfrowych?Z tego co tu widze to chyba tak i to chyba jest zrobione na podstawie transformaty Fouriera?
    Pozdrawiam.
  • #28 1130840
    shg
    Poziom 35  
    zgubek DCT = Discret Cosine Transform, czyli Dyskretna Transformata Cosinusów. To nie jest transformata Fouriera. Jest wprawdzie do niej podobna (dużo transformat jest do siebie podobnych), ale to nie to samo, różnią się funkcjami bazowymi. W transformacie Fouriera funkcjami bazowymi są sin() i cos(), a w DCT tylko cos(). Ściągnąłem to jak szukałem jakiegoś przyjaznego FFT i trochę mnie zaintrygowało, że znalazło coś do liczenia DCT z próbek dźwięku.

    Generalnie po DCT też dostajesz coś w rodzaju widma, ale jest to mocno uzależnione od "warunków fazowych" i nie nadaje się za bardzo do analizy dźwięku. Nie wiem, co miał na celu autor tego programu, ale jakby liczył DFT, byłby znacznie ciekawszy.
    Te suwaki reprezentują poszczególne współczynniki transformaty. Po załadowaniu próbki program najpierw oblicza DCT i ustawia suwaki stosownie do otrzymanych współczynników, a jak przesuniesz któryś z suwaków, obliczana jest transformata odwrotna (IDCT) i w wyświetlany jej efekt.

    Ale ogólnie to ten program jest do banii. :D

    Np. widmo sinusa po "przepuszczeniu" przez DCT albo jest rozmazane i postrzępione, albo go nie ma wcale. :D
    Po przepuszczeniu sinusa przez DFT dostajesz ładny prążek, albo nieco "rozpłynięty" prążek (takie dwie górki po bokach), a jak masz wcześniej okienkowanie to zawsze jest prążek, ale mniej ładny. :D Więcej o tym w temacie FFT w tym samym dziale.

    DCT liczona w dwóch wymiarach stosowana jest w kompresji JPEG.

    Fioletowe - widmo sinusa o częstotliwości rosnącej od 1 do 10kHz, uzyskane za pomocą DFT jak widać, całkiem ładne i równe
    Szare - pseudo widmo tego samego sygnału uzyskane za pomocą DCT
  • #30 1191612
    Julos
    Poziom 11  
    W kompresji MP3 stosuje sie DCT, co prawda nieco zmodyfikowaną ale jednak. DCT ogólnie jest dobra do kompresji bo ma właściwość kumulowania energii w pierwszych prążkach (dlatego pozostałe można wyciąć) i jest jek gdyby pochodną transformacji Fouriera. Ogólnie rzecz biorąc DCT to taka rzeczywista FFT
REKLAMA