Wyciąganie informacji z pliku .wav

0

Witam wszystkich, mam taki problem: dostaliśmy na studiach zadanie stworzenia programu który pozwoli użytkownikowi wybrać plik .wav (dowolny) po czym podda zapisane w nim częstotliwości transformacie Fouriera i wyświetli wykres z tej transformaty. Język programowania wykładowca dał co prawda dowolny ale wybrałem c# z powodu najmniejszego problemu z tworzeniem GUI. Mam problem z wyciągnięciem częstotliwości z pliku .wav. Napisałem taki kod:

openMusic.ShowDialog();

byte[] data;
string path = @openMusic.FileName;

FileStream fs = new System.IO.FileStream(path, FileMode.Open);
data = new byte[fs.Length];
fs.Position = 0;
fs.Read(data, 0, (int)fs.Length);
fs.Close();


I w tym miejscu się gubię. Kod tworzy tablicę byte w której jest binarnie zapisany cały plik .wav (kod jest zrobiony na podstawie kodu z internetu, nigdy wcześniej nie wczytywałem plików w postaci bajtowej) . Nie mam jednak pojęcia jak wyciągnąć z tej tablicy interesujące mnie częstotliwości do przerobienia. Z samym algorytmem transformaty sobie poradzę, chodzi tylko o wyciągnięcie tych informacji. Będę wdzięczny za jakąkolwiek pomoc (czy gotowy kod do przeanalizowania czy też jakieś dobre wytłumaczenie jak wyciągnąć te informacje). Z góry dziękuję za każde zaangażowanie :)
1

Ale zdajesz sobie sprawę, że z TEJ KONKRETNEJ tablicy częstotliwości nie wyciągniesz? Bo z twojej wypowiedzi wynika, że najpierw chcesz częstotliwości a później sobie zrobisz transformatę.
Widmo częstotliwościowe dostaniesz dopiero po zastosowaniu FFT.

Z pliku .wav tego nie wyciągniesz - tam są tylko próbki dla PCM (Pulse Code Modulation).

0

No tak, tak to jest jak się temat próbuje zrozumieć o drugiej w nocy :) A czy jesteś w takim razie w stanie wytłumaczyć mi w jaki sposób wyciągnąć te próbki? Bo pewnie w takim razie o to wykładowcy chodziło :)

1
xfin napisał(a):

Z pliku .wav tego nie wyciągniesz - tam są tylko próbki dla PCM (Pulse Code Modulation).

Nie każdy WAV jest w formacie PCM. WAV to kontener, i może zawierać strumień dowolnego formatu.
Ale załóżmy że w zadaniu chodzi nie o "dowolny" WAV, tylko o WAV nieskompresowany, czyli PCM.

Pierwsze co to trzeba odczytać nagłówek, z niego parametry (jak częstotliwość próbkowania i ilość kanałów), sprawdzić czy plik w takim konkretnie formacie w ogóle przełkniemy, i znaleźć gdzie zaczynają się próbki.
Z nich wyciągnąć transformatę.

Jak jest zbudowany plik WAV (jest to szczególny przypadek pliku RIFF) to można znaleźć w Google.

Czego nie należy robić, to przyjmować na stałe że próbki są w pliku począwszy od offsetu X, bo tak było w jednym pliku.

0

No dobra, coraz bliżej wydaje mi się jestem zrozumienia, dzięki :) Znalazłem budowę pliku .wav ale szczerze mówiąc nie jest dla mnie zbyt zrozumiała. A przynajmniej nie na tyle by przełożyć to na kod. Może na dobry początek, jak dobrać się do tych parametrów w nagłówku i gdzie zaczynają się te próbki. Znalazłem taką stronkę: http://www.kartydzwiekowe.republika.pl/pliki/wave1/wave2.htm

1

gdzie zaczynają się te próbki

ten diagram (i większość innych) jest do kitu. chunk data wcale nie musi być bezpośrednio za fmt .
trzeba w pętli przeskakiwać chunki az się natrafi na data.

https://en.wikipedia.org/wiki/Resource_Interchange_File_Format
https://en.wikipedia.org/wiki/WAV

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