www.mikrocontroller.net

Forum: Projekte & Code FFT auf dem AVR


Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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>

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:
  • FFT.zip (948 KB, 86803 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Hier eine weitere Version des Spektrum Analysers, die auf dem selben FFT
Code basiert, aber statt eines LCDs eine 32x16 LED Matrix verwendet.

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Aufwand ist nicht größer, aber dafür gibt es einfachere und
effektivere Lösungen (z.B. IIR oder FIR Filter)

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du einen Link in dem so was beschrieben ist ohne das man Kenntnisse
in höherer Mathematik habe muss?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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)!

Autor: Roman Pollak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
 for (i=0;i<m;i++) {
      x2[i] = 0.0;
      y2[i] = 0.0;
      arg = - dir * 2.0 * 3.141592654 * (double)i / (double)m; 
      /* teilung fuer die F i/m , dies macht die folgende schleife einfacher */ 
   
      for (k=0;k<m;k++) {
      double a=k*arg;
         cosarg = cos(a);
         sinarg = sin(a);

         x2[i] += (x1[k] * cosarg - y1[k] * sinarg);
         y2[i] += (x1[k] * sinarg + y1[k] * cosarg);
         /* addiere den anteil zum output */ 
         /* wie man sieht, wird dies fuer jeden eingang punkt gerechnet */ 
         /* dh. ist diese frequenz vorhanden mit der addition weiss man */ 
         /* nicht nur ob, sondern auch die amplitude */

          }
       }

Auch eine Frage ? Hat schon jemand die FFT auch ins gcc portiert ?

gruss
roman

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Tobias Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: DerMax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau :D

Autor: Tobias Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Tobias Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso heisen eigednlich die Geschaeftsfuehrerinnen von Kessler und
Reichelt beide Angelika? :)

Gruß Tobias

Autor: Tobias Schneider (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups falscher thread

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: stromi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Benedikt (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Auf einem Bild kann man leider nicht wirklich viel erkennen, daher hier
ein Video eines Sinustons von 0-10kHz.

Autor: Emppu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woher nehm ich die beiden Include Dateien .include "avr.inc"
.include "akiglcd.inc"?

Autor: Peter Bruestle (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Emppu,

anbei die gewünschten Dateien.
Viel Spaß,
Pit

Autor: Pit (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: ray becker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: thomas.o (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: ray b. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Bob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@benedikt: kannst du mir bitte mailen? meine firma wäre evtl
interessiert an deinem LED oder oszi teil.

Autor: hase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, wo ist die Seite geblieben??! Sie war doch so gut!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Roman Pollak

Bei deiner Implementation, was stellt x1,y1,x2,y2 dar?

jeweils ein Vektor?

-hub

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was stellt x1,y1,x2,y2 dar?

hubert

Autor: Roman Pollak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Roman Pollak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups ein fehler gefunden...

es sollte heissen

und eins habe ich noch vergessen..

der x2[0] ist der DC anteil.


gruss roman

Autor: hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Infos!!

Autor: filoe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: William (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit computer kannst du FFT in Pure Data realisieren

Autor: H. Koch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

gibts inzwischen ne neuere Version der 32*16 Anzeige? Bin grad am 
überlegen, das Dingens nachzubauen.

Autor: BerndB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Helge _S (helge_s)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: S. Z. (ceving)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Spektrum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.