Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

wczytywanie plików WAVE

225 views
Skip to first unread message

kony

unread,
Mar 7, 2008, 12:35:28 PM3/7/08
to
Mam następujący problem, o nim nieco dalej...

wczytując pliki formatu WAV w Matlabie korzysta się z następującej
instrukcji
[y, fs, bits] = wavread('GLASS.wav'); // standardowy pliczek gdzieś z
katalogu win
% fs = 8000 Hz; bits = 8

jeśli dźwięk jest mono to otrzymamy tablicę y wymiaru Nx1, gdzie N to
liczba sampli, w przypadku sygnału 2-kanałowego, będzie to Nx2;
y jest ciągiem próbek o wartościach zmiennopozycyjnych i wszystko się
zgadza, ponieważ po wczytaniu tego samego pliku w programie Audacity
widać odpowiednie oscylacje na przebiegu czasowym w zakresie [-1, 1]

teraz aby wykonać w Pythonie, to co było robione w Matlabie, trzeba
wprowadzić kod:
import wave # biblioteka wbudowana w środowisko
wav = wave.read('GLASS.wav', 'rb')
y = wav.readframes(N); # N wynosi 4096

jeśli teraz wylistujemy y, otrzymujemy ciąg bajtów (definicja z ang.
manuala), innej metody do odczytania WAV chyba nie ma. Ponadto
dlaczego w etykiecie metody readframes() jest ten suffix 'frames' i
jakie ramki może oznaczać? Czy takie dane oznaczają próbki w postaci
skwantowanej, ale np. zapisy \x82sygq jak na rozdzielczość 8-bitową są
trochę dziwne, gdzie tu rozróżnienie na kanały. Ponadto jak z takich
danych policzyć FFT, w Matlabie ta postać zmiennopozycyjna wyjaśniała
wszystko w rozumieniu przejścia z sygnału analogowego na sygnał
dyskretny jako chwilowe amplitudy z określonym interwałem próbkowania
(wartości jak przy produkcji sygnału ze składowych harmonicznych),
potem ewentualna analiza częstotliwościowa lub kwantyzacja na sygnał
cyfrowy...

Tutaj jestem w kropce :(
Ktoś się bawił z wave pod Pythonem vs. Matlab i może pomóc?

janislaw

unread,
Mar 8, 2008, 4:43:29 AM3/8/08
to
Polecam lekturkę manuala nt. modułu array - dzięki niemu
przekonwertujesz sobie ciąg bajtów do postaci kalkulowalnej. A jak do
tego chcesz liczyć fft, to polecam od razu sięgnąć na wyższą półkę,
znaczy numpy/scipy.

Pozdrawiam
Jan Wicijowski

kony

unread,
Mar 11, 2008, 10:55:20 AM3/11/08
to
> Polecam lekturkę manuala nt. modułu array

faktycznie:
import array
array.array('H', daneRAW) # unsigned short int (2B) dla
rozdzielczosci probkowania 16 bit
array.array('B', daneRAW) # unsigned char (1B) dla dzwieku 8-bitowego

gdzie daneRAW to ciagi bajtow pobrane za pomoca readframes()

jak dzwiek jest dwukanalowy, to sample = array.array('H', daneRAW);
iloscProbek = len(sample) / 2
i mamy faktyczna liczbe probek; mysle, ze wiarygodne wnioski, bo
porownane z wynikami
Matlaba, identyko :)

polecam tez biblioteke PySonic

Pozdrawiam,
kony

0 new messages