Forum: Mikrocontroller und Digitale Elektronik Audiokompression


von Mike (Gast)


Lesenswert?

Hallo,

ich möchte mittels eine uC Audiosignale wiedergeben. Die Signale sollen 
in einem ROM in komprimierter Form gespeichert werden, der uC dekodiert 
sie und gibt sie über einen DA-Wandler aus. Es handelt sich im 
wesentlichen um Sprache und evtl einige musikalische "Jingles". Das 
ganze soll etwa "Kofferradioqualität" erreichen, also kein HiFi. MP3 
wäre natürlich die naheliegnste Möglichkeit, kommt aber aufgrund des 
hohen Speicherbedarfs (ca. 40 kB) nicht in Frage. Ausserdem reicht mir 
Mono.

Gibt es einen einfachen Kompressionsalgorithmus, der dafür geeignet ist, 
idealerweise frei oder Public Domain? Ich habe ADPCM mit 32kbit/s im 
Visier, kann aber keine freie Implementierung finden.
Prozessor ist ein ARM7, es stehen maximal etwa 16kB zur Verfügung. Wer 
weiss etwas oder hat so was schon gemacht?


Mike

von holger (Gast)


Lesenswert?

>Ich habe ADPCM mit 32kbit/s im
>Visier, kann aber keine freie Implementierung finden.

Bei Microchip gibt es unter den Appnotes Code für
ADPCM. Ist zwar für PIC, aber in C geschrieben.
Dürfte also kein Problem sein das umzusetzen.

http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011118

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

> MP3 wäre natürlich die naheliegnste Möglichkeit, kommt aber
> aufgrund des hohen Speicherbedarfs (ca. 40 kB) nicht in Frage.

Bei welcher Datenrate? Bei 32 kBit/sec dürfte mp3 deutlich besser 
komprimieren als ADPCM, Du benötigst natürlich Hardware zur Wiedergabe.

Oder solltest Du einen Software-mp3-Decoder mit 40 kByte Codegröße 
meinen?

> Ausserdem reicht mir Mono.

mp3 kann auch monaural codiert werden.

Als Beispiel habe ich mal den Windows-XP-Startsound angehängt, 
mp3-codiert mit 8 kBit/sec und 8 kHz Samplerate in Mono, allerdings im 
.WAV-Containerformat.

Das ist recht genau 1 kByte/sec.

von Frank L. (hermastersvoice)


Lesenswert?

Vielleicht hilf dir das hier auf die Sprünge:
http://www.romanblack.com/picsound.htm

Ist zwar PIC aber sollte sich mit etwas Anstrengung verallgemeinern 
lassen.

bye

Frank

von Mike (Gast)


Lesenswert?

@Rufus:

Aus Platz- und Kostengründen sollte die Dekompression im Mikrocontroller 
stattfinden. Der Sound sollte im ROM des uC gespeichert werden. 
Hauptproblem von MP3 ist der hohe Ressourcenverbrauch, u.a. 33 von 40 kB 
RAM und bei 60 MHz Takt bis zu 70% Prozessorleistung. Der uC soll aber 
noch was anderes tun. Die Leistungsdaten habe ich aus folgender AppNote:

http://www.nxp.com/acrobat_download/applicationnotes/AN10583_1.pdf

Allerdings scheint mir die Implementierung deutlich überdimensioniert zu 
sein, man müsste die libmad wohl etwas umstricken und auf niedrige 
Datenraten optimieren. 1kByte/s wäre natürlich toll, bei ca. 300kB Platz 
im ROM könnte ich 5 Minuten Sound speichern, mehr als genug.

Gruss
Mike

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ah, gut, es ging Dir in der Tat um die Codegröße. Das ändert die 
Anglegenheit natürlich.

Ein anderer Codec, der mit 1 kByte/sec auskommt, ist der Codec, der im 
GSM-Netz verwendet wird; wenn Du einen Windows-Rechner Dein eigen 
nennst, kannst Du mit Sndrec32 mit den verschiedenen Formaten 
herumexperimentieren, denn ein entsprechender Codec ("GSM 6.10") gehört 
zum Lieferumfang dazu.

Anbei die bekannte Datei im .WAV-Container, codiert mit just diesem 
Codec.

Ob es brauchbare Implementierungen für das Decodieren hiervon gibt, 
entzieht sich jedoch gänzlich meiner Kenntnis.

Viel Erfolg!

von Lupin (Gast)


Lesenswert?

Hier gibt es einen GSM Player für GBA. Sollte einfach zu portieren sein, 
da auch ARM:
http://www.pineight.com/gba/gsm/

von Micha (Gast)


Lesenswert?

Eventuell ist ja auch das alte VOC-Format von Creative (bzw. ein Nachbau 
:-) interessant. Das ist IMHO ein einfaches Delta-Packing, wobei je nach 
max. hohe des Delta 2-4 Samples in einem Byte gepackt werden. Du fängst 
mit einem Start-Sample (Frequenz) an und ermittelst den Unterschied des 
nächsten Samples. (1000 -> 1005, delta=5). Das codierst Du in 4 Bit (mit 
Vorzeichen). Das nächste ebenso. Ergbit eine rel. gute Packung. Ist das 
delta größer als dAS maximal abzuspeichernde muss natürlich das gesamte 
Sample gespreichert werden, incl. Flag, dass es ein "neues" Sample ist.

Eine Schnell-Suche ergabe bei Google: 
http://www.inversereality.org/tutorials/sound%20programming/examples/soundblaster16example3.html
und http://www.programmersheaven.com/download/2166/download.aspx

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.