Forum: Mikrocontroller und Digitale Elektronik kurzes Audiosignal erzeugen


von Johannes R. (jor)


Lesenswert?

Hallo alle zusammen!
Ich habe folgendes Problem:
Ich muss für einen Wecker ein etwa 10 s langes Audiosignal erzeugen. Da 
das ganze in drei Wochen fertig sein sollte habe ich nicht viel Zeit zum 
rumprobieren. Am liebsten wäre mir ein Komplettbaustein, den ich als 
Privatmann auch bekomme. Die Kosten sind dabei nicht so wichtig.

Falls es so etwas (Komplettbaustein) nicht gibt... Habe ich mir gedacht 
das Audiosignal über PWM und Tiefpassfilter an einem ATMega zu erzeugen. 
Ist so etwas qualitätiv akzeptabel? Abgespielt werden sollte eine 
Pfeifmelodie (die hören sich ja recht schnell beschissen an wenn die 
Qualität nicht stimmt).
Besser wäre natürlich ein DA-Wandler (woher? den TDA gibt es nicht mehr 
bei Reichelt).

Zur Größe der Rohdaten eines 10s langen Audiosignals. Bei einer 
Samplerate von 44100Hz und der maximalen Auflösung des PWMs von 16bit 
gilt ja dann:
10  44100  16 = 7056000 (bit) = 816 (kb)

gibts da einen einfachen codec zum komprimieren oder ist die samplerate 
maßlos übertrieben?


Mein anderes Problem ist, dass ich ca. 140 LEDS ansteuern muss. Ich hab 
da jetzt mal 3 MAX7221 genommen weil ich dachte, dass mir die Zeit nicht 
reichen wird. Könnt Ihr aus Erfahrung sagen, dass es eher probleme gibt 
bei dem selbstbau einer LED-Matrix (ohne MAX7221; aber mit 
Helligkeitssteuerung) oder klappt das meist relativ problemlos?

von antworter (Gast)


Lesenswert?

>>Pfeifmelodie

Die maximale Tonhöhe bestimmt die Samplefrequenz:

fsample >= fmax*2

Z.B: Höchste Frequenz 2 kHZ -> Samplefrequenz muß mindestens 4 kHz sein


Nebenbei: "Pfeifen" ist einem Sinus ziemlich ähnlich - da reicht meist 
eine relativ geringe obere Grenzfrequenz.


Ach ja... für einen Pfeifton braucht man sicher keine 16 Bit !

von Johannes R. (jor)


Lesenswert?

danke für die schnelle Antwort...
Nach deinem Post kam ich auf die schlaue (ironisch) Idee und hab das mal 
ausprobiert. In meinem Program zur Audiobearbeitung kann ich die 
Auflösung nur auf 8 oder 16 Bit stellen. Da hörte man bei 8 Bit schon 
einen deutlichen unterschied!
Die Samplerate sollte bei 11025 liegen...

kennt jemand ein Programm mit dem man die Auflösung auch auf 10, 12 bit 
stellen kann?

von Florian (Gast)


Lesenswert?

Dumme aber relativ einfach Idee:

Man nehme einen Speicherbaustein (Flash oder EPROM) und einen genügend 
langen Zähler. Zähler anwerfen, Daten über R2R und Kondensator wandeln 
--- fertig.

von Peter D. (peda)


Lesenswert?

Als MP3 abspeichern und nen AT89C51SND1 nehmen.


Peter

von Florian (Gast)


Lesenswert?

Was ist denn mit so etwas hier?
http://www.conrad.de/goto.php?artikel=130017

von antworter (Gast)


Lesenswert?

>In meinem Program zur Audiobearbeitung kann ich die
>Auflösung nur auf 8 oder 16 Bit stellen. Da hörte man bei 8 Bit schon
>einen deutlichen unterschied!

Bei einem Pfeifton mit vollem Pegel ? ...glaube ich nicht...

(bei einem komplexen Audiosignal würde ich es glauben)

von Bockwurst (Gast)


Lesenswert?

guck doch mal hier:
http://s-huehn.de/elektronik/bbgong/bbgong.htm
Da wird das Signal in EEPROMS abgespeichert.

