Klangerzeugung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Für die Klangerzeugung mit Microcontrollern gibt es eine Reihe unterschiedlicher Ansätze und Umsetzungen. Die jeweils optimale Methode hängt von der Art des zu erzeugenden Geräusches, der zur Verfügung stehenden Hardware, dem akzeptierten Aufwand an Software und Rechenzeit, sowie dem gewünschten Ergebnis ab.

Im einfachsten Fall erzeugt ein externer Klangerzeuger (z.B. ein Piezo-Element an einer Messingmembran) durch simples Ein- und Ausschalten Warn- oder Piepsgeräusche, wie es z.B. bei alten PCs üblich war. Mit entsprechendem Aufwand ist aber auch mit einfachen uCs die Musik- und Sprachwiedergabe über Lautsprecher möglich.

Automatische Erzeugung von Tonfrequenzen

Es stehen eine Reihe von Chips zur Verfügung, die selbständig Klänge erzeugen können und u.U. nur eine minimale Ansteuerung oder einen Trigger benötigen:

Voltage controlled Oscillator (VCO)

  • XR8038 oder neuer MAX038
  • XR2206

Spezielle Klang-ICs

Für spezielle Klänge werden komplexe Klangerzeuger-ICs angeboten z.B.:

Der klassische Gong-IC SAB800 / SAE800 -> Conrad, Reichelt, Bausatz bei ELV

Des Weiteren:

Mit Voice-Recordern lassen sich kurze Audiosequenzen über ein Mikrofon aufnehmen und auf Befehl abspielen.

  • ISD25xx z. B. ISD2560 -> Reichelt
  • ISD17xx z. B. ISD1730 -> ?
  • ISD14xx z. B. ISD1416 -> Conrad
  • Beispiel aus Roboternetz.de

DTMF, Telefontönen

  • MT 8880 -> Conrad
  • MT 8870 -> Conrad
  • CM 8870

DDS-Tongeneratoren

  • AD 9850

Der Klassiker aus dem C64:

  • MOS 6581/SID 6581 C64-Soundchip -> eBay
  • SID-Emulator mit AVR
  • [1] Beitrag hier im Forum, SID an AVR

Für OEM-Kunden gibt es u.a. von Yamaha einige Chips zum Verbau in elektronischen Klangerzeugern, welche mit DSPs angesteuert werden können. Vereinzelt sind OPL- und FM-Chips im Markt verfügbar.

Sowohl für den SAB-Chip, den SID aus dem C64 und auch OPL-Chips gibt es eine Reihe unterschiedlicher Implementierungen in FPGAs und PLDs.

Manuelle Erzeugung von Tonfrequenzen

Im allgemeinen Fall, wenn ganz bestimmte Wellenformen wiedergegeben werden sollen, müssen diese vor der Ausgabe hinterlegt, oder erzeugt werden. Dazu gibt es unterschiedliche Methoden:

RAM-WAVE-Player

Mit einem Microcontroller kann eine zuvor in einem RAM gespeicherte Wertefolge durch einfaches Durchzählen ausgegeben und mit einer externen Elektronik in ein analoges Signal verwandelt werden. Die interne Wertefolge entspricht dabei direkt der Amplitude. Dabei werden entweder komplette Samples über einen Datenbus an einen AD-Wandler gesendet, oder eine 1-Bit Tonerzeugung mit nur einem digitalen PIN verwendet, der einen DSD-Datenstrom erzeugt. In beiden Fällen werden externe Filter benötigt.

DDS-Sinus

Ein konkretes Beispiel für eine solche direkte digitale Klangerzeugung ist das DDS-Verfahren, bei dem ein Sinus ausgeben wird. Auf der Basis dieses Verfahrens funktionieren die o.g. fertigen DDS-Chips.

modulierter Sinus

Für mehr Musikalität kann man z.B. im Flash eine Sinustabelle ablegen und je nach gewünschter Frequenz schneller oder langsamer abtasten, wobei die Frequenz moduliert wird. Somit erhält man einen quasi analogen Momentanwert der Amplitude als Vorgabe zur Bildung z.B. einer eines PWM-Signal. Damit und zusätzlich einem Tiefpass hat man Sinustöne variabler Frequenzen, die sehr schön rund klingen können, sofern die Abtastung fein genug und die Bildung der PWM schnell genug erfolgt. Mit etwas Rechenaufwand kann man noch Lautstärke-Hüllkurven aufmodulieren (AM) und somit glockenähnliche Sounds erzeugen.

