Ein kleines Modul das auf einem mega32 eine FFT von einem Audio-Signal berechnet. Das Spektrum wird ca. 30 Mal/s aktualisiert und lässt sich über TWI auslesen. Bin jetzt zu müde um hier noch einen ausführlichen Text reinzustellen. Eine lange Beschreibung gibs auf meiner Homepage. Siehe auch den Thread im Elektronik-Board: http://www.mikrocontroller.net/forum/read-1-139739.html Ich hab meine Version jetzt mal soweit fertig gemacht, das man das ganze auch andern Leuten zumuten kann :) <werbung> Beschreibung, Schaltplan, Firmware, Video und Fotos gibts auf meiner Homepage: http://www.apetech.de/article.php?artId=7&nnId=17 </werbung>
Hier eine weitere Version des Spektrum Analysers, die auf dem selben FFT Code basiert, aber statt eines LCDs eine 32x16 LED Matrix verwendet.
Hier noch eine leicht verbesserte Version des FFT Codes: Es gibt nun keine Abstürze mehr bei starkem Eingangssignal, und auch das Flimmern in der untersten Zeile ist reduziert.
@Benedikt Ich habe leider keine Ahnung von FFT. Ist der Aufwand eine bestimmte Frequenz z.B.1750Hz +- 20Hz aus einem Frequenzgemisch zu detektieren noch größer?
Der Aufwand ist nicht größer, aber dafür gibt es einfachere und effektivere Lösungen (z.B. IIR oder FIR Filter)
Hast du einen Link in dem so was beschrieben ist ohne das man Kenntnisse in höherer Mathematik habe muss?
Ich weiß zwar wie man FFT und Co verwendet, habe aber leider nicht die geringste Anhnung wie das funktioniert. Meistens bekomme ich nach der ersten (von mindestens 10 Seiten Erklärung) Kopfschmerzen und lasse es sein, zu verstehen wie das funktioniert.
@benedikt: hehe, deine erklärung der fft-problematik gefällt mir :-)) kommt meinem standpunkt ziemlich nahe dran :))) ansonsten respekt @ape und @benedikt für die beeindruckende leistung, sieht echt elegant aus im vergleich zur konventionellen methode (mit xxx-bandpass-filtern)!
Die fft ist relativ komplex, da sie die einzelnen berechnungen so zu sagen kuerzt. Man braucht nicht das vielfache einer frequenz nochmals zu berechnen. Fuer erklaerung ist die DFT (diskrette fourier transf. ) einfacher. jedoch braucht man das ganze umkehren fuer den anfang. Wenn ich also einen sinus mit einer bestimmten frequenz erzeugen moechte, muss ich anhand der vorhandenen sampling frequenz und meine moechte frequenz, genuegend punkte zu haben um einen schoenen sinus zu erzeugen. Anderes gesagt, mit zahlen,wenn ich eine sampling F von 10000 habe und moechte 1000 hz, muss der ganze sinus innerhalb von 10 punkten durchlaufen. Um jedoch diese frequenz nachzuweisen, muss ich alle moeglichen frequenzen von meinem signal subtrahieren. Dh. fuer eine 256 punkt fft/dft muss ich alle moeglichen 256 frequenzen den sinus fuer die entsprechenden frequenz mitlauffen lassen und an der entprechenden stelle bzw. tabelle dazu addieren. Leider braucht dies bei dft mit 256 punkten alle 256 frequenzen durchlauffen lassen 65536 mal multiplikation und addition... Da kommt aber die fft zu hilfe, denn man braucht zb. fuer die frequenz X zwar den sinus zu berechnen, aber alle geraden vielfachen also 2X , 4X etc. kann man mitberuecksichtigen. Dadurch muss man nicht so viele multiplikation rechnen. Leider ist die ganze sache noch komplexer, den ein sinus bestimter frequenz in einem song, faengt nicht dort an wo mein sinus von der fft/dft anfangt (phasen verschiebung). also braucht das ganze noch einen imaginaeren anteil und cosinus um das signal wieder herstellen zu koennen. oder mit anderen worten noch mehr rechnen... hier der dft core: m ist anzahl punkte. dir richtung. x1,y1 input x2,y2 ouput btw. x2[0],y2[0] ist der DC anteil
1 | for (i=0;i<m;i++) { |
2 | x2[i] = 0.0; |
3 | y2[i] = 0.0; |
4 | arg = - dir * 2.0 * 3.141592654 * (double)i / (double)m; |
5 | /* teilung fuer die F i/m , dies macht die folgende schleife einfacher */
|
6 | |
7 | for (k=0;k<m;k++) { |
8 | double a=k*arg; |
9 | cosarg = cos(a); |
10 | sinarg = sin(a); |
11 | |
12 | x2[i] += (x1[k] * cosarg - y1[k] * sinarg); |
13 | y2[i] += (x1[k] * sinarg + y1[k] * cosarg); |
14 | /* addiere den anteil zum output */
|
15 | /* wie man sieht, wird dies fuer jeden eingang punkt gerechnet */
|
16 | /* dh. ist diese frequenz vorhanden mit der addition weiss man */
|
17 | /* nicht nur ob, sondern auch die amplitude */
|
18 | |
19 | }
|
20 | }
|
Auch eine Frage ? Hat schon jemand die FFT auch ins gcc portiert ? gruss roman
Hallo, Eine FFT direkt in C ist wahrscheinlich zu langsam (obwohl ichs noch nicht mit reiner Integer-Rechnung und tabellarischen Sinus- und Cosinus-Werten probiert habe, aber tendenziell is ja C immer nen ganzes Stück langsamer als asm). Ich hab aber schonmal überlegt den FFT-Code als Assembler im avr-gcc einzubinden, allerdings ist beim avr-gcc-asm die Syntax anders, daher war mir das bisher zu aufwendig.
ape: Du verwendest in deiner Schaltung zwei OPs um die Audiosignale auf den Max zu geben. Sind dies unbedingt notwendig oder koennte man das Audiosignal mit normalem Line-Out Pegel auch direkt ueber einen Rondensator und zwei Widerstaende an den Max geben? Oder wenigstens den Spannungsteiler vor den OP schalten um die -6V weglassen zu koennen? Ich bin leider im Bereich der analogtechnik nicht so bewandert und kenne mich daher da nicht so richtig aus Gruß Tobias
Die Ops kann man komplett weglassen wenn die Audio-Quelle niederohmig genug ist (z.B. ein Kopfhörer-Ausgang). Also die beiden Stereo-Kanäle einfach über 2 Widerstände mischen, dahinter den Koppel-Kondensator und dahinter das Poti um den 0-Level auf VCC/2 anzuheben.
Hi, ich denke mal, Line-Out von einem Autoradio ist stark genug? (Keine Angst ist fuer nen Freund :) ) ape: Funktioniert das mit der AD-Wandlung so wie in deinem Schaltplan zuverlaessig? Du hast ja schlieslich sogut wie keine externe Beschaltung am Wandler. Oder ist das bei einem einfachen Audiosignal noch nicht so kritisch? Gruß Tobias
Wieso heisen eigednlich die Geschaeftsfuehrerinnen von Kessler und Reichelt beide Angelika? :) Gruß Tobias
Bei einem Autoradio Line-Out wär ich mir garnicht mal so sicher, Verstärker haben ja i.d.R. eine recht hohe Eingangsimpedanz... Notfalls kannst du auch die Widerstände zum zusammenmischen etwas größer wählen, 10k sollten auch noch gehen udn dann sollte der Ausgang des Radios das auf jeden fall treiben können. Ansonsten könntest du auch die beiden Stereo-Kanäle mit Kondensator und Poti auf VCC/2 bringen und dann die OpAmps dahinter hängen, diese kämen dann mit einer Versorgungsspannung aus, allerdings müsstest du dann sog. Rail to Rail Typen verwenden, da die Versorgungsspannung nur wenig größer ist als das Signal. Naja was willst du denn noch an zusätzlicher Beschaltung am AD haben? Ein Tiefpassfilter ist ja davor, Überspannung kanns nicht geben, weil der Filter ja mit der gleichen Versorgungsspannung läuft wie der AVR. Das einzige worüber man nachdenken könnte, wäre ein Überspannungsschutz vorm MAX297, bei normalem Line-Pegel, sollte das aber eigentlich nicht vorkommen.
Hier eine kleine Spielerei mit dem FFT Code: Ein mega8 zeigt auf einem Oszilloskop das Frequenzspektrum eines beliebigen Signals im Bereich 0-10kHz an (bei 16,64MHz Taktfrequenz). Für was man das sinnvoll gebrauchen kann weiß ich selber nicht, sieht aber ganz nett aus...
@Benedikt klingt gut, haste auch noch ein OsZi-Bild. In dem Zusammenhang fällt mir die OSZI_Uhr ein: http://home.tiscali.de/mbowyer/scope.html Hat jemand eine Lichtorgel mit AVR's gemacht? MfG
Auf einem Bild kann man leider nicht wirklich viel erkennen, daher hier ein Video eines Sinustons von 0-10kHz.
Woher nehm ich die beiden Include Dateien .include "avr.inc" .include "akiglcd.inc"?
Falls noch Interesse an 128- oder 256-Punkt FFT´s mit Atmel mega128 oder so besteht, habe ich im Anhang meine Modifikationen von Chan´s SuperCode angefügt. In der 256-er Version wird derzeit ein blackman Fenster verwendet, hat ein bißchen höhere Dämpfung als das Hamming, der Unterschied ist aber nicht so groß. (Hamming ist auch noch dabei) Hoffentlich läufts bei euch auch, mir machts zur Zeit richtig Spaß. (Allerdings ist mir eine hohe Geschwindigkeit nicht so wichtig) Pit
moin, habe hier nur mal reingeschnuppert. Einige hier beschäftigen sich hier mit FFT's, die anderen wollen Drehzahlen oder andere "natürliche Events" zählen. EInfacher und zäher als jede Impulszählerei kann eine FFT z.B. eines Drehgebersignal oder auch des über Ferrit bzw. Induktiv eingekoppelten Zündsignals sein (praktisch sind alle Sensoren möglich, die irgendein Frequenzbasiertes Signal liefern). Man sucht sich aus der FFT dann einfach das amplitudenstärkste Peaksignal raus und erhählt dann die Frequenz bzw. die Drehzahl. Überlegt mal, wie schnell man damit sein kann...und das Ergebnis ist trotzdem stabiler, als die Mittelung von zig counterevents und ähnlichem Kram :-). nur so als Denkanstoss...z.B. kann man einfach ein Mikrofon auf den Motor richten und mit ein paar Überlegungen zur Zündfolge aus dem analogsignal die Frequenz bzw. die drehzahl rausziehen. Die Genauigkeit ist natürlich beliebig hoch bzw. die geschwindigkeit der frequenzanzeige beliebig langsam,aber besser als 0,5Hz wie in dem freuqunzmessertread wird es schon sein. Ferner läßt sich dei genauigkeit durch Approximation sicherlich noch steigern (Faktor 10). Gruß´ ray
@ray becker: eine FFT, welche Frequenzen bis 10kHz bzw. 10000 U/s mit 0.5 Hz Auflösung berechnet wirst du auf einem (üblichen kleinen) Controller schwer bzw. nicht implementieren können. Da bedarf es schon eines Signalprozessors. "Überlegt mal, wie schnell man damit sein kann..." sag uns bitte, wie schnell man dabei ist. ?? mfg, thomas
hallo thomas, Ist vielleicht etwas missverständlich ausgedrückt... ich bezog mich auf postings, in denen von Tachosignalen/ABS-Signalen und Verbrennungsmotordrehzahlen die Rede war. da wird man kaum 10kU/s mit 0,5Hz auflösen müssen, nur um brauchbar die drehzahl zu messen (zum indest fällt mir da keine sinnvollle Anwendung zu ein). Wenn man ein Motor-STG bauen möchte, dann sieht das anders aus, aber wenn jemand "nur" möglichst brauchbar wissen will, wie schnell z.B. sein Verbrennungsmotor dreht (z.B.hochgegriffene 20000U/min, dann wird eine FFT , die mit nur 1kHz gesampelt wird und 256 Frequenzen abbildet dann wohl ausreichen um auf 120 U/min genau die Drehzahl anzuzeigen. Je nach Messbereich kann das wohl ausreichend sein oder nicht?! mit dem ausspruch "..wie schnell man sein kann" meinte ich, daß man -je nach anforderung an die messung beliebig genau bzw. langsam sein kann. Das das mit einem AVR seine grenzen hat, ist klar. sage mir doch bitte noch, wie du darauf kommst, daß ich 10kHz mit 0,5Hz Genauigkeit auflösen möchte? 0,5Hz war die refreshfrequenz der Counteranwendung in dem Drehzahmesser-Tread. dann noch viel spaß beim flankenzählen :-) Gruß raymond
@benedikt: kannst du mir bitte mailen? meine firma wäre evtl interessiert an deinem LED oder oszi teil.
schade, war eine gute Seite, und ich habe viel gelernt, wie ich mein KS1080-Display (oder so ähnlich) ansteuern muss. Wenn man sich nicht jede Seite spiegelt - blödes Internet ;-) Naja, ape kann mit seiner Seite/seinem Wissen/seinem Know How tun und lassen was er will. Stefan.
Vieleicht ist heir was dabei? http://web.archive.org/web/*/http://www.apetech.de http://web.archive.org/web/20060713194909/apetech.de/article.php?artId=7&nnId=17&PHPSESSID=905030c35dd83f66f266927afc07419f
@ Roman Pollak Bei deiner Implementation, was stellt x1,y1,x2,y2 dar? jeweils ein Vektor? -hub
x1,y1 input bzw. cosinus und sinus anteil x2,y2 output auch wieder cosinus und sinus anteil der jeweiligen frequenz. Daraus kann man durch aus den vektor fuer entsp. Frequenze errechnen bezogen auf den kreis (darum der sinus und cosinus anteil) bzw. der winkel. Sollte mit atan2 funzen. um Ampitude zu kriegen ala spektrum analyzer, kann man den x1 mit daten aus dem AD fuetern y1 mit nullen fuellen. Nach der berechnung kriegt man den cosinus und sinus anteil. Dies kann man zur ueberpruffung in die idft rein tun, dann sollte man das urspuengliche signal kriegen. Zurueck zum spektrum analyzer, man nehmen den x2,y2 und macht daraus amplitude mit, mit ... pythagoras.
Das schoene und auch gleich das unschoene an DFT ist, sie kann beliebig lang sein ohne die
limitation. Dh. die DFT kann auf 799 lang sein. Aber.. Leider ist sie auch damit laengsaemer als die FFT. have fun Roman
ups ein fehler gefunden... es sollte heissen
und eins habe ich noch vergessen.. der x2[0] ist der DC anteil. gruss roman
Das ganze ist zwar schon länger her aber ich habe keine erfahrung mit elektrotechnik und auch nicht viel mit asm nur mit hochsprachen wie c++. Trotzdem hätte ich extrem gerne einen solchen Display hinbekommen. Den FFT prozessor brauch ich nicht ich hätte das ganze direkt an meinen computer gehängt. Geht das? Wenn ja wie und gibt es etwas mit dem ich erstmal irgendwie das ganze simulieren kann, denn ich will nicht gleich anfangen rumbasteln sondern erstmal irgendwie schauen ob ich die leds überhaupt ansprechen kann.... Wie gesagt wäre so ziehmlich erste Schalten die ich mache... in Schule lernt man ja nix.... :( Kann mir da jemand helfen? Ansonsten vll. per email: florian.rosmann@gmx.net
Hallo, gibts inzwischen ne neuere Version der 32*16 Anzeige? Bin grad am überlegen, das Dingens nachzubauen.
Hallo H. Koch, kannst du mir sagen mit welchem Protokoll/Format die Daten von Benedikts LED-Display empfangen werden. Ist mir echt ein Rätsel. Vielen Dank!
Hallo BerndB, Standard Baud Rate: 115200 Länge: 8 Pari: kein Stoppbits: 1 bei angehängtem Bild (Bild1) erhalte ich folgende Daten (Bild2). Gehe mal davon aus, das dann die erste Zeile von Bild2 dem oberen Teil (8 Zeilen) von Bild1 entspricht, der untere Teil die 80 00 80 ==> 1000000 00000000 10000000 eben dem anderen unteren Teil. Die 80 entsprechend 10000000 senkrecht angezeigt wird.
ape schrieb: > Eine FFT direkt in C ist wahrscheinlich zu langsam (obwohl ichs noch > nicht mit reiner Integer-Rechnung und tabellarischen Sinus- und > Cosinus-Werten probiert habe, aber tendenziell is ja C immer nen ganzes > Stück langsamer als asm). Zum Thema FFT in C: http://cr.yp.to/djbfft.html Ich denke schneller als Bernstein kann keiner. Zumindest nicht in C.
Benedikt schrieb: > Hier eine weitere Version des Spektrum Analysers, die auf dem selben FFT > Code basiert, aber statt eines LCDs eine 32x16 LED Matrix verwendet. wollte diesen Spektrum Analyser von Benedigt nachbauen , in der beschreibung steht dass die tiefpassfilter entfallen können aber dann steht auch noch das man sie braucht, für was sind die filter jetzt eigentlich gut ? und wie wichtig ist dass die frequenz auf 18,432Mhz eingehalten wird. reicht ein 16mhz quarz auch ? oder ist die teilbarkeit erforderlich ?
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.