kurzes Audiosignal erzeugen

OP #574043
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?
Gast #574067
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 !
OP #574096
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?
Gast #574385
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)
OP #575003
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?
Gast #575176
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 :-)
Gast #575181
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.
Gast #575422
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.
OP #579842
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
Angehängte Dateien:
Gast #580114
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 !
Gast #580598
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.
(Firma: keine) #580890
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?
OP #581367
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
OP #582571
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.
Angehängte Dateien:
OP #582891
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?
Gast #583005
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 ....
Gast #583007
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.
Gast #583008
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
Gast #583011
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...
OP #583022
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?
Angehängte Dateien:
Gast #583039
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.
Gast #698027
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren