Częstotliwość, barwy, itp. dzwięków

0

Jak ktoś wie jak porównywać, mierzyć itp częstotliwość dzwięków to niech zamailuje do mnie

:)--Rexo pozdrawia !!!!!!!

0

Sprawa jest b. zlozona.

Tak po prostu czestotliwosc maja tylko czyste sinusoidalne tony. Zeby ja wykryc musisz zrobic analize Fouriera dzwieku uzyskujac jego widmo i znalezc maksimum widma. Widmo, mowiac bardzo prosto, to wykres pokazujacy natezenie skladowych o roznych czestotliwosciach.

Sa dzwieki tzw harmoniczne, ktore skladaja sie z czestotliwosci podstawowej i tzw harmonicznych. Sa one jakby zlozeniem czystych tonow o czestotliwosciach f (cz. podstawowa), 2f, 3f, 4f itd. Do takich dzwiekow naleza np przebiegi piloksztaltne, prostokatne, oraz z pewnym przyblizeniem dzwieki instrumentow muzycznych. Widma takich dzwiekow maja kilka lub wiecej maksimow, czestotliwosc podstawowa to pierwsze maksimum, ktore jest zreszta zazwyczaj najsilniejsze. Ale uwaga: dzwiek o usunietym f a zostawionych 2f, 3f, 4f, itd bedzie odbierany jak dzwiek o tej samej wysokosci co dzwiek z 'zostawionym' f (fenomen missing fundamental). Nawiasem mowiac pozwala to slyszec wzglednie sensownie muzyke z glosnikow nie przenoszacych niskich czestotliwosci.

Dalej, sa dzwieki szumowe, czyli o widmie ciaglym. Ich widmo nie zawiera maksimow. Skrajnym przykladem jest tzw bialy szum, zawierajacy wszystkie czestotliwosci w rownym stopniu.

Oczywiscie, w prawdziwych dzwiekach widmo zmienia sie w czasie. Dla pomiaru zmiennych dzwiekow trzeba wyliczac widmo fourierowskie w pewnych malych odstepach czasu tworzac tzw spectrogram (lub sonogram), czyli mape lub tablice, majaca na jednej osi czas, na drugiej czestotliwosc, a w polach podane sa wartosci natezenia skladowych czestotliwosciowych w danym momencie czasu.
Sa jeszcze 2 problemy z FFT (Fast Fourier Transform). 1. fizjologiczna skala czestotliwosci jest logarytmiczna. Tzn jesli mamy dzwieki A, B, C, D i dla czlowieka roznica wysokosci miedzy A i B jest taka sama jak miedzy C i D, to znaczy, ze stosunek (a NIE roznica) czestotliwosci A do B jest taka sama jak C do D. A dokladnosc FFT jest liniowa a nie logarytmiczna, wiec daje wyniki bardzo dokladne dla b. wysokich czestotliwosci a malo dokladne dla niskich. 2. Rozdzielczosc czestotliwosciowa FFT mozna zwiekszac biorac do analizy wieksza liczbe kolejnych probek (dluzszy odcinek czasu). Niestety nie tylko zwieksza to czasochlonnosc obliczen, ale tez, jak latwo sie domyslic, bardzo zmniejsza precyzje czasowa.

Barwa dzwieku jest definiowana jako to, co pozwala nam odroznic dwa dzwieki o tych samych wysokosciach. Na barwe sklada sie b. wiele czynnikow i jej opis, a tym bardziej pomiar, jest b. trudny, Podstawowym czynnikiem jest wzajemny stosunek natezen skladowych dzwiekow harmonicznych, ale istotne sa tez: zmiana tego stosunku w czasie, obwiednia amplitudy, zawartosc szumu, modulacje amplitudowe i czestotliwosciowe oraz transjenty - szczegolnie poczatkowe.

Transjenty to kolejny problem. Sa to stany nieustalone, czyli krotkie fragmenty dzwieku ktorych bogata struktura zmienia sie w sposob nieperiodyczny, a wiec nie daje sie sensownie opisac widmem.

Jesli chcesz sie lepiej wczuc w te sprawy, sciagnij z internetu program SpectroGram (autor R.S. Horne) i poanalizuj nim rozne dzwieki. Jesli chcesz sie doksztalcic z np analizy czestotliwosci podstawowej, polecam www.praat.org. Paul Boersma rozdaje (na prosbe zainteresowanych) program do profesjonalnej naukowej analizy mowy Praat. Jedna z licznych funkcji Praata jest wyciaganie czestotliwosci podstawowej z dzwiekow metoda auto-lub cross-korelacji. na stronie, o ile pamietam, jest tez artykuj Boersmy opisujacy algorytmy.

Pozdrawiam, Pawel--Pawel

Delphi6

0

Tak czytajac wypowiedz Pawla zauwazylem ze ludzio lubia blyskac inteligencja zamiast podac konkretny przklad rozwiazania problemu. Ale mniejsza z tym niektorzy maja taki charakter. Otoz rexo sprawa analizy czestotliwosci jest b. prosta. [podam przyklad w Delphi] Najpierw sciagnij sobie Bass z http://www.un4seen.com/music/music_bass.html . Rozpakuj to do np. katalogu z projeketem w Delphi, a w tym projekcie do uses dodaj BASS. Od poczatku do konca wygladalo by to tak:

var Equalizer: array[0..512] of Float; *tablica na dane o spectrum
var muza: HStream;