von Johannes R. (jor)


Lesenswert?

zu Peter:
so etwas wäre mir natürlich am liebsten. Weißt du wo ich so einen 
baustein beziehen kann? Wie sieht es mit der programmierung aus?

zu Florian:
ich glaube bei dieser lösung scheitert es an der qualität

zu antworter:
ich kann nicht mehr machen als es auszuprobieren. Kann mir vorstellen, 
dass wichtige obertöne verloren gehen...

zu Bockwurst:
genau so etwas habe ich gesucht! Vielen Dank. Etwas ärgerlich ist der 
nicht vorhandene Programmieradapter. Aber das lässt sich eventuell noch 
regeln :-)

hat noch jemand Erfahrungen wegen der LED Matrix?

von antworter (Gast)


Lesenswert?

>ich kann nicht mehr machen als es auszuprobieren. Kann mir vorstellen,
>dass wichtige obertöne verloren gehen...

Naja, man muß halt schauen, wie Dein ominöser Preifton aussieht...

Auf jeden Fall, kann man meist etwas tricksen, wenn die Qualität nicht 
zufriedenstellend ist:

(1) Einen 8-Bit Flash-DAC benutzen, und diesen mit einem PWM-Fenster 
betreiben. Idee: PWM schaltet normalerweise immer zwischen 0 und 1 und 
generiert dazwischenliegenden Spannungen. Mit der gleichen Methode kann 
man Zwischenwerte auf einem DAC ausgeben.
Dadurch kannst Du die Auflösung des DACs erhöhen (allerdings auf Kosten 
der Samplefrequenz). Filtern ist dann wie bei der "normalen" PWM 
Pflicht.

(2) Wenn Dein Sample keine starken Wertesprünge besitzt (im Gegensatz zu 
einem Rechtecksignal z.B.), kannst Du Deine Sample-Werte differentiell 
abspeichern (immer nur die Differenz zum nächsten Sample) - das spart 
Speicherplatz.

(3) ....was immer die Kreativität sonst noch hervorbringt...


Auf jeden Fall muß es nicht immer gleich mp3 sein :-)

von Florian (Gast)


Lesenswert?

Die Eprom-Lösung hatte ich ja auch schon vorgeschlagen. Vermutlich wäre 
es allerdings gegenüber der Lösung von Bockwurst tatsächlich einfacher 
(bzw. kostengünstiger), einen TTL-Zähler zu verwenden.

von Der Dude (Gast)


Lesenswert?

Schau doch mal auf

http://web.telia.com/~u85920178/eprom/wave_00.htm

wie ein Vorredner schon beschreiben hat, EPROM + Zähler. Zusätzlich wird 
erklärt, wie man win .wav in den EPROM bringen muss.

von eProfi (Gast)


Lesenswert?

evtl. kann man das Signal auch errechnen.
Kannst Du mal das Geräusch hier posten?
Habe z.B. schon mal das Läuten der alten W48-Telefone (die mit den 2 
großen Schellen drin) durch on-time-Berechnen erzeugt, klingt ganz 
akzeptabel.

Im AVR-Butterfly sind auch zwei Pfiffe drin, die über PWM ausgegeben 
werden, aber naja, die Qualtät könnte besser sein.

von Johannes R. (jor)


Angehängte Dateien:

Lesenswert?

Hallo,
ich war noch kurzfristig im Urlaub. Im Anhang hab ich jetzt auch mal das 
Signal mit hochgeladen in der Qualität wie ich sie auch bei meinem 
Wecker benutzen will. Das Signal sieht sehr gleichmäßig aus jedoch kann 
ich mir nicht vorstellen, dass eine on-time Berechnung nötig ist (man 
beachte auch den Beginn des Anpfiffes welcher sich anders anhört als der 
rest).

Ich habe bei Reichelt jetzt noch den LTC1257 gefunden. Das ist ein 12 
bit DAC mit I2C-Schnittstelle. Ich habe mir überlegt eventuell auch 
diesen zu benutzen um das Analogsignal zu erzeugen.