rückgekoppelter RAM-WAVE-Player

In ein RAM wird einmalig eine beliebige Wertefolge geladen und danach zyklisch abgespielt. Dabei wird einer oder mehrere Ausgänge über einen EQ auf den Eingang zurückgeführt und ständig neues Samples berechnet. Typischerweise erhält man dann ein ausklingendes Tonfrequenzspektrum mit besonders schnell abklingenden Oberwellen. Ein Beispiel für eine Rückführung ist der Karplus-Strong-Algorithmus. Ein Beispiel für eine Mehrwegrückführung findet sich hier: https://www.mikrocontroller.net/topic/475337#new

Im Einzelfall können die Werte auch wie bei der synthetischen Klangerzeugung generisch erzeugt werden:

Wellenformerzeugung

PDM-EXOR-Dreiecksgenerator

Durch die Interferenz zweier 1-Bit-Rechtecksignale mit geringfügig unterschiedlicher Frequenz und multiplikativer Mischung mit XOR entsteht eine PDM, die nach Glättung am Ausgang ein Dreieck erzeugt. Beispiel: https://www.mikrocontroller.net/topic/434877#5144809

Sinusoszillator

Mit Hilfe eines rückgekoppelten IIR-Filters, kann ein selbstschwingender Oszillator programmiert werden. Die einfachste Version ergibt sich z.b. durch den Konstrukt: Wert4 = 0,9* Wert3 + (Wert3-Wert2)*1,4 - (Wert2-Wert1)/2 - ausgehend von den Initialwerten -1, 0 und 1. Die Periode liegt etwa bei 1/10 der Aktualisierungsfrequenz und ist damit für sehr langsame MCUs geeignet. Durch Variation der Werte lassen sich auch gedämpfte Schwingungen erzeugen. Beispiel: https://www.mikrocontroller.net/topic/324429#3778743

Binäre Wellenerzeugung

Ein einfacher Rechteck-Tongenerator lässt sich erzeugen, indem ein Integer-Wert periodisch um einen Inkrementalwert erhöht- und die höchsten Bits zur Tonausgabe genutzt werden. Je höher der Inkrementalwert, desto höher die Tonfrequenz. Dabei nimmt man in digitalen Schaltungen wie PLDs z.B. einen 32 Bit-Wert und inkrementiert mit einer Frequenz von z.B. 100MHz. Statt wie bei der DDS eine Tabelle anzusteuern, wird einfach das MSB ausgegeben. Eine Verbesserung ergibt sich, wenn man z.B. die höchsten 13 Bits interpretiert und über Y x (4095-Y) eine Parabel bildet und skaliert, wobei das MSB die negative Halbwelle anzeigt. Dies ergibt eine positive und negative Parabel. Diese ist sehr sparsam zu erzeugen und musikalisch gehaltvoller, als ein Sinus, da sie viel der zweiten Oberwelle enthält.

Für einen 8-Bit Microcontroller ließe sich folgende Version verwenden: Akkumulator = (Akkumulator + Inkrement) Modulo 65536, Step = Ganzzahl(Akkumulator/256), Halbwelle = Step x (255 - Step), Inkrement = 128 - Ganzzahl (Halbwelle / 256).

Tonausgabe

Die analoge Ausgangsspannung für den Verstärker und später den Lautsprecher bzw ein elektronikfreies Piezoelement kann außerhalb des Mikrocontrollers auf verschiedene Weise erzeugt werden:

Digital-Analog-Wandler

Mit einem DAC kann eine hochgenaue Ausgabe realisiert werden.

R2R-Netzwerk

Mit einem R2R-Netzwerk kann ein einfacher Wandler realisiert werden. Siehe Widerstandsnetzwerk, R2R-Netzwerk Samplerate direkt in der Ausgabe

Nach dem R2R folgt in der Regel ein OPV. Mit einem Kondensator in der Signalleitung kann dabei ein eventuell vorhandener Gleichspannungsanteil (DC-Offset) reduziert werden.

PWM

Die PWM eignet sich zur Ausgabe von Tönen über einen digitalen Pin. Für einigermaßen hochwertiges Audio wird eine schnell laufende PWM benötigt, d.h. der Controller wird schnell getaktet - z.B. mit 256facher Samplerate. Wenn Piezo zum Einsatz kommt, dann sollte mit 50% Duty-Cycle gearbeitet werden. Die Toggle-Frequenz entspricht der halben Tonhöhe (zwei mal Umschalten pro Periode).

