En enkel ljudkompression

Under kursen TNG015 Signaler och system här på Linköpings tekniska högskola genomförde jag ett mindre projekt som gick ut på att testa ett teoretiskt resonemangs praktiska funktionalitet.

Det hela handlade om komprimering av digitalt ljud och baserades på en filtreringsprocess. Jag tänkte skriva litet kort om resonemanget och jag lägger dessutom ut källkoden till programmet jag skrev under projektets gång.

Kompression av digital data baseras på att det ibland uppstår upprepningar och mönster i datan som rent intuitivt tar upp onödigt mycket plats. Som ett exempel kan man tänka sig att textsträngen "aaaaabbbbbccccc" skulle kunna lagras på ett smart sätt som tar mindre utrymme om man utnyttjade det faktum att den egentligen består av tre tecken med ett visst antal upprepningar för varje.

Samma princip gäller förstås för ljud - om man kan hitta upprepningar och mönster kan man också lagra ljudsignalen på ett intelligent sätt. Ljudet representeras digitalt som ett ändligt antal sampelvärden, där varje värde motsvarar en amplitud. Det är även så att ljudet består av en kombination av olika frekvenskomponenter, där höga frekvenser bidrar till den stora detaljrikedomen (snabba variationer till exempel) som signalen kan innehålla.

Mitt resonemang gick ut på att om jag kan filtrera bort (eliminera) de höga frekvenserna så minskar detaljrikedomen i ljudet och chansen att upprepningar och mönster uppstår ökar. Efter detta skulle jag kunna använda någon känd kompressionsmetod för att göra filstorleken mindre. Intuitivt känns det som att ju fler frekvenser jag filtrerar bort, desto högre blir kompressionsgraden och desto mindre blir (naturligvis) filen.

För att testa mitt resonemang skrev jag ett Java-program som läser in en Wave-fil, filtrerar bort frekvenser högre än en viss brytfrekvens (lågpassfiltrering), komprimerar datan med GZIP-kompressionen och sparar resultatet som en ny fil.

Det visade sig att mitt resonemang i huvudsak stämde, även om det blev uppenbart att många fler faktorer spelade in i den resulterande filstorleken. På det stora hela var projektet lyckat, och jag är glad och stolt att kunna presentera det här.

Till höger har jag bifogat en RAR-fil med källkod, programfiler och dokumentation, tillsammans med ett PDF-dokument innehållande den rapport jag skrev efter projektets slut. Jag rekommenderar den intresserade att läsa rapporten - jag har försökt skriva den på ett lättförståeligt sätt och hålla nere sidantalet så att den ska vara lätt och rolig att läsa.

Anders Fjeldstad

Anders Fjeldstad
Publicerad 21 mars 2004, uppdaterad 22 maj 2007

Copyright © 2005 Anders Fjeldstad et al.