Zajtenberg Zajtenberg
989
BLOG

Zaglądamy w dźwięk

Zajtenberg Zajtenberg Nauka Obserwuj temat Obserwuj notkę 1

Zgodnie z obietnicą, dziś garść „doświadczalnych” refleksji dotyczących w miarę prawdziwych dźwięków. W dwóch poprzednich odcinkach opisałem nieco teorii, według której o barwie dźwięku decydowały tzw. harmoniczne. Podałem nawet sposób jak te składowe obliczyć. Teraz jednak pora zmierzyć się z prawdziwym dźwiękiem, a nie jakimś tam modelem.

Zacząłem od znalezienia kilku próbek pojedynczych tonów przeszukując moją płytotekę. Wbrew pozorom nie jest to takie proste, bo muzycy rzadko kiedy decydują się na granie pojedynczego dźwięku – a to podgrają jakiś akord, a to do nutek dołoży się perkusja lub bas. Nawet jeśli ktoś zdecyduje się na pojedyncze uderzenie w pojedynczą strunę, to zaraz musi dołożyć jakieś glissando czy inny ozdobnik. Jednak coś niecoś znalazłem i zgrałem na dysk komputera (do pliku WAV). Planowałem wyciąć sobie z takiego dźwięku kawałek o czasie równym okresowi drgań za pomocą darmowego Audacity czy sharewarowego Cool Edit, zapisać przebieg w postaci liczb i excelową maszynką obliczyć składowe. Poległem jednak już na pierwszej próbce, przy której motylki Lorentza zdawały się być wzorem regularności i porządku:

image

Cóż więc robić? Zdecydowałem się na badanie kawałka dźwięku (o długości od 0,2 do 0,5 sekundy) i obliczenie transformaty Fouriera.

Na początek jednak w jaki sposób wydobyć dane liczbowe z pliku WAV. Otóż taki plik ma 44 bajtowy nagłówek, w którym zapisane są właściwości pliku (stereo/mono, częstotliwość próbkowania itp.). Dźwięk zgrany z CD jest zwykle w stereo (przerabiałem go do mono), jest próbkowany w częstotliwości 44100 Hz i ma 16-bitową dokładność – po 44 bajtach nagłówka następują dwubajtowe paczki określające wartość przebiegu (na jedną sekundę przypada 44100 takich paczuszek). Dlatego chcąc odczytać taki plik napisałem sobie następujący program w C++:

ifstream plik( "plik.wav", ios::binary );
char Nagl[44];
short wart;
 
plik.read( Nagl, 44 );
while( 1 )
  {
  plik.read( reinterpret_cast< char * >( &wart ), 2 );
  if( !plik ) break;
  // teraz można sobie coś zrobić z wartością wart
  cout << wart << "\n";
  }
plik.close();

Jakbyś chciał używać tego programu, to uważaj, bo short wcale nie musi mieć dwóch bajtów (choć pewnie tyle właśnie będzie miał), a binarna wartość odczytanych dwóch bajtów nie musi wcale się składać na odpowiednią liczbę całkowitą (ma to związek z różnicą pomiędzy Little endian, a Big endian). Przed tym pierwszym da się jeszcze obronić przez:

assert( sizeof( short ) == 2 );

W przypadku drugim, pozostaje odczytywanie danych dwuelementową tablicą typu char i żonglerka bitami. Ale jeśli działasz na jakimś intelowskim Windowsie, to będzie OK.

Żeby zbadać jakie częstotliwości składają się na nasz dźwięk, obliczyłem jego transformatę Fouriera:

a( f ) ~ ∫ cos(ωt) wart(t) dt
b( f ) ~ ∫ sin(ωt) wart(t) dt
c( f ) = √( a2(f)+b2(f))

gdzie ω = f/2π a wart(t) to odczytane wartości przebiegu. Wyrażenia te i tak liczył program (porzuciłem tu Excela), całkowanie zrealizowałem jako sumowanie odpowiednich warażeń dla każdej odczytanego dwubajtowej paczki. Sumy te obliczane były dla tylu częstotliwości, by zgrabnie można było utworzyć wykres c(f).

Dla sytuacji, kiedy przebieg trwa nieskończenie długo i jest doskonale okresowy powyższe wzory sprowadzają się do tych, opisanych w poprzedniej notce. Ale 0,2 sekundy, to nie jest nieskończenie długo, więc przetestowałem przebieg prostokątny i okazało się, że tak krótki czas wystarcza daje wystarczającą dokładność, by mówić o składowych.

image

Ominę szczegóły techniczne i opiszę, jakie to efekty otrzymałem. Fortepian:

image

Widać, że dźwięk rzeczywiście składa się z alikwotów. Małym zaskoczeniem była analiza brzmienia gitary akustycznej – strasznie dużo w nim harmonicznych:

image

Pora na przesterowaną gitarę:

image

I na koniec brzmienie, którego fragmencik przebiegu pokazałem na początku notki – to przesterowana gitara z dołożonym efektem (bodaj) chorusa.

image

Jak widać można rozpoznać tam alikwoty, choć widać, że pojawia się jakaś dodatkowe częstotliwości. Dlaczego? Próbowałem wycinać inne fragmenciki i efekt ten również się pojawiał. Stawiam, że to skutek zastosowanego efektu, choć mogę się mylić.

Reasumując: Powyższa notka nie stanowi jakiejś wielkiej analizy, jedynie małą wprawkę (zabawę). Żeby wyciągnąć jakieś konkretne wnioski, należałoby nagrać kilkanaście surowych brzmień np. różnych gitar akustycznych, przetransfourierować i dopiero wtedy uogólniać jakie są typowe własności brzmienia gitary akustycznej. Mimo to można się pobawić :)

Zajtenberg
O mnie Zajtenberg

Amator muzyki "młodzieżowej" i fizyki. Obie te rzeczy wspominam na blogu, choć interesuję się i wieloma innymi. Tematycznie: | Spis notek z fizyki | Notki o mechanice kwantowej | Do ściągnięcia: | Wypiski o fizyce (pdf) | Historia The Beatles (pdf)

Nowości od blogera

Komentarze

Inne tematy w dziale Technologie