Hardware

Piezo-Element

Piezo-Elemente sind einfach anzusteuern und als Buzzer/Summer von Reichelt, Conrad... erhältlich.

Es gibt hier zwei Typen:

  • Mit integrierter Elektronik; braucht nur mit Gleichspannung versorgt zu werden.
  • Ohne Elektronik; braucht eine Wechselspannung.

Die Piezo-Elemente haben eine Eigenresonanzfrequenz um 1,5 kHz ("Fiep"), und sind damit am lautesten. Fertige Module sind oft mit Resonanzkörper ausgestattet (Helmholtz-Resonator).

Piezo Elemente ohne integrierte Elektronik können direkt an die Pins eines AVR oder PIC angeschlossen werden. Um die Lautstärke zu erhöhen, kann man zwei Pins benutzen, die immer abwechselnd auf LOW bzw. HIGH gesetzt werden. Dadurch ergibt sich eine Wechselspannung um V_cc. (Prinzip der H-Brücke)

Bei selbsterregenden Elementen (die aus einer Gleichspannung ihre Frequenz selbst erzeugen) sollte man auf die Daten achten. Im Allgemeinen brauchen kleine Module aber auch nur einige mA.

Lautsprecher

Meistens liefert eine Direktbeschaltung der Ausgangsstufe an einem Mikrocontroller nicht genügend Leistung. Um Lautsprecher an einem µC betreiben zu können, bedarf es daher oft eines Verstärkers, da die Portpins des µC i.d.R. nur wenige mA Strom vertragen (Datenblatt!). Bereits eine einfache Treiberstufe kann aber Abhilfe schaffen:

Pwm-wandler.svg

Die 20Ω Widerstand/ 4,7 µF Kondensator Kombination als Tiefpass reduziert die hohen Frequenzen des PWM-Signals im Audiosignal. Noch besser ist eine zusätzliche Drossel im Ausgangszweig. Durch Verringern des Ausgangswiderstandes kann noch etwas mehr Leistung herausgeholt werden. Wichtig ist das Verständnis, dass bei dieser Schaltung das digitale Signal verstärkt wird, um es erst nach der Verstärkung zu filtern, was sich dazu eignet, Strom und damit Leistung zu sparen. Für geringe Leistungen ist es allerdings besser, die Filterung vor den Verstärker zu setzen und diesen im AB-Modus zu fahren, um zu einer besseren Qualität zu gelangen.

Klanggestaltung

Ein weit unterschätzter Punkt ist die Gestaltung des Klanges im Bezug auf seinen Informationsgehalt. Viele Töne in Geräten drücken nicht das aus, was sie eigentlich ausdrücken sollten. Warntöne z.B. sollten deutlich wahrnehmbar sein, Meldungen und Bestätigungen dagegen eher beruhigend und keinesfalls aggressiv. Statische und gleichbleibend laute Töne sind zu vermeiden. Wirksame Töne, die dennoch nicht erschrecken, erzeugt man z.B. mit einer ansteigenden Lautstärke. Gut wahrnehmbar sind Töne mit grosser Bandbreite, die also aus mehreren Einzeltönen auf unterschiedlichen Oktaven bestehen. Weiche Töne wiederum erzeugt man mit einem nicht zu komplexen Gong-Ton, mit limitierter Anstiegszeit von minimal 20ms und einer Ausklingzeit von wenigstens 1s.

Es ist auch wichtig zu verstehen, daß bei realen Klängen die Amplituden, Frequenz und Phase in einem natürlichen Zusammenhang stehen und sich gleichmäßig ändern müssen, um nicht langweilig und steril zu klingen. Diese Effekte sind nur bei richtig nachgebildten Oszillatoren korrekt und z.B. mit starrem Vibrato oder Tremolo nur unzureichend nachzubilden. Ein natürlicher Klang ist daher kein mathematischer Sinus sondern eine sich permanent ändernde Welle mit Offset, Phasenänderung und Amplitudenänderung, die sich aufgrund des durch äußere Einflüsse gestörten Oszillators einstellt.

Unnötige Töne bei elektrischen Geräten sind gänzlich zu vermeiden, weil sie zu einer Abstumpfung im Gehör führen und wichtige Töne dann nicht mehr wahrgenommen werden.

Artikel

Weblinks

(TODO: Sichten und den verschiedenen Methoden zuordnen)