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

Pliki .wav i wyłuskiwanie informacji

galsan 25 Gru 2008 12:34 4461 8
REKLAMA
  • #1 5901005
    galsan
    Poziom 12  
    Witam,

    Do końca nie wiem czy to odpowiedni dział na to pytanie, ale odpowiedniejszego nie znalazłem..

    Bawię się ostatnio strukturą wavehead zawierającą informacje dotyczące plików .wav. W programie (pisanym w C) plik taki można otworzyć za pomocą zwyczajnej funkcji otwierania pliku fread() i zapisać dane dźwiękowe do bufora typu char*. Po "zapisaniu pliku" w tablicy otrzymujemy w niej liczby z przedziału [-255, 255]. Gdy wykreślimy te liczby na wykresie dostaniemy przebieg, np. sinusoidę w przypadku prostych dźwięków.

    Po tym wstępie mam pytanie, które mnie trochę dręczy.. Wiadomo, że na dźwięk składa się częstotliwość, amplituda i co bardzo ważne - barwa, która sprawia, że dźwięki choć o tej samej częstotliwości (wysokości) różnią się.. Możemy przecież mieć dźwięk np. C z pianina, skrzypiec czy fletu. Na barwę składa się jak wiadomo zawartość harmonicznych..
    I tu moje pytanie.. Gdzie w odczytanym pliku wave jest informacja o właśnie barwie? W tym steku liczb, które przedstawią sinusoidę (i trochę szumu) gdzie znajduje się to co odróżni pomimo tej samej częstotliwości pianino od fletu, lub głos jednego człowieka od drugiego?
    Chyba transformaty Fouriera nie dałoby się tu zastosować no bo jak.. Komp przecież jakoś za pomocą WinApi to odtwarza..

    Nie wiem czy dobrze to sformułowałem, ale mam nadzieję, że ktoś z Was wie o co mi chodzi...
  • REKLAMA
  • Pomocny post
    #2 5901426
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 5901526
    galsan
    Poziom 12  
    hmm.. czyli rozumiem, że wszystko schowane jest w przebiegu.. faktycznie nie zawsze przypomina on sinusoidę.. W takim razie, jeśli chciałbym np. napisać program, który rozpoznawałby np. głos i odróżniał głos jednego człowieka od drugiego (zakładając że osoby wypowiadałyby ten sam wyraz bądź literę po prostu) to wystarczyłoby mi porównać te wartości w tablicy jednej osoby z wartościami drugiej, żeby wykazać, że to inne osoby, no chyba że dane pokrywałyby się.. Wynik porównania można by było określić jakimś błędem np. OK jeśli wartości są zgodne w 90%.. (?)

    A dla przykładu tego co mam w tablicy - zobrazowałem sobie w postaci wykresu (w excellu). Jest to wygenerowany ton o f = 300 Hz, rozdzielczość 16 bitów:
    Pliki .wav i wyłuskiwanie informacji

    Na wykresie 300 próbek

    Dodano po 3 [minuty]:

    jak widać oprócz sinusa są jakieś "śmieci".. to pewnie te ważne informacje ;p
  • REKLAMA
  • #4 5902324
    Konto nie istnieje
    Poziom 1  
  • #5 5903443
    galsan
    Poziom 12  
    Faktycznie, to były jakieś śmieci.. Ale pozbyłem się ich w dziwny sposób.. W zasadzie trochę przypadkowo.. Zauważyłem, że śmieci są co drugą pozycją w tablicy.. Przebieg wyświetla się idealnie bez śmieci, gdy rozpocznę sczytywanie tablicy od drugiego elementu wyświetlając co drugą komórkę.. Dziwne.. Ale działa..

    Wracając do sedna.. jest jakaś możliwość rozłożenia tego przebiegu na widmo? Są chyba do tego potrzebne jakieś specjalne kodeki.. Teraz już nie wiem.. Czym tak naprawdę są wartości w tej tablicy które tworzą kształt wykresu? (kształty faktycznie różne, nagrałem kilka instrumentów i mowę) Kształt jest taki sam w moim programie jak też przedstawiony w programie w którym dźwięki nagrywam (CoolEdit). Czym jest więc pojedyncza próbka..? Wyraża amplitudę..? Czy liczy się cała sekwencja występujących po sobie cyfr..?
  • Pomocny post
    #6 5904139
    koodłaty
    Poziom 14  
    To o czym mówisz jest reprezentacją czasową sygnału. Dźwięk przed zapisaniem do postaci cyfrowej poddawany jest m.in. następującym operacjom:
    - filtracji dolnoprzepustowej (odcinanie częstotliwości, które nie są istotne)
    - próbkowaniu (wybieraniu amplitudy sygnału co określony przedział czasu)
    - kwantyzacji (amplituda sprowadzana jest do wartości w obrębie pewnego kwantu zależnego od ilości bitów)
    Stąd płyną dwie dodatkowe informacje opisujące sygnał cyfrowy: częstotliwość próbkowania oraz ilość bitów na sygnał. Na szybko znalazłem następujący link:
    http://panb.host247.pl/asia/tutorial_basics_1.html
    Próbka jest zatem przybliżoną wartością amplitudy w czasie Tx.
    Co do drugiego pytanie - rozumiem, że celem jaki sobie przyjąłeś jest rozpoznanie mówcy. Od razu mówię, że w dziedzinie czasowej nie zrobisz tego; sygnał należy przetworzyć. W najprostszym przypadku należałoby wyznaczyć współczynniki filtra mowy, obliczyć sygnał resztkowy i na nim określić ton podstawowy. Proponuje poszukać na forum informacji o LPC10 oraz cepstrum; będzie sporo zabawy z macierzami, filtrami oraz FFT ;)
  • REKLAMA
  • #7 5904588
    Konto nie istnieje
    Poziom 1  
  • #8 5907656
    galsan
    Poziom 12  
    Dziękuję wszystkim za wyczerpujące odpowiedzi.. Chyba jednak zostawię na razie ten temat z praktycznego punktu widzenia.. brak mi teoretycznej wiedzy o przetwarzaniu sygnałów jak widzę.. Kiedyś na pewno do tego jeszcze wrócę. A przynajmniej mam już szersze wyobrażenie na temat samych plików wave i dźwięku. Dziękuje i pozdrawiam.
  • #9 5917087
    arturt134
    Poziom 27  
    Na początek radziłbym zapoznać z programem LabView lub Matlab, gdzie w sposób graficzny można "zmontować" układ przetwarzający sygnał z pliku wav przy pomocy filtrów lub różnych transformat. Myslę, że w ten sposób uda ci się zobaczyć jaki efekt daje zastosowanie filtru górno-, dolno- lub pasmowoprzepustowych, a jaki analiza widmowa. No i oczywiście jakaś książka do DSP też by się przydała. Poza tym na sieci można znaleźć gotowe programy, napisane w Matlabie, wykonujące pewne operacje na plikach dźwiękowych - to też jest sposób na naukę.
REKLAMA