Werde heute einmal versuchen einen Ton mit dem PWM zu erzeugen. Was für 
einen OP würdet Ihr eigentlich hinter diesen DAC setzen? Ich habe nur 
+5V und GND.

MfG
Jo

von antworter (Gast)


Lesenswert?

Na das sieht doch schön sinusförmig aus !

Du könntest ja versuchen, den Grundton eines Pfeiftones mittels einer 
Sinustabelle zu erzeugen, und nur die Differenz zum eigentlichen Ton 
abzuspeichern.
Du rekonstruierst den Pfeifton also aus seinem Grundton und seinen 
"Charakteristika".

Dann hättest Du selbst bei hoher Auflösung nur kleine Werte (z.B. 8 Bit 
Werte trotz 16-Bit Auflösung) - das spart Speicherplatz...


Wenn Dir der Gedanke zusagt, kannst Du ja mal nach DDS (Methode) hier im 
Forum suchen - da sollte irgendwo erläutert werden, wie Du mit 
Festkommaarithmetik ein Sinussignal mit variabler Frequenz erzeugst.

Solltest Du hier nicht fündig werden, könntest Du ja mal nach "DSP DDS" 
googeln - da findet sich bestimmt eine schöne Erklärung.



Gutes Gelingen !

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

VIeleicht findest noch nen alten/defekten Digitalen Anrufbeantworter 
(solche biligteile von Aldi) die habe meist nen Chip der die Anzage auf 
nem SRAM speichert eingebaut.

von Tobias P. (hubertus)


Lesenswert?

@Johannes:
Wenn du +5V hast und GND, dann wäre als OP ein Single-Supply (oder auch 
Rail-to-Rail) Typ keine schlechte Idee. (Wozu braucht's einen OP?)
Ich kenne da z.B. den TLC272 von TI.

von Thomas S. (Gast)


Lesenswert?

Nimm doch einfach nen ISD1420 P. Das ist ein Baustein, der ein 
Analogsignal speichern kann (analoge EEPROM-Zellen). Das Ding gibts bei 
Conrad, hat ein DIL Gehäuse und ich hab das Ding seit Jahren in einer 
"Quaaaak" Anwendung drinne und läuft bestens.

von antworter (Gast)


Lesenswert?

>Nimm doch einfach nen ISD1420

14,40€ ist schon happig... für 2.6 kHz fmax (6.4 kHz fsample)

Da kommt man mit selber bauen billiger (und) weiter

von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

bin im besitz des pollin boards!es gibt ja nun theoretisch 2 
möglichkeiten ein audiosignal zu erzeugen oder?einmal mittels einer 
mebram die direkt über einen digitalen I/O angeschlossen wird und die 
ich durch ständiges schnelles wechseln des zustandes (1,0,1,0,..) zum 
schwingen anrege und einmal mittels DAC oder?

von Johannes R. (jor)


Lesenswert?

also ich hab mir jetzt mal eine kleine prototyping-plattform aufgebaut 
hier und mache die ersten tests. Bis jetzt noch kein richtiges ergebnis 
aber die ersten töne kommen schon ^_^

zu Benjamin Moll:
ja da würde ich dir so zustimmen. Die dritte ist über komplettbausteine 
die gleich das fertige audiosignal ausgeben. aber da kommt man 
anscheinend an keins. Im Wiki gibts nen artikel der heisst AVR Audio vl 
ganz interessant

von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

wie werden denn bei der DAC methode die membran angesteuert?

von antworter (Gast)


Lesenswert?

Der DAC macht die Wandlung

   Digitaler Wert -> Analoge Spannung

Die analoge Spannung lenkt dann die Membran aus.

von Peterle A. (Firma: keine) (wanderameise)


Lesenswert?

antworter wrote:
> Der DAC macht die Wandlung
>
>    Digitaler Wert -> Analoge Spannung
>
> Die analoge Spannung lenkt dann die Membran aus.

ja aber wie?und wie beeinflussen unterschiedliche spannungen die mebram?

von antworter (Gast)


Lesenswert?

Ist das jetzt ein Witz ?

Wenn nein:

http://de.wikipedia.org/wiki/Lautsprecher

von Johannes R. (jor)


Angehängte Dateien:

Lesenswert?

also ich hab jetzt mal versucht einen Sinuston über den PWM eines 
ATMega8 zu erzeugen. Es hört sich bis jetzt noch nicht ganz 
sinustonartig an. Ich habe deshalb mal den LineIn-EIngang meiner 
OnBoard-Soundkarte benutzt um das Signal anzuschauen. Im Anhang sieht 
ihr das ergebnis. - Beschissen!
Also ich muss jetzt mal nach einem fehler suchen weil das sieht nicht so 
ganz analog aus...

vl ist noch zu sagen das der Ausschnitt oben ungefähr ~14ms dauert.

falls jemand mitsuchen will der Code sieht bis jetzt so aus (nur ein 
Codeausschnitt aber das wichtigste ist drin):
1
// SineTable
2
const uint16_t SineTable[256] = {512,525,537,550,562,575,587,600,612,625,...};
3
4
...
5
6
//Initialisierung PWM
7
TCCR1B =  (1<<WGM12) | (1<<CS10);
8
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM11)| (1<<WGM10);
9
OCR1A = 1020;
10
11
...
12
13
while (1) {
14
  for(i=0;i<256; i++) {
15
    OCR1A = SineTable[i];
16
    asm volatile ("nop");
17
    asm volatile ("nop");
18
    asm volatile ("nop");
19
  }
20
21
}

