www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Audiokompression


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?IdcServic...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank L. (hermastersvoice)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/applicationnot...

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Lupin (Gast)
Datum:

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

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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%20pr...
und http://www.programmersheaven.com/download/2166/download.aspx

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.