Forum: Projekte & Code FFT auf dem AVR


von ape (Gast)


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>

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

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

von Benedikt (Gast)


Angehängte Dateien:

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.

von Hubert (Gast)


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?

von Benedikt (Gast)


Lesenswert?

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

von Hubert (Gast)


Lesenswert?

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

von Benedikt (Gast)


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.

von emil (Gast)


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)!

von Roman Pollak (Gast)


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
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

von ape (Gast)


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.

von Tobias Schneider (Gast)


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

von DerMax (Gast)


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.

von ape (Gast)


Lesenswert?

genau :D

von Tobias Schneider (Gast)


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

von Tobias Schneider (Gast)


Lesenswert?

Wieso heisen eigednlich die Geschaeftsfuehrerinnen von Kessler und
Reichelt beide Angelika? :)

Gruß Tobias

von Tobias Schneider (Gast)


Lesenswert?

ups falscher thread

von ape (Gast)


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.

von Benedikt (Gast)


Angehängte Dateien:

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...

von stromi (Gast)


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

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

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

von Emppu (Gast)


Lesenswert?

Woher nehm ich die beiden Include Dateien .include "avr.inc"
.include "akiglcd.inc"?

von Peter Bruestle (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Emppu,

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

von Pit (Gast)


Angehängte Dateien:

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

von ray becker (Gast)


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

von thomas.o (Gast)


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

von ray b. (Gast)


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

von Bob (Gast)


Lesenswert?

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

von hase (Gast)


Lesenswert?

Hallo, wo ist die Seite geblieben??! Sie war doch so gut!

von Stefan (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?


von hubert (Gast)


Lesenswert?

@ Roman Pollak

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

jeweils ein Vektor?

-hub

von hubert (Gast)


Lesenswert?

was stellt x1,y1,x2,y2 dar?

hubert

von Roman Pollak (Gast)


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

von Roman Pollak (Gast)


Lesenswert?

ups ein fehler gefunden...

es sollte heissen

und eins habe ich noch vergessen..

der x2[0] ist der DC anteil.


gruss roman

von hubert (Gast)


Lesenswert?

danke für die Infos!!

von filoe (Gast)


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

von William (Gast)


Lesenswert?

mit computer kannst du FFT in Pure Data realisieren

von H. Koch (Gast)


Lesenswert?

Hallo,

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

von BerndB (Gast)


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!

von Helge S. (helge_s)


Angehängte Dateien:

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.

von S. Z. (ceving)


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.

von Spektrum (Gast)


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 ?

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
Noch kein Account? Hier anmelden.