zur Hardware:
Pwm signal geht über einen Tiefpass mit C=100n und R = 700 OHM. D.H fg = 
2300Hz. Der Atmega8 hat eine Taktfrequenz von 1 MHz.

von Johannes R. (jor)


Angehängte Dateien:

Lesenswert?

wenn ich die for-Schleife folgendermaßen gestalte kommt was lustiges 
dabei raus. Im Anhang befindet sich das Ergebnis. Das ganze dauert jetzt 
knapp 3s.
1
for(i=0;i<256; i++) {
2
  OCR1A = SineTable[i];
3
  _delay_ms(1);
4
}

von Johannes R. (jor)


Lesenswert?

gut ich schlaumeier habs jetzt woran das liegt. der Timer zählt ja bis 
65000. Bei 8 MHz dauert das ganze knapp 1 ms. also damit kann ich 
niemals analoge spannungen mit eienr samplerate von 11025 Hz erzeugen. 
oder habe ich gerade einen Denkfehler? mit dem 8bit timer kann man kein 
PWM erzeugen oder?

von antworter (Gast)


Lesenswert?

>mit dem 8bit timer kann man kein
>PWM erzeugen oder?


...wetten daß...

von antworter (Gast)


Lesenswert?

(aus dem Inhaltsverzeichnis meines Datenblattes)

8-bit Timer/Counter2 with PWM and Asynchronous Operation .. 104

von Johannes R. (jor)


Angehängte Dateien:

Lesenswert?

shit des hab ich übersehen. sorry

naja jetzt klappts wunderbar nur ist die Qualität für einen Pfeifton zu 
schlecht! Meint Ihr das wird mit 12 bit DAC (Reichelt LTC1257) viel 
besser? Weil wenn nein dann würde ich es vermutlich mit dem besonderen 
Weckton lassen.

Im Anhang sieht ihr die Ergebnisse.

von Johannes R. (jor)


Angehängte Dateien:

Lesenswert?

hier noch als MP3

von antworter (Gast)


Lesenswert?

Man bekommt schon einen sauberen Sinus hin, wenn man mit einem 
ordentlich dimensionierte Tiefpaß das PWM-Signal filter - allerdings 
dürfte für Deinen Pfeifton eine gewisse Verzerrung sogar wünschenswert 
sein.

Kurzum: Jetzt ist der Punkt erreicht, an dem man seinen Ideen freien 
Lauf lassen, und sich austoben kann :-)


Ideen z.B.: Rauschen reinmischen, ADSR Kurven für die Amplitude ....

von antworter (Gast)


Lesenswert?

P.S.: Glückwunsch zum bisherigen Erfolg :-)

