Bezstratna kompresja dźwięku

28.07.2010 - Krzysztof Templin
TrudnośćTrudność

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 Pythonie

Digitalizacja

Pł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.

Rysunek 1

Rysunek 1. Kwantyzacja.

Rysunek 2

Rysunek 2. Próbkowanie.

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.

Rysunek 3

Rysunek 3. Kwantyzacja i próbkowanie. Sygnał cyfrowy.

Wstępne przetwarzanie

W 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.

  • Podział ułatwia obsługę skompresowanego pliku: przykładowo, możemy zacząć odtwarzać plik od środka lub edytować pewne fragmenty, nie będąc zmuszonymi do dekodowania pliku od samego początku.
  • Można się spodziewać, że podział zaowocuje większym stopniem kompresji. Charakterystyka sygnału zmienia się w czasie, więc intuicja podpowiada, że jeśli będziemy dopasowywać parametry algorytmu lokalnie, zamiast ustalać je raz dla całego utworu, to mamy szansę uzyskać lepsze efekty. Oczywiście, nie możemy pliku podzielić na zbyt krótkie segmenty, gdyż z każdym blokiem związany jest pewien narzut pamięciowy.
4.666665
Twoja ocena: Brak Ocena: 4.7 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com