ich habe einen Dimmer mit einem Atmel-µC gebaut - funktioniert schon ganz gut...
Jetzt möchte ich über (menschliches) Pfeifen die Helligkeit einstellen - man pfeift auf einer bestimmten Frequenz, und das Licht wird heller und umgekehrt...
Realisieren würde ich das Ganze mit einer FFT (z.B. den ASM-Code von
formatting link
und einem Mikrofon am Atmel.
Jetzt gehts schon los - welches Mikrofon nehme ich dafür und wie verbinde ich es mit dem Atmel? Brauche ich dazu irgendwelche Verstärker bzw. muss ich das Signal erst aufbereiten für den ADC?
Die Erkennung des Pfeifens sollte innerhalb eines 30qm-Raums problemlos erfolgen können...
Ja, du brauchst sowieso einen Verstärker. Und den kann man dann auch gleich als Bandpaß auslegen, so daß er nur den Frequenzbereich des Pfeifens nennenswert verstärkt. Das erhöht nicht nur die Zuverlässigkeit und mögliche Empfindlichkeit des Gesamtsystems ungemein, sondern erspart auch die FFT. Es reicht dann einfache Messung der Periodendauer, z.B. über eingebauten Analogkomparator und Capturefunktion des Timers.
Das hab ich mir auch schon überlegt...aber ich würde gerne auf verschiedene Frequenzen reagieren können, auf ansteigende, abfallende usw. und da wird es mit (einem) Bandpass schwierig...
Was mich interessieren würde - wie kann ich eine Art Automatic Gain Control machen, so dass (z.B. nachts) leises Pfeifen genauso erkannt wird wie lauteres Pfeifen wenn z.B. gleichzeitig eine DVD mitläuft...
Natürlich. Du brauchst dazu nur einen zweiten, gleichartig aufgebauten Verstärker. Diesmal ohne Bandpaß, dafür mit nachfolgender Gleichrichtung und Integrierglied. Das entstehende Signal benutzt du als Referenzspannung für den Analogkomparator des Atmel.
Also Dual-OpAmp, ein bissel Hühnerfutter dazu und fertig ist der Kram.
| Realisieren würde ich das Ganze mit einer FFT (z.B. den ASM-Code von |
formatting link
und einem Mikrofon am Atmel.
Ich möchte mal eben in die Runde fragen, ob man sich sowas überhaupt mit einem AVR vorstellen kann. Immerhin sind die Dinger maximal mit 16MHz getaktet und ich kann mir nicht vorstellen, dass FFT mit 8bit auskommt. Breitere Berechnungen erfordern dann auch deutlich mehr Taktzyklen.
Also ich kann es schwer einschätzen, deshalb frage ich, aber würdet ihr nicht sagen, dass für so einen Zweck ein DSP geeigneter ist? Oder geht das mit dem Atmel, dann würde mich aber interessieren, wieviel der dann noch nebenher leisten kann.
Grüße!
P.S.: Wenn ich das jetzt mal ganz dämlich überschlage: f_max=8kHz (schon sehr tief), f_abtast>=16kHz. Taktfrequenz ist 16MHz. D.h. zwischen den Samples liegen max. 1.000 Taktzyklen für die FFT und alles andere.
Die FFT-Routine von elm-chan.org arbeitet mit 16 bit Datenbreite.
hr
Die erw=E4hnte FFT l=E4uft auf dem ATmega und man kann damit im NF-Bereich (zumindest bei Sprachfrequenzen) gut arbeiten.
Die eigentliche FFT-Routine ist in Assembler geschrieben. Man kann die FFT mit 64, 128, 256 und 512 Punkten laufen lassen. Der Verfasser dieser FFT-Routine hat einige Messungen gemacht bez=FCglich der Rechengeschwindigkeit (nachfolgend zitiert aus "ffft.s"):
Die FFT-Beispielprogramme von elm-chan.org sind zun=E4chst mal nicht echtzeitgeeignet, wenn ich das richtig sehe. Aber man kann problemlos das Einsamplen im Timerinterrupt kontinuierlich wechselweise auf zwei Sampling-Puffer machen. Immer wenn ein Puffer voll ist, wird dann in der Hauptroutine die FFT angeworfen und auf den vollen Puffer angesetzt, w=E4hrend der Timerintterrupt regelm=E4=DFig die FFT unterbricht, um den anderen Puffer zu f=FCllen. Bei einer Abtastfrequenz von 16 kHz und einer 64-Punkte-FFT auf einem ATmega mit 16 MHz bleibt dann allerdings gerade noch knapp 5% Rechen- zeit (ca. 0,7 MIPS) =FCbrig f=FCr "andere" Dinge, sprich die Haupt- applikation. Doch das reicht in vielen F=E4llen. Wenn mehr Rechen- leistung ben=F6tigt wird, hat man verschiedene M=F6glichkeiten:
- Samplingfrequenz verringern (am effektivsten),
- nur einen Teil der Ausgangs-Daten bzw. des errechneten Spektrums verarbeiten - die Umrechnung von real/imagin=E4r auf Leistung- spektrumswerte kostet immerhin ca. 1/4 der gesamten Rechenzeit der FFT-Implementation),
- oder den ATmega =FCbertakten, wobei bei 18MHz (ein wohl noch problemloser Wert) dann schon ca. 2,4 MIPS "=FCbrig" bleiben (alles bezogen auf die o.g. Parameter). Will man eine echtzeitf=E4hige 256- oder 512-Punkte-FFT machen, wird man wohl mit der Samplingfrequenz noch etwas runtergehen m=FCssen, wenn man nicht gnadenlos =FCbertakten m=F6chte. Mit 12 kHz Samplingfrequenz d=FCrften bei einer 512-Punkte-FFT =FCberschlagsm=E4=DFig so um die 10% Rechenleistung =FCbrig bleiben.
Hab mich noch nie mit den Innereien der FFT beschäftigt... Kann man evtl. zusätzlich Rechenzeit sparen, indem man Werte in den Frequenz- bereichen, die einen ohnehin nicht interessieren, erst gar nicht berechnet?
"Spektakulärer", aber nicht völlig unpraktikabel sind sprecherunabhängige Einzelworterkennungssysteme für sehr kleine Wortschätze auf Singlechip-Controllern. Der erste war der VRC008:
formatting link
Erhältlicher der VCP200:
formatting link
Beide Texte haben noch kleinere Fehler.
Mit Spracherkennungs-ICs selbst bei zero-crossing-Signal nichtnur wegen wegen Dynamik sondern auch wegen Verhallung schwierig.
Einfach den Verstärker so weit übersteuern, dass man richtig senkrechte Flanken bekommt. (Eine E-Gitarre macht es beim Verzerrer kaum anders) Das Signal kommt dann an einen Digitalport und löst Interrupts bei einer Flanke aus (egal welche). Dann nimmst du vom
16Bit Timer nur den Unterschied zur letzten Flanke und hast damit eine Periodendauer und mit 1/Periodendauer eine Frequenz.
Damit Rauschen nicht als Frequenz interpretiert wird, sammel einfach 16 Werte oder so und reagier in der Software nur darauf, wenn sie sich ähneln. Wenn sie sich _nicht_ stark ähneln ist es wohl kein Pfeifen.
Damit Netzbrumm nicht als Pfeifen erkannt wird nimm eine Mindestfrequenz.
Mit dem totalen übersteuern ist auch dein "automatic Gain" gelöst.
Das geht leider nur, wenn es im Raum absolut ruhig ist...mit FFT ist es egal wie laut es ist, das Pfeifen muss nur lauter als die anderen Frequenzen sein.
Es funktioniert auch schon mehr als zufriedenstellend!
wie laut es ist, das Pfeifen muss nur lauter als die
Dann verstehe ich nicht warum/was du gefragt hast. Ist dein einziges Problem wirklich nur der Mikrofonverstärker? Wenn du ernsthaft mit einer FFT/DFT sowas detektierst, dann ist die Verstärkung doch ganz egal. Und Bandpässe auch. Weil du in der FFT alle Frequenzen die du nicht haben willst wegnullen kannst.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.