von Fly (Gast)


Lesenswert?

nö.... nix Rauschen beimischen
Du brauchst einen TP höherer Ordner und / oder eine höhere 
Samplingfrequenz.
Mach mal RC TP 3. Ordnung (danach OPV) und erhöhe die Samplingfrequenz 
so hoch es geht.

von antworter (Gast)


Lesenswert?

>nö.... nix Rauschen beimischen

Er will keinen Sinus, sondern einen Pfeifton - dieser enthält aufgrund 
von Luftverwirbelungen, die beim Pfeifen entstehen, Rauschen.

Also doch: Rauschen beimischen

von Fly (Gast)


Lesenswert?

okay, schon möglich. Er wird es trotzdem nicht hinkriegen. Ich habe da 
auch schon endlos geübt. mit Fs = 2x FSignal wird das nie was. Es geht 
zwar theoretisch praktisch mathematisch... Aber dazu müsste man ideale 
Filter haben. Nicht umsonst arbeiten Audiocodecs mit mind. 64x 
Oversampling (die guten mit 1024x). Dadurch werden die Filter 
primitiv...

von antworter (Gast)


Lesenswert?

>mit Fs = 2x FSignal wird das nie was. Es geht
>zwar theoretisch praktisch mathematisch...

Was soll dank Nyquist nicht gehen ?

von Fly (Gast)


Lesenswert?

Nyquist besagt, dass man ein Signal fs, welches mit 2x fs gesampelt 
wurde, wieder rekonstruiert werden kann, wenn man ideale Filter hat.

von Johannes R. (jor)


Angehängte Dateien:

Lesenswert?

vielen Dank für die Hilfestellungen.

würdet ihr jetzt auf gar keinen Fall die rohdaten abspeichern? Also wenn 
ich die Samplerate erhöhe dann bekomme ich sehr schöne ergebnisse wie 
ihr im Anhang sieht. Aber dann reicht mir der Speicherplatz auf gar 
keinen Fall. Und wie genau füge ich Rauschen hinzu?
So wie ich den Sinus als Array habe einen Raschenarray und den addieren?

von Jupp M. (juppp)


Lesenswert?

Reicht es nicht, wenn du einfach nur ein paar Perioden abspeicherst und 
diese dann in einer Schleife abspielst? Alternativ kleines SPI-EEPROM 
nehmen, die sind ja nicht teuer.

von Fly (Gast)


Lesenswert?

Glückwunsch, das sieht schon ganz ordentlich aus. So wie ich es erwartet 
habe :)
Ich würde deinen Wunschpfeifton mal per PC generieren und im Wav-Raw 
Format abspeichern. Eine Periode sollte rechen. Die Raw-Daten musst du 
dann in den uC bringen.

von Fly (Gast)


Lesenswert?

Beitrag "MegaLOL"

vielleicht kannst du dir da was abkupfern :) Er hat im Sound.h die 
Raw-Daten drin und spielt die ab. In deinem Fall wäre das die Daten 
einer Periode.

von oberallgeier (Gast)


Lesenswert?

Hei Johannes,

bin heute über Deinen Thread gestolpert - weil ich einem AVR so wie Du 
das Pfeifen beibringen möchte (na ja, der tiny13 wirds nicht können, 
aber ein ATMega16, 32 oder so sollte das ja hinkriegen). Könntest Du mir 
bitte sagen, wie Du diesen Ton gemacht hast? Wie hast Du die PWM 
programmiert? Offenbar hast Du das mit der PWM hinbekommen und noch mit 
ein paar elektronischen Bauelementen !?!?!? Als Maschinenbauer 
(chemische Apparate) bin ich mit Nyquist und Tiefpass und codec nicht 
sooo firm. Also ich weiss, wie man das schreibt - aber das ist dann so 
ungefähr das Ende meines Wissens :(

Würde mich über eine Antwort von Dir freuen

von testaccount (Gast)


Lesenswert?

Vll auch nur die Tonlängen +Tonhöhen speichern und das entsprechend dann 
ausgeben

Vll auch mit Interrupts arbeiten!

...

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.