Bezstratna kompresja dźwięku
28.07.2010 - Krzysztof Templin
![]() ![]() Czy zdarzyło Ci się kiedyś bardzo uważnie stąpać po chodniku, tak aby nie nastąpić na przerwę między płytkami? Czasami małe obsesje miewają pozytywny aspekt. Na przykład spowodują, że zainteresujesz się teorią informacji. Skopiowanie swojej kolekcji płyt CD z muzyką na dysk twardy komputera znacznie ułatwia życie. Niestety muzyka zajmuje dość dużą powierzchnię dyskową, a niektórzy ludzie nie mogą znieść myśli, że mieliby stracić choć trochę na jakości, więc MP3 nie jest dla nich rozwiązaniem. Nawet jeśli nie słyszą żadnej różnicy, myśl o bezpowrotnie utraconych bitach nie da im spać. Pozostaje zatem skorzystanie z jednego z kodeków bezstratnych, takich jak FLAC, Apple Lossless czy WavPack. W niniejszym artykule pokażemy, jak zaimplementować w języku Python swój własny kodek. ![]() Kod źródłowy kodeka w PythonieDigitalizacjaPłyta kompaktowa jest cyfrowym nośnikiem danych. Oznacza to, że dźwięk przed zapisaniem na niej musi być poddany przekształceniu w skończony ciąg liczb. W tym celu analogowy sygnał reprezentujący dźwięk jest poddawany dwóm operacjom: kwantyzacji oraz próbkowaniu. W procesie kwantyzacji dzielimy zbiór możliwych wartości sygnału na przedziały. Następnie amplitudę sygnału zaokrąglamy do wartości przypisanych odpowiednim przedziałom. W ten sposób sygnał w danym momencie możemy opisać liczbą. Kwantyzację ilustruje rysunek 1. Próbkowanie oznacza, że zapamiętujemy amplitudę sygnału w pewnej skończonej liczbie punktów na osi czasu, natomiast resztę sygnału odrzucamy (rys. 2). Łącząc te dwie operacje, muzykę możemy zapisać jako ciąg liczb.
Format CD-Audio zakłada, że częstotliwość próbkowania to 44100 Hz, a liczba przedziałów kwantyzacji to 216 (każda próbka zapisana jest na szesnastu bitach). Uwzględniając fakt, że sygnał na płycie jest stereofoniczny, na zapisanie sekundy muzyki potrzebujemy 44100 × 16 × 2 bitów, czyli około 1,3 megabita. Przy pomocy odpowiedniego oprogramowania utwór z płyty możemy zapisać na dysku twardym komputera w postaci pliku wave. W tym momencie pojawia się wyzwanie: upakować dane na mniejszej powierzchni.
Wstępne przetwarzanieW dalszej części dla uproszczenia skupimy się na kompresji dźwięku mono; żeby skompresować dźwięk stereo wystarczy niezależnie skompresować kanał lewy i prawy i zapisać wynik w jednym pliku. Dla wygody przez W[i] będziemy oznaczać i-tą próbkę kompresowanego sygnału. Dodatkowo nie będziemy kompresować sygnału w całości, lecz podzielimy go na krótkie bloki równej długości i skompresujemy każdy z osobna. Taka strategia, stosowana przez istniejące kodeki, ma dwojakie uzasadnienie.
(3 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com