if BASS_GetVersion() &lt&gt MAKELONG(1,4) then Halt;
BASS_Init(-1, 44100, 0, handle);
BASS_Start;

*ten powyzszy kawalek kodu to inicjalizacja BASS

BASS_Stop;
BASS_Free;

  • zwolnienie zasobow

  • teraz przyklad do analizy pliku mp3 lub wav

Muza:=BASS_StreamCreateFile(False,PChar(NAZWAPLIKU),0,0,BASS_STREAM_AUTOFREE);
BASS_StreamPlay(Muza,False,0);

  • tworzy obiekt i odtwarza plik o sciezce NAZWAPLIKU

BASS_ChannelGetData(Muza,@Equalizer,BASS_DATA_FFT1024);

  • ta linijka powyzej pobiera dane o widmie i zapisuje do tablicy o 512 pozycjach (dla odtwarzanaego w danej chwili kawalka utworu) Jedyne z czym zgadzam sie z pq to to ze skala jest liniowa, ale mozna to sobie przerobic na logarytmy :)

Jesli niewiesz o co w tym chodzi to napisz maila to podrzuce Ci kod zrodlowy i skompilowany program do tego.
-------[ Delphi 6 Rulez 4 Ever!, przynajmniej do czasu gdy naucze sie C++ :) ]------

0

Dzieki Sheitar, ze wspomogles moje niepohamowane blyskanie konkretem. Sam skorzystam. Ale poblyskam jeszcze troche. Mozna przeliczyc na logarytmy, ale wartosci pomiedzy musisz interpolowac. Co przy niskich czestotliwociach moze byc wysoce niedokladne. I jescze jeden blysk, w dodatku powtorzony - maksimum widma nie musi odpowiadac percypowanej wysokosci dzwieku.

Pozdrowienia!--Pawel

Delphi6

0

8o

Jestem pod wrazeniem ... Co prawda, nic z tego nie rozumiem.

pozdr
--Astacus (D5 Pro)

0

Jesli chodzi o zachowanie dokladnosci przy niskich freq. to po co logarytmowac? w podanym przezmnie przykladzie mozna zwiekszyc jeszcze dokladnosc czyli

var Equalizer: array[0..1024] of Float;
i
BASS_ChannelGetData(Muza,@Equalizer,BASS_DATA_FFT2048);

(na wiecej nie pozwala juz sam BASS ) Skale freq. zostawic liniowo (akurat sie miesci na calosc przy rozdzielce 1024x768) a jesli amplituda bylaby za niska to ja zlogarytmowac. Osobisice robie plajerka i do analizy spectrum to w 100% mi odpowiada, a na dodatek dziala lepiej niz winampowskie cudo. Jesli ktos zada wiekszej dokladnosci przy FFT to proponuje Cool Edit '96 tam mozna sobie ustawic ilosc probek na 64K (na 1GHz oblicza to jakies 2 sekundy) i do wyboru jest 6 metod. No i poco czepiac sie dokladnosci. To tak jak przy namierzaniu bomby atomowej poprzez system GPS czy te 1m robi roznice? -------[ Delphi 6 Rulez 4 Ever!, przynajmniej do czasu gdy naucze sie C++ :) ]------

0

No to jeszcze pare blyskow. Trudno, taki mam charakter ;-)

Nie twierdze ze sie nie da. Zauwaz jednak, ze przy proponowanej przez Ciebie rozdzielczosci (FFT 2048, 1024 czestotliwosci) i pliku probkowanym z czestotliwoscia 44.1 kHz rozdzielczosc wynosi okolo 21 Hz. Dla niskich czestotliwosci to nadal kiepski wynik. W okolicach 100 Hz rozdzielczosc 21 Hz to ponad 3 poltony, wiec raczej sporo. Bomba atomowa w odleglosci pol kilometra od celu to juz nie najlepiej.
A dalsze zwiekszanie rozmiaru FFT spowoduje spadek rozdzielczosci czasowej. 2048 probek to juz ok. 46 ms, 65536 probek to prawie 1.5 sekundy! I jeszcze jedno: CoolEdit 2000 (bo taka jest aktualna wersja) to niezle narzedzie do ogladania ale nie do pomiarow-nie da sie zrzucic widma w postaci liczbowej. Lepsze sa wspomiane przeze mnie Praat i SpectroGram. ten drugi jest ponadto bardzo pogladowy. Moim zdaniem lepszy do ogladania niz CoolEdit.

Tyle (na razie) blyskow, dzieki za namiar na BASS. Czy ma on mozliwosc zdjecia widma z zadanego miejsca pliku, czy tez robi to tylko w locie przy odtwarzaniu?

Pozdrwienia, Pawel--Pawel

Delphi6

0

A tak cos dla normalnych ludzi......? :))--Delphi 4

Skysh The God, Your Slave

0

A co bys chcial, normalny czlowieku? :))))))--Pawel

Delphi6

0

No niewiem czy te pol kilometra dla atomowki to jednak wieeelka roznica czy zginiesz od wybuchu czy jako mutant to szczerze mowiac wole to pierwsze. :) A co do zdjecia widma z okreslonego miejsca pliku to mozna by sprobowac ustawic pozycje pliku poprzez BASS_ChannelSetPosition(handle, pos); a potem pobrac dane, ale niewiem nie sprawdzalem. Najpierw jednak trzeba zrobic j/w podalem tyle ze mozna sobie odpuscic Bass_Play(.......);
-------[ Delphi 6 Rulez 4 Ever!, przynajmniej do czasu gdy naucze sie C++ :) ]------

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0