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?
>>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 !
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?
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.
>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)
guck doch mal hier: http://s-huehn.de/elektronik/bbgong/bbgong.htm Da wird das Signal in EEPROMS abgespeichert.
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?
>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 :-)
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.
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.
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.
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
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 !
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.
@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.
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.
>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
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?
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
Der DAC macht die Wandlung Digitaler Wert -> Analoge Spannung Die analoge Spannung lenkt dann die Membran aus.
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?
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.
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 | }
|
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?
>mit dem 8bit timer kann man kein >PWM erzeugen oder? ...wetten daß...
(aus dem Inhaltsverzeichnis meines Datenblattes) 8-bit Timer/Counter2 with PWM and Asynchronous Operation .. 104
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.
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 ....
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.
>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
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...
>mit Fs = 2x FSignal wird das nie was. Es geht >zwar theoretisch praktisch mathematisch... Was soll dank Nyquist nicht gehen ?
Nyquist besagt, dass man ein Signal fs, welches mit 2x fs gesampelt wurde, wieder rekonstruiert werden kann, wenn man ideale Filter hat.
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?
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.