Forum: Digitale Signalverarbeitung / DSP / Machine Learning Schnelle FFT in Assembler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Benedikt (Gast)


Lesenswert?

Es wurde ja schon häufiger nach einem Spektrum Analyser gesucht.
Hier ein schneller Code für den mega8:
http://elm-chan.org/t/akilcd.zip
http://elm-chan.org/t/sa01.avi
http://elm-chan.org/t/sa02.avi

Leider ist das Programm für zwei LCDs mit je einem SED1520 (für Wave
und Spektrum Darstellung). Ich versuche gerade den Code für ein T6963
umzuschreiben, aber das ist nicht gerade einfach und bisher läuft noch
nicht viel, außer den Initialisierung...

von Sebastian (Gast)


Lesenswert?

Cool. Die AVIs sind ja sehr vielversprechend. Schade, dass die
LCD-Routinen nicht in C geschrieben sind, das würde sie viel einfacher
portierbar machen. Ich habe z.B. eine Lib für den KS0108-Controller
geschrieben. Wenn ich jetzt eine geeignete Schnittstelle hätte, würde
ich ja glatt mal versuchen, die FFT-Routinen bei mir einzubinden.

von Benedikt (Gast)


Lesenswert?

Ich habe immer noch kein LCD zum laufen gebracht, aber mal schnell ein
virtuelles Display am PC gebastelt.
Die FFT Routine ist echt beeindruckend. Nicht nur, dass diese sehr
schnell ist (ein vergleichbares C Programm ist um den Faktor 10-100
langsamer !!!!), sondern auch gleich eine Glättung beim FFT und eine
Filterung beim Oszilloskop ist eingebaut.

von Berti (Gast)


Lesenswert?

Gibts einen Anschlussplan wie das Audiosignal dem AVR zugeführt
wird(Signalkonditionierung)

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Der Software nach wird das Signal über einen MAX292 Switched Capacitor
Tiefpass Filter an ADC6 eingespeist (-> SMD Version des mega8)
Für den Anfang reicht auch ein einfacher Tiefpass, oder man kann das
Signal auch direkt einspeisen, allerdings erscheint dann alle
Frequenzen über 4,7kHz gespiegelt.
An AREF wird eine externe Refernzspannung eingespeist, aber man kann es
ja auch auf interne Umschalten.

Ich werde damit jetzt einen "kleinen" Spektrum Analyser mit LEDs
bauen und zwar 32x16.
Hier schonmal ein kleiner Test.

von Berti (Gast)


Lesenswert?

Zum Thema direkt einspeisen:
Wie bring i den Sttischen level von 2.5V zusammen um auch die negative
Halbwelle des Audiosignals erfassen zu können?

von Benedikt (Gast)


Lesenswert?

Am einfachsten geht es wenn man VREF auf AVcc schaltet (per Software).
Ein Spannungsteiler aus zwei gleichen Widerständen zwischen AVcc und
GND und man hat die 2,5V. Mit einem kleinen Kondensator koppelt man das
Audiosignal ein.

von Berti (Gast)


Angehängte Dateien:

Lesenswert?

Passt die Schaltung so in Etwa?

Werte für C?
R1=R2 schätzomativ 4k7

von Erik (Gast)


Lesenswert?

Für das C würde ich etwa 100 nF nehmen, R1 & R2 ehner hochohmiger,
resperktiv vom Spannungsteiler nochmals 100k und dan auf den Eingang
--> weniger Rauschen.

von Berti (Gast)


Lesenswert?

@Benedikt:

Gibt es irgendwo einen Pseudo Code für die FFT
Oder a Flussdiagramm
Ich würd das gerne in C nachproggen aber das ASM entschlüsseln...

Das wär des Rätsels Lösung

von Benedikt (Gast)


Lesenswert?

@Berti
google mal

Für C findest du einiges (z.B. fft.c), aber das ist alles verdammt
langsam (so 1/10 bis 1/100 der Geschwidnigkeit von dem ASM Programm)und
hat ehrlich gesagt bei mir noch nie richtig gut funktioniert.

von Berti (Gast)


Lesenswert?

Ich google schon seit 3 Tagen finde auch einiges aber nix mit
ordentlicher Beschreibung...
Ein schöner C Code hilft wenig wenn man nicht weis was mit welchem
Parameter übergeben wird.
Ich habs mit den Numerical recipes in C versucht bin aber auch dort auf
keinen Grünen zweig gekommmen.

von Benedikt (Gast)


Lesenswert?

Im Prinzip ist das immer dasselbe:
Ein Array mit den Wave Daten wird übergeben, fft läuft und man erhält
ein Array mit den Frequenzamplituden zurück. Einmal der Realteil in der
unteren Hälfte und der imaginär Teil in der oberen. Manchmal wird auch
nur der Betrag zurückgegeben.
Bei einigen Funktionen muss man auch noch die Länge mit angeben.

Eine einfache Erklärung dafür gibt es nicht. Ich habe es meistens nach
der zweiten Seite aufgegeben zu verstehen wie FFT wirklich
funktioniert...

von Berti (Gast)


Lesenswert?

g Ja is sehr komplex das ganze... werd mal versuchen mit einem
fertigen Quellcode was anzufangen...

von DerMax (Gast)


Lesenswert?

Ich hatte mal einen funktionierenden C-Code, leider war der wohl eher
für PC gedacht und verwendete Fließkommarechnung. Ich habs spaßes
halber mal auf nem AVR ausprobiert hat auch funktioniert aber ich
schätze mal der lag Performance-Mäßig noch nen ganzes Stück unter 1/100
von diesem hier.
Ich hab bisher noch keinen funktionierenden C-Code gefunden der mit
Integer-Arithmetik auskommt.

Ohne Verständnis der zu Grunde liegenden Mathematik hat man da denke
ich auch keine Chance irgendwas selber zu schreiben.
Ansonsten ist Asm imho eh der einzige Weg um da was halbwegs schnelles
aus nem AVR rauszuholen.

Bei diesem ist auch das Frequenzspektrum recht geschickt gewählt. Ich
hab früher mit voller Audio-Frequenz (44kHz) gesampled und dann die
höheren Frequenzbänder zusammengerechnet um einen logarithmischen
Frequenz-Maßstab zu bekommen. Das hat dann aber immer von den
Amplituden her nich richtig gepasst. Weiteres Problem war das man, um
die nötige Auflösung im niedriegen Frequenzbereich zu bekommen eine FFT
mit 512 oder besser sogar 1024 Punkten bräuchte wo dann der AVR
irgendwann endgültig das Handtuch schmeißt. Die oberen Bereiche sind
aber eigentlich eh uninterresant (jedenfalls wenn nur schön aussehen
soll) Und im unteren Bereich tuts dann auch ein linearer Maßstab so
kann man ne ganze Menge Performance sparen.

von Benedikt (Gast)


Lesenswert?

512 Punkte wären ja kein Problem, es wären immernoch über 25
Messungen/s:

;----------------------------------------------------------;
; Spectrum analyzer
;----------------------------------------------------------;
; 16bit fixed point FFT performance with megaAVR @16MHz
;
;  Points:  Input,    FFT, Output,   Total: Throughput
;   64pts:  .17ms,  1.9ms,  1.4ms,   3.5ms:   18.3kpps   (expected)
;  128pts:  .34ms,  4.4ms,  2.6ms,   7.3ms:   17.5kpps   (measured)
;  256pts:  .68ms, 10.1ms,  5.2ms,  16.0ms:   16.0kpps   (expected)
;  512pts:  1.4ms, 22.6ms, 10.4ms,  34.4ms:   14.8kpps   (expected)
;
; Input: Input waveform into butterfly table with applying window
; FFT: Execute butterfly operations
; Output: Descramble and output the spectrum as scalar values

Nur leider habe ich keine Ahnung wie die dazu passende Hamming Tabelle
usw. aussehen muss.
Ich habe die Samplerate verdoppelt und so die Frequenz bis auf 10kHz
erhöht. Die 64 Werte werden "Pseudologarithmisch" zu 32 Werten
zusammengefasst. Da hatte ich anfangs auch das Problem wie ich die
Werte am besten zusammenfasse: Bilde ich Mittelwerte ist die Amplitude
bei 4 Mittelwerten maximal 1/4 wenn nicht alle 4 Frequenzen vorkommen.
Daher suche ich jetzt den Maximalwert aus den 4 Werten, was auch ganz
gut passt.
Eventuell werde ich später (falls es mal eine neue Version des FFT
Programms gibt) auf 256 oder 512 Punkte erhöhen um im unteren Bereich
eine höhere Auflösung zu erzielen. 156Hz sind nicht gerade das beste.
Mit 512 Punkten wären es immerhin 39Hz...
Die zusammengefassten Werte werden per UART an einen zweiten uC
übertragen der als Display Controller für eine 32x16 LED Matrix
arbeitet.

von Matthias (Gast)


Lesenswert?

Hi

Hamming-Fenster berechnet sich ganz simpel nach
http://www.uni-regensburg.de/Fakultaeten/nat_Fak_IV/Physikalische_Chemie/Schmeer/PDF_Files/DSP06.pdf
Seite 14.

Matthias

von Benedikt (Gast)


Lesenswert?

Dann bleibt nur noch die unterste Tabelle, die mir überhaupt nichts
sagt.
Die Cosinus Tabelle muss ich auch auf die enstpreche Länge umrechnen,
oder ?

; These tables must be rebuilt when change FFT_N

t_cos_sin:  ; {cos(x),sin(x)} table (0 <= x < pi, in 64 steps)
  .dw  32767, 0, 32727, 1607, 32609, 3211, 32412, 4807
  .dw  32137, 6392, 31785, 7961, 31356, 9511, 30851, 11038
  .dw  30272, 12539, 29621, 14009, 28897, 15446, 28105, 16845
  .dw  27244, 18204, 26318, 19519, 25329, 20787, 24278, 22004
  .dw  23169, 23169, 22004, 24278, 20787, 25329, 19519, 26318
  .dw  18204, 27244, 16845, 28105, 15446, 28897, 14009, 29621
  .dw  12539, 30272, 11038, 30851, 9511, 31356, 7961, 31785
  .dw  6392, 32137, 4807, 32412, 3211, 32609, 1607, 32727
  .dw  0, 32767, -1607, 32727, -3211, 32609, -4807, 32412
  .dw  -6392, 32137, -7961, 31785, -9511, 31356, -11038, 30851
  .dw  -12539, 30272, -14009, 29621, -15446, 28897, -16845, 28105
  .dw  -18204, 27244, -19519, 26318, -20787, 25329, -22004, 24278
  .dw  -23169, 23169, -24278, 22005, -25329, 20787, -26318, 19519
  .dw  -27244, 18204, -28105, 16845, -28897, 15446, -29620, 14009
  .dw  -30272, 12539, -30851, 11038, -31356, 9511, -31784, 7961
  .dw  -32137, 6392, -32412, 4807, -32609, 3211, -32727, 1607

t_hamming: ; Hamming window (for 128 samples)
  .dw  2621, 2639, 2693, 2784, 2910, 3073, 3270, 3502
  .dw  3768, 4068, 4401, 4765, 5161, 5587, 6042, 6525
  .dw  7036, 7571, 8132, 8715, 9320, 9945, 10588, 11249
  .dw  11926, 12616, 13318, 14031, 14753, 15482, 16216, 16954
  .dw  17694, 18433, 19171, 19905, 20634, 21356, 22069, 22772
  .dw  23462, 24138, 24799, 25443, 26068, 26673, 27256, 27816
  .dw  28352, 28862, 29345, 29800, 30226, 30622, 30987, 31319
  .dw  31619, 31885, 32117, 32315, 32477, 32603, 32694, 32748
  .dw  32767, 32748, 32694, 32603, 32477, 32315, 32117, 31885
  .dw  31619, 31319, 30987, 30622, 30226, 29800, 29345, 28862
  .dw  28352, 27816, 27256, 26673, 26068, 25443, 24799, 24138
  .dw  23462, 22772, 22069, 21356, 20634, 19905, 19171, 18433
  .dw  17694, 16954, 16216, 15482, 14753, 14031, 13318, 12616
  .dw  11926, 11249, 10588, 9945, 9320, 8715, 8132, 7571
  .dw  7036, 6526, 6042, 5587, 5161, 4765, 4401, 4068
  .dw  3768, 3502, 3270, 3073, 2910, 2784, 2693, 2639

t_desc:  ; Descramble table (for 128 point FFT)
  .dw  0*4, 64*4, 32*4, 96*4, 16*4, 80*4, 48*4, 112*4
  .dw  8*4, 72*4, 40*4, 104*4, 24*4, 88*4, 56*4, 120*4
  .dw  4*4, 68*4, 36*4, 100*4, 20*4, 84*4, 52*4, 116*4
  .dw  12*4, 76*4, 44*4, 108*4, 28*4, 92*4, 60*4, 124*4
  .dw  2*4, 66*4, 34*4, 98*4, 18*4, 82*4, 50*4, 114*4
  .dw  10*4, 74*4, 42*4, 106*4, 26*4, 90*4, 58*4, 122*4
  .dw  6*4, 70*4, 38*4, 102*4, 22*4, 86*4, 54*4, 118*4
  .dw  14*4, 78*4, 46*4, 110*4, 30*4, 94*4, 62*4, 126*4

von Matthias (Gast)


Lesenswert?

Hi

die FFT würfelt bei Eingangsdaten der Form x[0], x[1], x[2] usw. die
Reihenfolge des Ergebnisfelds etwas durcheinander. Hier ist eine Grafik
wie das etwa aufgebaut ist:

http://www.kgw.tu-berlin.de/lehre/skript/ds/node36.html

Solltest du mit etwas Denken auf mehr Punkte ausbauen können.

Matthias

von Benedikt (Gast)


Lesenswert?

Mit etwas nachdenken wars klar:
Die Bitreihenfolge wird gedreht: 0->0, 1->128, 2->64, 4->32 usw

Jetzt habe ich zwar die Tabellen, aber es geht nicht. Ich hätte auch
eher drauf kommen können:
CaptBuf:.byte  FFT_N*2    ;Sampling buffer
BflyBuf:.byte  FFT_N*4    ;Butterfly operation table, Wave form buffer
LvlBuf:  .byte  FFT_N/2    ;Spectrum bar length

Bei 128 Punkten sind das schon 832 Bytes, bei 256 wären es 1664, aber
der mega8 hat nur 1kB SRAM.
Dann muss ich wohl einen mega8515 mit 32kb SRAM verwenden und den ADC
ebenfalls nach draußen verlagern...

von VHDL (Gast)


Lesenswert?

Die FFT lässt sich mit Bestimmtheit auch inplaced umbauen. Dann
benötigst du nur noch den BflyBuf: .Byte FFT_N*4 Buffer.

Falls du statt der Fixed Point/Floating Point FFT eine Integer FFT
benutzt so kannst du diesen Buffer auf FFT_N Bytes reduzieren.
Allerdings arbeiten fast alle Integer FFT's modular, also mit
Divisionen und diese sind langsammer. Es gibt zwei Ausnahmen, die
Montgomery basierte FFT die statt vieler modularer Divisionen eben
Multiplikationen in der sogenannten Montgomery Domain benutzt. Oder
eben die modulare Fermat FFT nach Schönhage/Strassen. Diese FFT
arbeitet modular 2^(N*M) und solche Divisionen zu dieser speziellen
Form der modularen Ringe kommen ganz ohne Multiplikationen und
Divisionen aus. Sie benötigen nur Shift Operationen , Additionen und
Subtraktionen. Allerdings dürfte dies für einen AVR eher schlecht sein
da die Multiplikation nur 2 Takte benötgt, dagegen aber eine beliebige
Shift Operation 1*i Takte benötigt.

Ich vermute das eine modulare Integer FFT wie die von Nussbaumer mit
Primzahlringen auf dem AVR der beste Kompromiss ist. Leider habe ich
persönlich mit diesen FFT's nur auf Intel PC's praktische Erfahrungen
gesammelt.

Gruß hagen

von Benedikt (Gast)


Lesenswert?

Ich verstehe zwar ehrlich gesagt nicht viel von dem was du geschrieben
hast, weshalb ich leider auch auf fertige Software angewiesen bin, aber
da diese Version so extrem schnell läuft, bin ich mit den ganzen
Kompromissen mit dem Speicherbedarf durchaus zufrieden.
Ich habe eine Application Note die eine FFT auf einem PIC beschreibt.
Dieser benötigt 100ms für eine 256Punkt FFT, während der AVR gerade mal
16ms benötigt.

von ape (Gast)


Lesenswert?

So ich hab jetzt auch mal ein bisschen mit dem Code rumexperimentiert.
Ich hab den LCD-Kram erstmal rausgeschmissen und sende jetzt die
Spektrum-Daten über UART an den PC. Ist schon sehr geil der Code.
Extrem schnell und das Spektrum sieht ganz gut aus (und das obwohl ich
im moment noch nichtmal einen Tiefpass davor hab :))
Ein paar Probleme hat mir die recht kleine Amplitude (auf die 32 pixel
Höhe vom im Original verwendeten LCD skaliert?) des Spektrums bereitet.
Ich hab jetzt die Zeile
  ldi  AH, 256/3
in make_bars durch
  ldi  AH, 255
ersetzt. Damit erreichen die Spektrum-Werte einen Maximal-Wert von
knapp 160, was für meine Zwecke ausreichend ist. Trotzdem wärs ganz
schön, wenn man 8 bit voll ausnutzen würde. Kennt da jemand ne Stelle
wo man noch dran drehen kann. (Ich bin so schon kein Freund von asm,
aber bei den Berechnungen dadrin blick ich nichts mehr...)

Der Plan sieht jedenfalls vor den Mega über TWI anzusprechen um dann
die Spektrum-Daten darüber auslesen zu können. Auf diese Weise kann
sich der Master noch um andere Dinge kümmern und ist nicht völlig mit
der FFT ausgelastet.
Außerdem werd ich mich auch mal an einer 256-Punkte FFT versuchen.
Allerdings werde ich dafür einen Mega32 verwenden. Der kostet auch
nicht mehr wie ein kleinerer Mega + SRAM und nimmt weniger Platz weg :)

von Matthias Waldhauer (Gast)


Lesenswert?

Was haltet ihr davon:

http://www.jjj.de/fft/int_fft.c

Sehr viel mehr zum Thema FFT gibt es direkt unter www.jjj.de zu finden.

von Matthias (Gast)


Lesenswert?

Hi

ist in C geschrieben. Die Fixkomma-Berechnungen werden wohl nicht mit
dem FMUL-Befehl gemacht werden. Das dürfte die Berechnungen dann doch
deutlich ausbremsen.

Matthias

von Matthias Waldhauer (Gast)


Lesenswert?

Ich habe es gepostet, weil jemand nach einem C-Code fragte, um den
Algorithmus besser verstehen zu können. Die oben verlinkte ASM-Version
soll dadurch natürlich nicht ersetzt werden.

von ape (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
da ich danach gefragt wurde hier mal mein editierter Code für den
mega8. Das AudioSignal wird mittels Koppel-Kondensator und
Spannungsteiler auf AVCC/2 gebracht (weiter oben ist es glaub ich
irgendwo nochmal genauer beschrieben) und an den ADC0-Channel
angeschlossen.
Die Daten werden übers UART mit 115kbps übertragen. Es existiert so gut
wie kein Protokoll. Es werden lediglich immer die 64 Werte des Spektrums
übertragen gefolgt von einem '\r'. Man sollte aber beachten dass auch
werte aus dem Spektrum den wert 13 (also '\r') haben können. Is halt
ein ganz billiger Prototyp, wer das wirklich verwenden will, sollte da
noch ein wenig dran arbeiten.
Außerdem verwende ich einen 18,432MHz Quarz (ich weiß damit ist der AVR
leicht übertaktet), wenn jemand einen anderen verwenden möchte, muss er
die Einstellungen für die UART Baud-Rate anpassen.
Alles andere hab ich erstmal rausgeschmissen. Also kein LCD, keine
Pause-Funktion, und auch keine Takterzeugung für den MAX293.

mfg
ape

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

@ape
Ich hatte es bei mir genauso gemacht:
18,432MHz Quarz an den AVR (selbst 24MHz machen die meisten noch mit),
Teiler für den ADC auf 64 um etwa 22kHz Samplerate zu erhalten, für
einen nutzbaren Bereich 0-10kHz (der brauchbare Teil des
Audiospektrums).
Im Anhang mal meine Software, bereits mit Tabellen für eine 256-Punkte
FFT. Das einzige was mir im Moment dazu noch fehlt ist der mega32 o.ä.
Wenn jemand noch für andere Werte die Tabellen braucht, kann ich diese
gerne erstellen.
Die Software überträgt die Werte ebenfalls über UART, aber nicht als 64
Werte, sondern als Grafikdaten, da ich damit ein 32x16 LED Display
ansteuere. Die Daten werden als 2x 32x 8bit übertragen: Erst die 32
Werte der oberen Hälfte der 16 LED Zeilen, dann nochmal 32 Werte für
die untere Zeile. Als Synchronisation dient Pin D.2. Die 64 Werte
werden pseudologarithmisch zu 32 Werten zusammengefasst: Im unteren
Frequenzbereich werden die Werte einzeln übertragen, dann immer zwei,
später drei und am oberen Ende dann vier Werte zusammengefasst zu
einem. Beim Zusammenfassen wird immer der Maximalwert der Einzelwerte
verwendet.
Aus irgendeinem, mir unerklärlichen Grund hängt sich die Software ab
und zu auf wenn man das Eingangssignal übersteuert, daher der Watchdog.

von ape (Gast)


Angehängte Dateien:

Lesenswert?

So hab nochma nen bissle an meinem Prog gebastelt
nach den 64 Werten wird jetzt der Wert 254 gesendet. So große Werte
nehmen die Spektrum-Werte nicht an, daher kann man sich darauf
synchronisieren.
Außerdem hab ich noch mein Java-Programm mit reingepackt was das ganze
aufm PC auswertet. Standardmäßig wird COM2 verwendet, für einen anderen
Port muss man die start.bat entsprehend anpassen.

@benedikt
Hab hier schon nen mega32 liegen, werd das gleich mal ausprobieren.
Bei der Sampling-Rate werd ich aber denke ich bei 11kHz bleiben. Mit
22kHz hat man auch bei 256 Punkten nur rund 80Hz Auflösung 40 find ich
da schöner und über 5kHz sind die Amplituden der Frequenzen auch nich
mehr sonderlich hoch, so dass es da auch nicht mehr all zu viel zu
sehen gibt.

von ape (Gast)


Lesenswert?

Mhmm also mit 128 Punkte FFT läuft das ganze jetzt aufm mega32 (nachdem
ich drauf gekommen bin das an bei den Interrupt-Vektoren jmp-Befehle an
Stelle der rjmp müssen). Für 256 Punkte muss man aber neben den Tabellen
auch noch alle Zähler die bis FFT_N zählen auf 16-Bit umbauen, damit sie
bis 256 zählen können und damit sind meine bescheidenen asm-Kenntnisse
leider erstmal etwas überfordert.

von Quark (Gast)


Lesenswert?

Hallo Benedikt,
Du machst doch viel mit dem M16C?
Lohnt es sich den FFT-Code zu portieren, dann hätte
man genug RAM für große Tabellen.
Was meinst Du, ist der Code schwer zu portieren?
Ich würde mich dann auch für den M16C interessieren.
Allerdings bringt Atmel auch immer schnellere, Codekompatible
MCs raus, brauche ichalso nur etwas zu warten.
Vielen Dank für Deine Meinung/Bewertung.
Grüüe
Quark

P.S. ich freue mich auch über die Meinung anderer.

von Benedikt (Gast)


Lesenswert?

M16C ist eben eine ganz andere Klasse als der AVR, nicht nur in der
Rechenleistung/Ausstattung, sondern auch im Preis und Gehäuse:
Unter 25€, 100 Pins bekommt man die normalen M16C nicht (es gibt
spezielle, abgespeckte Varianten, aber da hat man wieder das Problem
mit einer geeigneten Bezugsquelle).
Ich hatte schonmal einen C Code auf dem M16C ausprobiert und war
ehrlichgesagt enttäuscht. Eine 256 Punkt FFT hatte rund 0,5s gedauert,
obwohl nichtmal Fließkommazahlen verwendet wurden.
Auch von der Qualität her waren die Ergebnisse lange nicht so gut.

Ein speziell für den M16C optimierter Assembler Code müsste aber bei
24MHz mindestens doppelt so schnell laufen, wie auf dem AVR mit 16MHz,
nicht nur wegen den 16bit sondern auch daher, dass der M16 im gegensatz
zum AVR ein CISC uC ist, der u.a. über Barrelshifter o.ä. verfügt.

Falls es mal jemand versuchen sollte, ich wäre an dem Code
interessiert...

Andere Frage: Wo bekommt man eigentlich den MAX292 ?
Damit könnte man schön ohne aufwendige 256 Punkt FFT den gesamten
Bereich logarithmisch darstellen, indem man mehrere Messungen für
unterschiedliche Frequenzbereiche macht:
Eine 32 Punkt FFT für den Bereich <500Hz mit 16Hz Auflösung, dann
eine 32 Punkt FFT für den Bereich bis 10 oder 20kHz mit 300 oder 600Hz
Auflösung. Das sollte eine bessere Auflösung im unteren Bereich geben,
aber trotzdem schneller sein als ein 256Punkt FFT.

von Matthias (Gast)


Lesenswert?

Hi

ich bin mir nichtmla so sicher das der M16C soviel schneller ist als
ein AVR bei der FFT. Der AVR hat mit seinen schnellen FMUL-Befehlen ein
Möglichkeit zur sehr schnellen Multiplikation von Fixkommazahlen. Diese
fehlt dem M16C.

Matthias

von Benedikt (Gast)


Lesenswert?

Für eine 16x16 Multiplikation benötigt der AVR aber eine Menge Befehle,
für den M16 sind es weitaus weniger, es sollte daher schneller sein.
Ein großer Vorteil beim M16 ist die CPU Architektur mit einem sehr
schnellen Zugriff auf den SRAM und den Flash.
Der AVR benötigt für das Lesen eines Bytes aus dem Flash 187ns (bei
16MHz), beim M16C ist es nur die Hälfte für einen 16bit Wert. Insgesamt
sollte es also deutlich schneller werden, wenn man alles richtig
optimiert.

von Quark (Gast)


Lesenswert?

also ist das "Übersetzen" des Code nicht so einfach,
bzw. eine aufwendige Sache, schade, wäre interessant.
Was ein Barrelshifter frage ich hier lieber nicht
(ich suche mal selber (wiki)).
Sonst werde ich hier im Thread noch völlig OT.
Quark

von Benedikt (Gast)


Lesenswert?

Ein Barrelshifter ist im prinzip ein normaler Rechts/Linksshift, mit dem
Unterschied, dass man direkt angeben kann um wieviele Bits geschoben
werden soll. Das ist vor allem bei Multiplikationen/Divisionen mit 2^n
hilfreich und sehr viel schneller als Multiplikationen.
Ich weiß jetzt allerdings nicht, ob das für den FFT Code jetzt speziell
hilfreich ist, aber es sind eben die vielen Kleinigkeiten die alles
etwas beschleunigen.

von Matthias Waldhauer (Gast)


Lesenswert?

@VHDL:
Die meisten der von dir genannten Integer-FFT-Verfahren (und NTTs) sind
zwar gut geeignet, um z.B. große Integer-Zahlen (mod 2^n-1) zu
multiplizieren, aber für eine Frequenzanalyse leider ungeeignet.

Die hier oft zitierte "Integer-FFT" arbeitet ja nicht direkt mit
Integer-Werten, sondern mit per Integer-Datentyp repräsentierten
Festkommazahlen. Das hat sogar den Vorteil, daß z.B. Optimierungen im
Speicherlayout oder z.B. der Butterfly-Struktur (z.B. Split-Radix)
problemlos von Floating-Point-FFTs auf die Fixed-Point-Varianten
übertragen werden können.

von Winfried Alex (Gast)


Lesenswert?

Hallo,

falls einer das ganze mit dem MEGA64 oder 128 machen möchte (wegen mehr
RAM..) habe ich vor einiger Zeit kleine Adapterboards gemacht mit allem
drauf, was ein AVR zum Laufen benötigt. Eine zweite etwas größere
Version sogar mit ISP und JTAG-Steckverbinder. Alle Pins des AVR sind
auf Pfostenleisten gelegt, so daß auch mit Lochrasterplatinen
gearbeitet werden kann.

Infos dazu gibt es hier:
http://www.alex-elektronik.de/html/produkte.htm

Vielleicht hilft das ja jemandem von euch.
Gruß Winfried

von Matthias Asselborn (Gast)


Lesenswert?

ah wie ich sehe ist nun aus der digitalen Spec Analyzer Variante nun
doch was geworden g

von ape (Gast)


Angehängte Dateien:

Lesenswert?

So hab jetzt mal nen Versuchsaufbau mit LCD fertig (siehe Bild im
Anhang) Der mega32 auf dem Steckbrett macht die FFT (immernoch nur 128
Punkte) und sendet das Ergebnis an den mega128 auf dem STK500, welcher
dann das LCD ansteuert. Natürlich brauch man dafür keinen mega128 aber
der lag gerade rum :)
Das ganze würde sich natürlich auch von einem einzigen AVR erledigen
lassen (so wie beim Original), aber später soll der AVR der das Display
ansteuert noch eine ganze Menge mehr tun, so dass für die FFT nicht mehr
wirklich viel Zeit bleiben würde.
Der mega32 schafft übrigens 80 FFTs pro Sekunde, die auch alle auf dem
Display angezeigt werden.

von Paul (Gast)


Lesenswert?

Leider versteh ich von dem allen hier noch sehr wenig. Wäre mit einem
übertakteten AVR auch die anzeige von frequenzen um die 16-18khz
möglich? Ich wollte einen mono spectrumanalyzer mit 8-12Bändern von
40hz bis 16-18khz bauen, funktioniert sowas? oder sind die AVRs dazu
einfach zu langsam so dass ich auf analoge mittel zurückgreifen muss?

von ape (Gast)


Angehängte Dateien:

Lesenswert?

Hier nochmal das Display aus der Nähe

@Paul:
um Frequenzen von 40Hz bis 18kHz anzeigen zu können bräuchtest du eine
1024 Punkte FFT (20kHz / 40Hz = 500 Schritte d.h. 1024 Samples) da ist
sicherlich auch dieser Code nicht mehr wirklich shcnell, außerdem
bräuchtest du ne Menge externes RAM.
Eine andere Möglichkeit wären 2 FFTs, eine hochauflösende für diue
niedrigen Frequenzen und eine grobe für die hohen, wie es Benedikt
vorgeschlagen hat. Damit könnte es funktionieren.

von Benedikt (Gast)


Lesenswert?

@Matthias Asselborn

Wo hast du eigentlich deine LEDs gekauft ?
Diese sind bei meiner Version eigentlich das teuerste (>60€ nur für die
LEDs, vor allem da Reichelt die Preise von 9 auf 12Cent pro LED erhöht
hat...). Die restlichen paar Transistoren und die zwei uC ändern da
fast nichts mehr am Preis.
Hast du normale LEDs verwendet, oder irgendwelche Superhellen ?

Ich bin noch am Überlegen was ich verwende (32 Frequenzen mit je 16
LEDs ergibt 512 LEDs !) Matte LEDs sehen warscheinlich besser aus, aber
da macht mir die Helligkeit Probleme da ich mit einem 1/32 Multiplex
arbeite. Daher müssten die LEDs mindestens 150mA Spitzenstrom schaffen
um auf etwa 5mA mittleren Strom zu kommen.

von ape (Gast)


Lesenswert?

@benedikt: LEDs gibs oft bei ebay sehr günstig

von Matthias Asselborn (Gast)


Lesenswert?

habe 2mA led s verwendet vom reichelt platinen in bulgarien ätzen lassen
!

habe aber daheim auch noch samsung led dot matrix displays 3 farbig...

von Matthias Asselborn (Gast)


Lesenswert?

sendest du mir bitte mal einen schaltplan deiner version mit µC das
würde mich nun brennend interessieren !

bzw layouts oder codes ?

von Benedikt (Gast)


Lesenswert?

@Matthias Asselborn

Den Schaltplan werde ich warscheinlich erst erstellen wenn alles
läuft.
Bisher habe ich nur einen mega8 aufgebaut der die FFT macht und die
Daten über den UART an einen zweiten uC sendet. Dieser zweite uC (ein
AT89C2051) arbeitet als LED Displaycontroller um über zwei 74HC4094
Schieberegister mit Latch die 16 LED Zeilen anzusteuern. Die 32 Spalten
werden dann mit zwei 4-zu-16 Dekoder und MOSFETs angesteuert, immerhin
fließen hier über 2A pro Spalte.
Sobald das Ding läuft werde ich den Schaltplan und die Software hier
reinstellen. Erste Tests mit einem simulierten 32x16 LED Display am PC
waren auf jedenfall sehr vielversprechend.

Das ganze hat eigentlich nicht wirklich ein Nutzwert, sondern es ist
nur ein Dekorationsobjekt, das ich mir als Art "High-Tech Bild" an
die Wand hängen werde. Warscheinlich werde ich noch eine weitere
Software programmieren, die auf der 32x16 LED Matrix Texte oder eine
Uhr anzeigt.

von Paul (Gast)


Lesenswert?

ich scheue mich nicht davor gleich 2 oder 3 AVR's zu verwenden da die
ausgabe sowieso auf LEDs erfolgt. Nur schaff ich damit noch 50-60fps?
30-40 fps wären auch noch ausreichend aber darunter fängt alles an zu
stocken und sieht unschön aus. Angenommen man lässt die AVRs mit 24mhz
laufen, würden die das schaffen? Ein frequenzspektrum von 40hz bis nur
10khz ist doch etwas mager.. bis 16khz wollte ich mindestens gehen
damit ich wirklich alle bänder drin hab. Notfalls könnte ich für die 3
bänder über 10khz jeweils einen eigenen AVR verwenden

mfg Paul

von Benedikt (Gast)


Lesenswert?

@Paul
Der Frequenzbereich ist kein Problem, allerdings muss man beim ADC
aufpassen, der schafft max. 30-40kHz Samplerate für etwa 8bit
Auflösung.
Verwendet man einen größeren Frequenzbereich (z.B. 0-20kHz) so wird
dieser in 64 Frequenzen aufgetrennt, man hat also eine Auflösung von
312Hz, was vor allem im unteren Bereich nicht gerade hochauflösend
ist.
50-60Hz ? Für was denn ? Selbst irgendein Winamp Plugin schafft das
gerade mal so. 10fps reichen für eine flüssige Darstellung aus, und das
schafft der AVR sogar mit 16MHz. Die FFT Routine benötigt 7,3ms zum
Berechnen der 64 Punkt, so dass theoretisch 137fps möglich sind.

von ape (Gast)


Angehängte Dateien:

Lesenswert?

So hab jetzt auch noch ein Peakhold eingebaut. Die Peakwerte fallen mit
steigender Geschwindigkeit nach unten (so wie bei WinAmp)

@paul:
Naja wenn du 2 AVRs verwenden möchtest könnte der erste mit 10kHz
samplen mit einer 256 Punkte FFT (so sie denn irgendwann funktioniert)
ergäbe sich dann eine Auflösung von 40Hz bis zu einer Frequenz von
5kHz. Der zweite könnte mit 32kHz samplen. Das Ergebnis ginge dann dann
bis 16kHz mit 125Hz Auflösung. Damit sollten dann 30fps möglich sein
(reiner Schätzwert...)
Abgesehen von der Berechnung musst du dir dann aber auch noch Gedanken
über die Aufbereitung der Daten machen. Immerhin müsstest du dan
30mal/s 256 Werte aus 2 AVRs übertragen, diese Daten zu den einzelnen
Bändern zusammenrechnen und dann noch auf einem Display anzeigen.

von Benedikt (Gast)


Lesenswert?

@ape
Könntest du mal die Software dazu posten ?
Was ist das für ein LCD ? irgendein KS oder T6963 ?
Ich habe gerade mein altes 120x48 LCD wieder gefunden, und bekam direkt
Lust das ganze mal auszuprobieren.
Vielleicht werde ich das ganze auch mal an einem 128x64 OLED
ausprobieren, aber da muss ich erstmal schauen ob der uC das schafft,
denn das OLED hat keinen Controller und ist deshalb etwas CPU lastig.

von Paul (Gast)


Lesenswert?

Naja das ganze soll wie gesagt über LED's ausgegeben werden..

nur mittlerweile bin ich an der überlegung ob das mit analogtechnik
nicht sogar einfacher geht?

Wenn ich zb. einen 32 Band spectrum analyzer nehme und über ein
sinussignalgenerator alle frequenzen gleichmäßig durchlaufen lass,
laufen die frequenzen gleichmäßig über das display drüber? In dem fall
würde mir ein AVR der mit 32 Bändern der den Frequenzbereich von
0-20khz abdeckt schon ausreichen.

mfg Paul

von ape (Gast)


Angehängte Dateien:

Lesenswert?

Hier meine aktuelle Software. Ich hab mich bemüht die Software fürs LCD
halbwegs zu kommentieren :)
Mein LCD hat ein KS0108 Chipset und ich verwende zwar meine Lib, es
sollte aber dennoch nicht schwer sein ein anderes einzubinden, da ich
sämtliche Daten direkt ans Display sende, alles andere ist zu langsam.

von Benedikt (Gast)


Lesenswert?

@ape
Danke, werde ich mir mal anschauen und auf T6963 bzw. OLED
umschreiben...

@Paul
>Wenn ich zb. einen 32 Band spectrum analyzer nehme und über ein
>sinussignalgenerator alle frequenzen gleichmäßig durchlaufen lass,
>laufen die frequenzen gleichmäßig über das display drüber?

Ja, schau dir mal die beiden Videos ganz oben an, da wird genau das
gemacht.

Mit LEDs will ich es auch machen: 32Bänder, zu je 16LEDs.
Das ganze kann man natürlich auch analog machen, das sieht dann so aus
und kostet eine Kleinigkeit mehr (irgendwo im Anhang sind ein paar
schöne Fotos von Matthias Asselborn):
http://www.mikrocontroller.net/forum/read-1-31511.html

von Paul (Gast)


Lesenswert?

ok dann ist ja wunderbar :) geht das mit einem einzelnen AVR? Der AVR
hat nur 8 Ausgänge wie splittest du die auf 32? und vor allem wie
steuerst du die jeweils 16 LED's an? LED-Treiber? Das wäre ja fast der
gleiche aufwand wie beim analogen :S

so ein Spectrum analyzer muss im Partykeller der Hit sein :)

mfg Paul

von ape (Gast)


Lesenswert?

oh ich seh gerade noch nen kleinen Bug, der oben definte Wert PEAK_SPEED
wird gar nicht verwendet. Der muss in Zeile 88 an Stelle der beiden 6
eingefügt werden.

von Benedikt (Gast)


Lesenswert?

Ich steuere die 32x16=512 LEDs im Multiplex mit einem zweiten uC an (1.
uC macht die FFT, der zweite die Displaysteuerung.)
Die 16 Zeilen steuere ich mit zwei 8bit Schieberegistern und 16
Transistoren, die Zeilen mit zwei 4 zu 16 Dekoder und 32 MOSFETs.
Insgesamt also 2 uC und 4 CMOS ICs neben ein paar Transistoren, MOSFETs
usw.
Und wenn du diese Schaltung mit der analogen vergleichst, erkennst du,
dass die mit uC viel einfacher ist...

Allerdings ist die Schaltung noch nicht fertig, im Moment verwende ich
noch 16x10 LEDs um schonmal die Schaltung testen zu können.

von ape (Gast)


Lesenswert?

Noch nen Bug :P
In Zeile 115 muss ein <= an Stelle eines < hin
es muss heißen:

if(j <= peak[i] && peak[i]-j < 8) {

Sonst verschwinden die Peak-Werte alle 8 Pixel kurz

von philip (Gast)


Lesenswert?

könntet ihr einen kompletten schalt plan für 16x64 leds machen also
64band, a 16LEds ?

so das man das ganze relativ einfach zusammen bauen kann ?


gruß philip

von Matthias Asselborn (Gast)


Lesenswert?

n 12x28 oder 32 würde ja auch schon reichen
aber das lässt sich ja variieren

von ape (Gast)


Lesenswert?

So hab jetzt die Kommunikation auf TWI umgestellt. Das Ergebnis der
letzten FFT kann jeder Zeit ausglesen werden, allerdings kann es
vorkommen, das während des Auslesen die nächste FFT fertig ist und dann
die erste Hälfte des ausgelesenen Spektrums von der letzten FFT stammt
und die zweite von der aktuellen, aber das fällt auch nicht weiter
auf.
Die Übertraung der 64 Spektrum-Werte dauert bei vollem TWI-Speed
(immerhin 512kHz bei 18,432MHz) gerade mal 1,3ms.
Dadurch das die Übertragung per UART wegfällt (die TWI-Übertragung
läuft im Gegensatz zu der Übertragung via UART interrupt-gesteuert im
Hintergrund ab) schafft der FFT-AVR jetzt knapp 85 Berechnungen pro
Sekunde und das auch nur, weil er warten muss bis der Sampling-Buffer
neu gefüllt ist, mit höherer Sampling-Rate wäre noch mehr drin.
Last but not least, macht das Display jetzt knapp über 70fps, da die
Übermittlung des Spektrums schneller von statten geht und die Wartezeit
bis zur nächsten Übertragung wegfällt.

@philip:
16x64 LEDs, das wären ja 1024 Stück...
viel Spaß beim "einfach zusammen bauen", von den Kosten und der
Stromaufnahme mal ganz zu schweigen :)

von philip (Gast)


Lesenswert?

hehe ja das habe ich auch grade gesehen... ^^ ups ja 64 kanal bekomme
ich net unter lach...

nein 12x32... oder 16x32... werde ich bauen das ist noch machbar...
strom verorgung währ kein problem ^^ ich werde vermutlich ein kelineres
PC netzteil verbauen.. habe noch eins ohne lüfter....
das ist schön leise und liefert genug :)

jetzt muss ich nur drauf warten das einer schalt pläne macht,
damit ich alles ätzen lassen kann :)

von Paul (Gast)


Lesenswert?

Für die LEDs empfehle ich so vielfachLEDfassungen da man die LEDs sonst
schwierig exakt gerade in eine reihe bekommt.

von Matthias Asselborn (Gast)


Angehängte Dateien:

Lesenswert?

ach ja ich poste anbei mal Fotos @ Steuerung , Display !
Frontplatte usw...

von Matthias Asselborn (Gast)


Angehängte Dateien:

Lesenswert?

anbei neue bilder von jetzt
gruß Matthias Asselborn

von Matthias Asselborn (Gast)


Lesenswert?

nun sollte die Frage beantwortet sein :-)
von wegen LED Fassungen....

von ape (Gast)


Angehängte Dateien:

Lesenswert?

So sitz jetzt gerade an der 256 Punkte Version... Den Zähler in der
adc_isr habe ich bereits umgebaut, der in do_window ist auch kein
Problem, in do_fft und make_bars wird immer nur FFT_N/2 geladen, das
ist also eigentlich auch kein Problem.
Dennoch funktioniert das ganze nicht. Ich vermute das das u (bzw. XH)
in do_fft der Übeltäter ist und im Verlauf der Schleifen bis FFT_N
zählt. Da wird die Sache dann aber wirklich gemein, da mit XH auch
multipliziert wird und ich nicht weiß wie man in asm eine
Multiplikation mit einem 16-bit Wert realisiert. Hat da jemand nen
Tipp?
Im Anhang mal mein momentaner Code.

von thkais (Gast)


Lesenswert?

mul AL,XH  ; T10L = u*4

Wenn der Kommentar  " u*4 " stimmt, kann man diese Multiplikation mit
zwei Shifts ersetzen (immer noch schneller als eine 16x16 Bit
Multiplikation).

Um mit einem 8-Bitter eine 16Bit-Multiplikation auszuführen, muß man
(um den Hardware-Mul-Befehl nutzen zu können) die Faktoren in  Summen
zerlegen, einzeln multiplizieren und dann wieder zusammensetzen.
Dann kommen aber 4 Mul-Befehle zusammen, nebst einigen 32-Bit -
Additionen. Wenn man den Wertebereich des Ergebnisses auf 16 Bit
begrenzen könnte, würde es einfacher werden.
Ob das 100% ig richtig ist, müßte ich aber erst mal nachlesen, ich habe
irgendwo ein Buch herumliegen, in dem der Algorithmus drinnen ist - aus
dem Kopf weiß ich ihn momentan nicht.

von ape (Gast)


Lesenswert?

mhmm wenn ich mir das nochmal genauer angucke is mir da sganze eh ein
ziemliches Rätsel wo kommt überhaupt das AL her, das wird in dieser
Routine vorher gar nich initialisiert und dann multipliziert er einfach
damit...
Naja ich denke ich werds dann jetzt doch erstmal bei den 128 Punkten
belassen und mal den von Benedikt vorgeschlagenen Weg mit 2 FFTs
ausprobieren, einer hochauflösenden für den unteren Bereich und einer
gröberen für die hohen Frequenzen.

von Hagen (Gast)


Lesenswert?

D.h. du sampelst mit 22Khz den Inputbuffer voll. Die hochauflösende 128
FFT geht über diesen Buffer. Die niedrig auflössende FFT geht dann zB.
über 4 solcher Buffers, wobei aber immer 4 Samples zu einem Sample
zusammengefasst wurden. Die effektive Samplingrate wäre dann
22Khz/4=5.5Khz mit 128 Punkten FFT. Der ADC sampled nur einen Kanal mit
22KHz. Pro 4 hochauflösende FFT's fällt eine niedrig auflösende FFT
an.

Oder wie möchtest du das machen ?

Gruß Hagen

von Benedikt (Gast)


Lesenswert?

Meine Idee ging anderst:
Wenn man einfach mit einer niedrigeren Samplerate aufzeichnet bekommt
man Störungen, da das Eingangssignal auf halbe Samplerate begrenzt sein
muss, daher war in der Orginalschaltung auch ein steiler Switched
Capacitor Tiefpass mit einem MAX292 eingebaut.
Um mit zwei unterschiedlichen Samplerates aufzuzeichnen muss man auch
die MAX292 Taktfrequenz verändern.
An sich kein Problem, aber wo bekommt man das IC zu bezahlbaren Preisen
?

von Philip (Gast)


Lesenswert?

warum baut ihr das ganze nicht einfach mit mehreren avrs auf ? ist doch
viel einfacher...

ein paar avrs um das signal zu verarbeiten (FFT) und dann einen avr der
das ganze dann zusammen fast... auf 1-2 avrs kommt es mit sicherheit
nicht an...

von ape (Gast)


Lesenswert?

Ziemlich genau so hatte ich mir das vorgestellt.
Ich nehme 2 Sample-Buffer. Im 1. Buffer landet jeder ADC Wert, im 2.
nur jeder 4. Wenn der erste buffer voll ist startet die erste (loRes)
FFT. Danach hatte ich ursprünglich vor einfach zu warten, bis der
zweite voll ist, aber es is natürlich sinnvoller die Zeit mit was
nützlichem zu verbringen und die loRes FFT upzudaten. Obwohl der
Controller nicht alle 4 schaffen dürfte, aber 2 Durchgänge sollten
schon drin sein. Wenn der zweite Buffer dann jedenfalls voll ist wird
die hiRes FFT berechnet und danach gehts wieder von vorne los.
Die hiRes FFT hätte dann jedenfalls einen Frequenzbereich von 0-2,75kHz
in 43Hz Schritten. Bei der loRes würden die Werte bis 11kHz in 172Hz
Schritten gehen.

von Benedikt (Gast)


Lesenswert?

Die AVRs sind nicht das Problem, sondern der Tiefpassfilter, der
ausreichend steil sein muss. Mit einem RC, bzw. LC Tiefpass kommt man
leider nicht sehr weit.
Auf dem oberen Video sieht man gut, dass der Balken beim Sinuston bis
ganz nach rechts läuft, und dann wieder ein Stück zuück bis er
verschwindet. Bei einem RC Tiefpass läuft der Balken 5-6 mal hin und
her, bis er annähernd verschwunden ist.

von Hagen (Gast)


Lesenswert?

@Ape: ok, das Vorgehen halte ich für die beste Lösung.

Du sampelst mit 22Khz jeweils 128 Samples in den Buffer der schnellen
FFT und führst diese wie bisher aus. Zusätzlich werden jeweils 4
succesive Samples in einer Variablen addiert und dann durch 4 geteilt.
Dieser Wert landet in einem zweiten 128 Samples Buffer. Wenn der voll
ist sind 4 schnelle FFT's vergangen und nun folgt noch eine 128 Punkte
FFT zusätzlich. Du benötigst also 25% mehr Rechenzeit relativ zu deinem
jetzigen Code. Dafür nichts mit zusätzlicher Hardware oder erhöhtem ADC
Aufwand.

Du könntest natürlich auch jweils 5, 6 usw. Samples zusammenfassen und
somit nur 1/5'tel oder 1/6'tel mehr Rechenzeit verbrauchen. Ich würde
aber 2,4 oder 8 Samples vorschlagen da sich damit besser der Duchschnitt
berechnen liese.

Alternativ könnte man auch die jeweils 4'te, 5'te usw. schnelle FFT
ausfallen lassen und statt dessen die FFT über den zweiten Buffer
berechnen. Das dürfte bei deinen jetzigen 70 fps nicht sehr auffallen.
Und gerade die tieferen Frequenzen folgen eher einem langsammeren
Rhythmus. Somit würde sich an der Performance garnichts ändern.

Gruß Hagen

von ape (Gast)


Lesenswert?

Ja stimmt der Tiefpass ist in der Tat nen Problem. Man kann nen 8th
Order Tiefpass auch diskret mit 4 Ops aufbauen, aber da ist dann halt
die Trenn-Frequenz nicht einstellbar.
Im übrigen würde ich die Verwendung mehrerer AVRs zum Berechnen gerne
vermeiden, obwohl es durch die Kommunikation über TWI sehr leicht zu
realisieren wäre.

von ape (Gast)


Lesenswert?

@Hagen: Ist eine Mittelwert-Bildung der letzten 4 Werte für den
langsamen Buffer wirklich nötig? Wenn ich den AD-Wandler Speed
runterdrehen würde würde ich auch immer nur den momentanen Wert
erhalten. Oder lassen sich durch die Mittelwertbildung die störenden
Auswirkungen der höheren Frequenzen verringern?

von Paul (Gast)


Lesenswert?

So langsam bin ich irritiert :D

Matthias Asselborn, wie hast du den eine so schöne Front
herbeigezaubert? ;)

Btw: ich versteh die LED ansteuerung noch nicht wie man so viele LEDs
mit nur so einer kleinen Leiste ansteuern kann. Ausserdem wie bekommst
du es hin dein Frequenzspektrum so genau aufzuteilen? Du hast da ja
sehr viele Frequenzen mit verschiedenem abstand zueinander.

Bei meinem wissensstand wird das wohl leider nie was :-/

mfg Paul

von Benedikt (Gast)


Lesenswert?

@Ape
Die von dir vorgeschlagene Methode, nur jeden 4. Wert zu nehmen
funktioniert wegen dem fehlen Tiefpass nicht, da dies nur Undersampling
aber kein richtiger Tiefpass ist. Man müsste daher aus den gesampleten
Werten über einen Software Tiefpass mit etwa 1-2kHz nur die tiefen
Frequenz rausfiltern, aber ich bin mir nicht sicher ob das nicht mehr
Rechenleistung benötigt als die eigentliche FFT.

Eine andere Lösung wären die zwei getrennte Opamp Tiefpässe (einer mit
10kHz für die normale FFT mit 20kS/s und ein zweiter Tiefpass mit 1kHz
der an einem anderen ADC angeschlossen wird für die FFT mit etwa
2,5kS/s. Das ergäbe dann eine Auflösung von 10Hz im Bereich <500Hz !

von Matthias Asselborn (Gast)


Lesenswert?

gewusst wie :-)

ich warte allerdings nur noch auf den source
einer fft
selber bin ich gerade beim thema furier analyse
evtl klärt sich dann was auf
die funktions weise usw...

von Benedikt (Gast)


Lesenswert?

@Matthias Asselborn
Ich vermute mal du hast analoge Filter verwendet. Irgendein AVR
digitalisiert die Werte und steuert die LEDs im Multiplex an ?

von Hagen (Gast)


Lesenswert?

die Mittelwertbildung ist unbedingt nötig ansonsten reduziert sich nicht
die Samplingfrequenz. Der Trick den du anwenden willst basiert ja auf
der Reduzierung der Samplingfrequenz.
22Khz Samplingfrequenz -> 11Khz / 128 = 86 Hz Bandbreite pro Schritt,
Grenzfrequenz 11Khz.
Reduzierung 22Kz/4 -> 2.75Khz / 128 = 21Hz Bandbreite pro Schritt,
Grenzfrequenz 2.75Khz.

Die ersten 32 Samples mit 11Khz werden durch die 128 Samples mit
2.75Khz überdeckt. Dein Display würde also 128 Samples mit 21Hz
Bandbreite plus 96 mit 81Hz Bandreite anzeigen -> 224 Samples. Die
ersten 128 Samples zeigen die tiefen Frequenzen bis 2750Hz, die
nachfolgenden 96 Samples zeigen die Frequenzen zwischen 2750-11000Hz.

Die Mittelwertbildung ist nicht die beste Methode aber die einfachste.

Wenn du mit einem ADC bei 22Khz samplest so arbeitet er pro Sample wie
ein Buffer der 1/22000 Sekunde den Analogwert buffert. Wenn du mit
5.5Khz sampelst so hält der ADC für 1/5500 Sekunde den analogen Wert.
Da die meisten ADC per succesiver Approximation arbeiten und so einen
Buffer benötigen verhält sich das wie eine Mittelwertbildung über den
Zeitbereich eines Samples.

Bei der Mittelwertbildung passwiert doch folgendes:
Stelle dir mal 11Khz bei 22Khz Sampling vor. Wir haben dann Werte im
Buffer wie 0,+127,0,-127, eben 11Khz. Nun bilden wir den Mittelwert zu
einem virtuellem Downsampling von 22Khz/4 = 5.5Khz. Sprich bilden den
Mittelwert von obigen 4 Werten -> 0 + 127 + 0 + -127 == 0 ! Eine 11Khz
Frequenz virtuell down-sampled auf 1/4 würde Samples aus lauter Nullen
ergeben -> ergo die 11Khz sind rausgefiltert worden.

Soweit habe ich das zumindestens verstanden :)

In deinem Falle stellt das ja kein großer Aufwand dar. Probiers doch
einfach :)

Gruß Hagen

von ape (Gast)


Lesenswert?

Jup das werd ich...
Hab übrigens gerade 2 MAX297 bekommen. Direkt bei Maxim als Muster
bestellt, da ich sie sonst wirklich nirgendsow gefunden habe. Ich hab
den 297 genommen weil der nur die halbe Frequenz benötigt.

von ape (Gast)


Lesenswert?

@Hagen: Du musst deine Werte alle durch 2 teilen, da ja bei einer FFT
immer nur halb so viele Werte rauskommen wie man reinsteckt, in diesem
Falle also 64 ;)

Habe jetzt jedenfalls 2 FFTs nach obigem Schema laufen. Auf dem Display
werden alle 64 Werte der hochauflösenden FFT und die letzten 48 Werte
der zweiten FFT dargestellt (der Frequenzbereich der ersten 16 Werte
wwird ja von der ersten FFT abgedeckt). Das Ergebnis ist aber eher
mäßig. Am meisten stören die hohen Frequenzen bei der hiRes FFT. Diese
werden zwar durch die Mittelwertbildung gedämpft, aber sind halt
trotzdem noch sehr deutlich zu sehen. Bei Musik fällts nicht so auf,
aber wenn man einen Ton "durchs Spektrum laufen lässt", sieht man es
doch sehr deutlich. Ich denke ich werde da noch mal probieren die FFTs
nacheinander zu machen und die Trennfrequenz des MAX297 zu verändern.
Außerdem stört mich noch der sehr abrupte Übergang von hochauflösend zu
niedrig auflösend, neben den unterschiedlichen Frequenzschritten sind
auch die Amplituden der Balken etwa sunterschiedlich, wodurch sich eine
kleine Stufe im Spektrum ergibt.
Auf jeden Fall ist aber die Auflösung im niedrigen Frequenz-Bereich
verdammt hoch, das würde ich schon gerne beibehalten.
Dennoch würde eine 256 Punkte FFT ein viel schöneres Bild liefern :)

PS: Der Maxim-Stein is schon echt gut, aber leider rauscht er ganz
schön, ich weiß nich ob ich was falsch gemacht habe (soviel gibs da ja
nich was man falsch amchen könnte), aber die im Datenblatt angegebenen
77dB SNR erreicht meiner mit Sicherheit nicht.

von Matthias Asselborn (Gast)


Lesenswert?

@Benedikt ja so ist es aber wenn nun die fft schon mal funktioniert
lässt sich das ganze schnell umbauen !

von Hagen (Gast)


Lesenswert?

>Am meisten stören die hohen Frequenzen bei der hiRes FFT. Diese
>werden zwar durch die Mittelwertbildung gedämpft, aber sind halt
>trotzdem noch sehr deutlich zu sehen.

Bei einer 256 Punkte FFT wird das besser, allerdings steigt eben auch
der rechnerische Aufwand. Das Problem ist das "downsampling", du
reduzierst ja von 22Khz auf 22/4Khz. Wenn du zb. mit 22/4Khz samplest
würdest du die gleichen Effekte bei hohen Frequenzen sehen. Bei zb.
11Khz Messfrequenz hat das Downsamlping die fast gleichen Effekte wie
ein direktes Sampling mit 22/4Khz. Man kann dies verbessern wenn man
statt dem Mittelwert über die 4 Samples eine Interpolation des
Mittelwertes über zB. 12 Samples macht. Dabei versucht man also den
genaueren zeitlich bezogenen Sample-Wert zu bestimmen.
Ein anderer einfacher Trick wäre die Nulldurchgangssynchronisation. Man
verschiebt also die 4 Samples um +-3 Samples im Buffer, aber so daß
deren erster Durchschnittswert +-0 ergibt. Man synchronisiert also das
Downsamling realtiv zu Inputmeßfrequenz. Das würde das Messen einer
einzelnen Frequenz verbessern, aber nicht bei einem Frequenzgemisch wie
bei Musik.

Dein jetziges Verfahren hat also den entscheidenen Vorteil das es
schneller als eine 256 Punkte FFT bei 22Khz ist. Im Vergleich benötigt
es Sqrt(256 Punkte FFT) * 1.25 an Zeit zu einer vollständigen 256
Punkte FFT. Wenn also 2ms pro 128 FFT = 5*2 = 10ms für einen Duchlauf
benötigt wird dann benötigt eine 256 FFT 16 ms.

Gruß Hagen

von ape (Gast)


Angehängte Dateien:

Lesenswert?

Mhmm, also die Variante mit den beiden Sampling-Frequenzen nacheinander
scheint besser zu funktionieren. Im Anhang mal meine aktuelle Version
Echt erstaunlich wie schnell der MAX297 auf ein umschalten der
Steuerfrequenz reagiert.
Einziger Nachteil ist das die niedirg auflösende FFT nun "nur noch"
genauso oft berechnet wird wie die hochauflösende. Beide werden jetzt
etwas mehr als 30mal pro Sekunde berechnet. Das einzige was mich noch
stört ist, dass der AVR 15ms pro Durchgang (ungefähr die Hälfte der
Zeit!) damit verbringt auf das Füllen des "langsamen" Buffers zu
warten.
Ein Teil der Zeit lässt sich dazu verwenden die beiden Ergebnisbuffer
zusammenzurechnen (mit pseudo logarithmischem Maßstab), aber danach
wird immer noch ne ganze Menge übrig sein.
Das rauschen des Tiefpasses hab ich auch etwas vermindert, in dem ich
vorm Tiefpass die Amplitude des Signals mit dem integrierten OpAmp
verdopple und hinterher wieder mit 2 Widerständen halbiere.

von Matthias Waldhauer (Gast)


Lesenswert?

@Tiefpass:

Für einen C64-Emulator habe ich den Tiefpass etwa so realisiert (hier
ohne Resonanz):

Diff:=Sample-TPass;
TPass:=TPass+Diff*Faktor;

Der Faktor sollte sich im Intervall [0,0;1,0] bewegen, wobei 0,0 alles
wegfiltern würde und 1,0 gar nichts.

von Paul (Gast)


Lesenswert?

in welchem preisbereich würde sich ein zb. 10x10 Spec mit einem AVR
bewegen? Und wie viel Khz sind schon möglich?

von Benedikt (Gast)


Lesenswert?

@Paul:
Wie oft denn noch: Die Frequenz ist nicht das Problem, mit einem
externen ADC sind über 1MHz möglich.
Um was es hier geht: Die Auflösung von diesem Frequenzbereich zu
vergrößeren, da der Bereich im Moment in 64 Teile zerlegt wird.

Der Preis, kommt darauf an wie du das anzeigen willst. Ich sag mal
mega8 + Anzeige, das können 10€ sein, aber auch 1000€ wenn du die
Anzeige gerne 10x10m groß hättest...

von ape (Gast)


Lesenswert?

Bin jetzt so einigermaßen fertig (mit dem Ding und den Nerven) :)
Während der AVR auf das Füllen des langsamen Buffers wartet fasse ich
die Ergebnisse der beiden FFTs zu einem zusammen. Das resultierende
Spektrum hat dann 78 Werte.
Alle 3 Spektren werden ca. 30 mal pro Sekunde refreshed.
Außerdem habe ich auch die Berechnung der Peakwerte in den FFT AVR
verlagert. Das Übertragen der Werte über TWI dauert zwar vermutlich
länger als wenn ich sie direkt in der Anzeige-Routine berechnen würde,
aber es sparrt Speicher im AVR der das Display managed. Dafür benötigt
der FFT AVR aber neben den Buffern für die Peaks und ihre
Geschwindigkeiten auch noch temporäre Level-Buffer. Es würde zwar auch
ohne gehen, aber dann müsste das ganze direkt im Anschluss an die
jeweilige FFT geschehen und könnte nicht bis zu dem Zeitpunkt warten,
wo der AVR auf das Füllen des Sample Buffers wartet. Wie auch immer es
ist jedenfalls immer noch jede Menge SRAM übrig.
Den Sourcecode gibs, wenn ich den TWI Kram noch etwas verbessert habe,
man kann noch nicht auswählen, welches Spektrum man nun bekommen
möchte...

Hab mal nen kleines Video gemacht. Sorry wegen der miesen Qualität und
dem leisen Ton, aber mehr gibt meine Digicam nich her, außerdem möchte
ich ja nicht von der Musikindustrie verklagt werdenn :)

http://www.apetech.de/download/test.avi

von Benedikt (Gast)


Lesenswert?

Nicht schlecht...

Vielleicht klaue ich mir den Code für mein Projekt, aber erst muss ich
mal das 32x16 LED Array bauen und mir ein paar MAX 29x besorgen..

von Matthias Asselborn (Gast)


Lesenswert?

durfte man den code erfahren ?
gruß matthias

von philip (Gast)


Lesenswert?

könnte einer fürn 32x16 oder 32x12 oder ovn mir aus auch nur 28x12 oder
28x16 LEDs einen schalt plan machen ?

von ape (Gast)


Lesenswert?

@Matthias:
Wie gesagt noch nen bissel Feinschliff dann gibs die neue Version. Du
kannst auch den letzten Code nehmen da musst du dann nur selber die
Werte zusammenrechnen...

@philip: ich nehm 20€ pro Stunde, dann können wa nochma drüber reden.
Mal ernsthaft: meinst du nich das die Leute hier nichts anderes zu tun
haben als dir nen Display nach deinen Wünschen zu entwickeln?

von Matthias Asselborn (Gast)


Lesenswert?

@ape

was meinst du mir Feinschliff ?
mal eine grundlegende Frage
habe ja den Thread mal vor einem Jahren
aktiv mitverfolgt
nun meine 1. frage
auf welcher hardware bassiert denn der spec ?
einem Atmel bzw einem externen digital analog Wandler ?
reicht nun die Geschwindigkeit die ein Atmel hat
bzw die Genauigkeit eines AD wandlers !
wie genau und welche Displays steuerst du an
ist der Code in C ? das wäre super denn das beherrsche ich !

Gruß Matthias

von ape (Gast)


Lesenswert?

mhmm also schon, obwohls ein von vorn durchlesen des Threads auch tun
würde ;)

Das ganze basiert auf einem mega32, der 2 128 Punkte FFTs durchführt.
Die erste mit 5,5kHz Sampling-Frequenz, die zweite mit 22kHz. Die erste
liefert ein recht hochaufgelöstes Spektrum des unteren Frequenzbandes
(64 Werte; von 0 bis 2,75kHz in 43Hz Schritten), die zweite FFT erzeugt
ein wesentlich gröberes Spektrum, das dafür aber bis 11kHz reicht
(wieder 64 Werte; von 0 bis 11kHz in 170Hz Schritten).
Die beiden Spektren werden dann zu einem dritten zusammengerechnet um
ein möglichst breitbandiges Spektrum mit einer vernünftigen Auflösung
im unteren Frequenzbereich zu erhalten.
Bei der Zusammenfassung der beiden Spektren, werden die 22 ersten Werte
des ersten Spektrums direkt kopiert, aus den folgenden 42 Werten wird
der größere Wert aus je zweien  kopiert. Danach werden wieder 22 Werte
aus dem zweiten Spektrum direkt kopiert und von den verbliebenen jewils
der größere aus zweien, wobei aber erst beim 16. Wert begonnen wird, da
der Bereich davor bereits vom ersten Spektrum abgedeckt wurde. Das
resultierende Spektrum sieht dann also ungefähr so aus: Werte 0-21:
0-946Hz; Werte 22-42: 946-2,75kHz; Werte 43-65: 2,75-6,5Hz; Werte
66-78: 6,5-11kHz. Ich hoffe das war jetzt einigermaßen nachvollziehbar
:)
Diese etwas umständliche Methode hat jedenfalls den Vorteil, dass sie
mit 128 Punkte FFTs auskommt. Problem bei der Sache ist aber das
während der hochauflösenden FFT keine Frequenzen über 2,75kHz am
AD-Wandler liegen dürfen. Daher ist noch ein einstellbarer
Tiefpassfilter (z.B. MAX297) notwendig, dessen Trennfrequenz man immer
zwischen 2,75 und 11kHz umschaltet. Eine Alternative wäre für jede FFT
einen eigenen AD-Wandler Kanal zu verwenden und dann die Tiefpassfilter
diskret mit fester Trennfrequenz aufzubauen, diese sollten dann aber
auch 8ter Ordnung sein.
Zum AD-Wandeln wird jedenfalls der interne ADC verwendet, die Auflösung
ist mehr als ausreichend. Ich ziehe von den resultierenden
Spektrumwerten sogar immer noch 1 ab, damit das rauschen des MAX297
nicht mehr zu sehen ist.
Die drei Spektren werden jedenfalls rund 30 mal pro Sekunde berechnet
und lassen sich gemeinsam mit den Peakwerten zu jedem beliebigen
Zeitpunkt über das TWI Interface auslesen. Das Video oben zeigt das
zusammengefasste Spektrum.
Der FFT-Code ist vollständig in Assembler geschrieben. Eine
vergleichbare FFT in C ist um Größenordnungen langsamer.
Das Auslesen des AVRs über das TWI-Interface und die Ausgabe auf dem
Display (128x64 Pixel; KS0108 Chipset) sind aber in C geschrieben.

Wie auch immer, für ein Spektrum-Analyzer wie du ihn deinen Fotos nach
im Sinn hast wird das ganze wahrscheinlich nicht wirklich brauchbar
sein, da das Spektrum halt keinen richtigen logarithmischen Maßstab
hat. Als optische Spielerei in einem Verstärker oder auch mit
LED-Display an der Wand ist das ganze aber mehr als ausreichend.

So ich hoffe damit sind die meisten Fragen beantwortet ich geh jetzt
schlafen. Den Sourcecode gibts wenn die Ansteuerung über das
TWI-Interface fertig ist -> Schätzungsweise morgen.

von ape (Gast)


Angehängte Dateien:

Lesenswert?

So fertig.
Jedenfalls erstmal. Im Anhang befinden sich der Quellcode für den FFT
AVR, sowie eine kleine C-Library um mit dem Ganzen übers TWI zu
kommunizieren und ein kleines Demo Prog, das das zusammengefasste
Spektrum auf einem KS0108 LCD ausgibt.
Falls jemand Bugs findet immer her damit habs noch nicht sonderlich
ausgiebig getestet.

von Matthias Asselborn (Gast)


Lesenswert?

vielen dank meine erste arbeit wird sein das ganze auf LED s auszugeben
!!!!

gruß matthias

von Matthias Asselborn (Gast)


Lesenswert?

kleine frage wo häng ich s display dran ? welche pins ?

von ape (Gast)


Lesenswert?

Ist in der ks0108.h defined.

Im Moment hängen die 8 Datenlaitungen an PORTC, die steuerpins wie
folgt:
D/I: PC0
R/W: PC1
EN:  PC2
CS1: PC3
CS2: PC4

Das Testprogramm ist fürn mega128, müsste aber auch auf jedem anderen
mega laufen, muss man halt nur das makefile anpassen und rebuilden.

Ich hab übrigens beim Schaltplan für den FFT AVR den Programmier- und
den TWI-Stecker vergessen, aber das sollte ja wohl jeder hinbekommen :)
Die TWI-Pullups nicht zu groß wählen, da der Bus mit recht hoher
Geschwindigkeit läuft. 3k3 funktionieren bei mir wunderbar.

von Matthias Asselborn (Gast)


Lesenswert?

gingen 10 er auch ? di hab ich grad noc rumfahren aber ich beende für
heute evtl morgen abend andere besorgen

von ape (Gast)


Lesenswert?

10er?
es sollte jedenfalls alles vom mega8 an gehen. muss halt nur genug pins
für das LCD und ne TWI Schnittstelle haben

von Matthias Asselborn (Gast)


Lesenswert?

nein ich meinte 10k ;-)

von ape (Gast)


Lesenswert?

ah ok :)
fürs TWI? naja probieren kost nichts aber ich schätze die sind zu groß

von ape (Gast)


Lesenswert?

Man kommt übrigens auch ohne die negative Versorgungsspannung am MAX29x
aus. Dafür grounded man V- und legt den GND-Pin über einen
Spannungsteiler aus 2 10k Widerständen auf VCC/2. Die Konstruktion mit
dem OpAmp um die Amplitude zu erhöhen funktioniert dann zwar nicht mehr
ist aber auch gar nicht mehr nötig, da er mit der niedrigeren Spannung
weniger rauscht (vielleicht war auch einfach nur meine negative
Spannung nicht ganz sauber)

von Matthias Asselborn (Gast)


Lesenswert?

ich habe mal eine frage !

der eigentliche fft ist doch in assembler ?
das display dann in c oder verstehe ich da was falsch ?

von ape (Gast)


Lesenswert?

ja
aber FFT und Display laufen ja auch auf 2 verschiedenen AVRs also ist
das ja auch gar kein Problem. Wenn man sich die Mühe machen würde die
FFT in asm Library umzubauen könnte man das auch direkt in einem C
Programm verwenden.

von Matthias Asselborn (Gast)


Lesenswert?

gut das ist mir bewusst
also lasse ich den atmega 32 auf jedenfall bestehen und ändere nur den
c source um ! auf led s !
ja bald sind ferien da hab ich aber auch nicht wirklich zeit
anfang studium !

von philip (Gast)


Lesenswert?

dumme frage,

aber könnte einer mal ne ganze einfache rutine in c posten,
mit der man eine frequenz auf LEDs ausgeben kann ? damit ich mir mal
ein bild machen kann, und es dann erweitern kann... komme so nicht gnaz
klar...

währ net wenn hier einer mal was posten würde was er schon hinbekommen
hat....

gruß philip

von Matthias Asselborn (Gast)


Lesenswert?

ich habe mal ein VU meter geproggt
aber das mit nur EINER frequenz wird schwierig weil man die gesamte fft
auseinandernehmen müsste
bzw funktionierend wie ein bandpass proggen
ich habe nun zwar eine woche ferien
aber nicht die zeit die fft auf diverse frequenzen aufzuspalten !
wobei ich mir erst mal intensiv den code anguggen müsste

von philip (Gast)


Lesenswert?

funzn das mit einer frequent scho gut ? wenn ja schicks mir doch bitte
einfach per icq weisst ja wo du mich findest ;)

von Benedikt (Gast)


Lesenswert?

@philip
Willst du ein VU Meter ? Oder warum brauchst du die Anzeige einer
Frequenz ?


PS: Bald gibt es ein paar Fotos von meinem 32x16 Spektrum Analyser. Die
Software ist schon fertig, die Ansteuerung auch, ich warte nur noch auf
die Lochrasterplatinen von Reichelt für die LED Matrix: gestern kam die
Email: voraussichtlicht ab 25.02.05 lieferbar...

von Matthias Asselborn (Gast)


Lesenswert?

hallo dürfte ich den Code und die Pläne mal sehen

von Matthias Asselborn (Gast)


Lesenswert?

apropos hätte ich noch 16x16 er matritzen ( inkl widerstände und
transistoren) alles auf der platine günstig abzugeben ! da ich sie
nicht mehr benötige !

von Matthias Asselborn (Gast)


Lesenswert?

marke samsung

von Matthias Asselborn (Gast)


Lesenswert?

3 fabrig
grün geld rot

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

>apropos hätte ich noch 16x16 er matritzen ( inkl widerstände und
>transistoren) alles auf der platine günstig abzugeben ! da ich sie
>nicht mehr benötige !

Hättest du das gesagt, bevor ich mir die 512 LEDs bestellt hätte, wärst
du das Ding jetzt warscheinlich los. Vermutlich kommen die LEDs heute,
dann kann ich die LED Matrix aufbauen. Diese verhält sich wie ein
primitves LCD mit zwei Befehlen: Daten übertragen und Adresszähler
resetten. Immerhin ist das Display grafikfähig.


Einen wirklichen Plan habe ich noch nicht, kommt aber noch wenn alles
läuft. 1/32 Mux ist zu viel, das wird zu dunkel. Daher fahre ich einen
2x 1/16 Mux, d.h. Spalte 1 und 17 sind gleichzeitig an, Zeile 2 und 18
usw.
Die 2x 16 Zeilensignale erzeuge ich über 4094 Schieberegister und
Konstantstromquellen die je ca. 150mA liefern. Damit kommer ich auf
rund 9mA mittleren Strom pro LED. Insgesamt zieht die Schaltung rund 5A
wenn alle LEDs an sind. Die Spalten werden über P Kanal MOSFETs
geschaltet, angesteuert von einem 4 zu 16 Dekoder. Ein NE555 arbeitet
als Impulsausfalldetektor und schaltet nach 5ms ohne Impulse die
Ausgangstreiber ab (falls der uC abstürzt geht die gerade aktive LED
Spalte bei 150mA sonst schnell in Rauch auf...)

von Matthias Asselborn (Gast)


Lesenswert?

da hätten dann 2 module gereicht...
meinem 1. analyzer baute ich auch mit 2 mux auf nur der atmel schaltete
....
kein ne555

ja wenn du weiter kommst bitte ich dich mal um einen schaltplan !
wenn sich das machen lässt !

von ape (Gast)


Lesenswert?

Ich hab mal nochmal nach Filtern geguckt.
Es gibt auch von anderen Herstellern Switched Capacitor Filter aber ich
hab keine weiteren 8. Ordnung gefunden. Von TI gibts den TLC04. Dieser
ist 4. Ordnung und man kann ihn bei Farnell kaufen (Als Student auch in
geringen Stückzahlen :)) Und wenn 4th Order nicht reicht könnte man
notfalls ja einfach zwei Filter hintereinander hängen.

von philip (Gast)


Lesenswert?

nein ich brauche nur ein reines UV !!
ich brauche nen eagel plan + code für nen atmel mega,
das ganze brauche ich zusetzlich fürn kleines neben projekt,
ich wills über avr machen, da die ganzen ics dafür mist sind..

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Nach 5 Stunden Arbeit (ich hasse LEDs, es ist echt eine Scheißarbeit 512
LEDs anzulöten, die Drähte unterschiedlich lang zu kürzen und die Zeilen
und Spalten zu verdrahten) ist ein Teil der LED Anzeige fertig. Leider
fehlt mir eine Platine um alles fertig zu bauen (hoffentlich geht das
diesmal schneller als beim VS1011: Das war der absolute Negativ Rekord
von Reichelt: Über 4 Monate Lieferzeit !).
Daher ist nur eine 16x16 Matrixhälfte verdrahtet.

@philip
http://mitglied.lycos.de/bk4/AVRvu.htm

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein kleiner Test: Da ich noch irgendeinen Fehler im Code habe,
kann ich im Moment nur die obere Hälfte anzeigen lassen (ca. 2-10kHz)
Leider setzt in diesem Bereich auch der Tiefpass der Kamera ein, ich
denke man sieht aber deutlich, dass es funktioniert und wirklich gut
aussieht (im Vergleich zu einem LCD)

von Matthias Asselborn (Gast)


Lesenswert?

@ komplettes VU

ich habe wie gesagt eines in C programmiert ausgerichtet auf einen
AT MEGA 8535

filter habe ich mich schon viel umgesehen die für einen studenten auch
bezahlbar sind
es gab da mal ganz früher 4 fach filter pro ic marke weis ich nicht
mehr ich glaube aber von AD wobei das stück 10 euro gekostet hätte....
also von daher lieber selbst einen zusammen bauen

@Benedikt

dürfte ich dann deinen Code und Plan wenn er fertig ist betrachten ?

von Philip (Gast)


Lesenswert?

das eine UV von der seite ist igenau was ich suche,
nur leider ist die softwar net offen,
ich sehe dort nur ne hex,
keine c oder asm oder bas datei... :(

ich hätte gerne was offenen, um es ein wenig
umbauen zu können, und ich brauche ein paar mehr
kanäle... naja kann ja mehrere avrs nehmen
habe 3 mega.. hier liegen...

von Matthias Asselborn (Gast)


Lesenswert?

yo müsste mein raid mobilisieren denn da liegt der code drauf ich
habe ja nun ferien da mach ich das mal !
da prinzip beruht auf ablesen des ADC s umrechnen und ausgeben !
in genauen dezibel werten ! wie seiht das mit den db aus
bei deinem  @Benedikt ??

von ape (Gast)


Angehängte Dateien:

Lesenswert?

@benedikt:
schick schick
aber mir gefällt die LCD Optik besser, nich so aufdringlich :P naja
über Geschmack lässt sich ja nich streiten.

Hab auch nochmal nen kleines Video über den Frequenzgang gemacht.
Diesmal sogar mit Ton, aber leider nach wie vor mieser Bildqualität :/
In der Mitte sieht man den Übergang der beiden FFTs.

http://www.apetech.de/download/test.avi

Daher im Anhang auch nochmal nen Foto wies mit hoher Auflösung aussieht
(Das ganze ist jetzt in meinem Verstärker integriert)

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

@Philip

Hier der Code für den VU (eigentlich PPM) Meter.

von Matthias Asselborn (Gast)


Lesenswert?

Hallo Benedikt hast du irgendeine Scalierung bei den Led s
nach Db ?
oder lässt sich die nachträglich programmieren ?

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Meinst du bei dem VU Meter ? Ist eigentlich egal, beim Spektrum Analyser
ist es genau dasselbe.
Ich messe das Signal mit 10bit, mache eine Gleichrichtung und bestimme
den Spitzenwert, der verdoppelt wird. Das ergibt einen Bereich von
0-1023. Daraus wird die Wurzel gezogen, was 0-31 ergibt, genau passend
für die LEDs.
Es ist also eine pseudologarithmische Anzeige.
Der LED Balken stimmt genau mit der Anzeige bei mir am PC überein.
Also 100% Lautstärke (bei 1khz Sinus) ergibt vollen Ausschlag (31
LEDs).
50% ergibt 15 LED usw.

Ich habe mal den Schaltplan der LED Matrix angefügt. Es ist jeweils ein
Zeilen und Spaltentreiber eingezeichnet, insgesamt sind es 16 Spalten
und 2x 16 Zeilentreiber.

Als Spannungsversorgung verwende ich im Moment noch einen 7805, aber
wenn ich mehr als 50% der LEDs einschalte fängt alles an zu flackern,
da die Spannung zusammenbricht. Enweder verwende ich einen
modifizierten LM2574 Schaltregler (der 5A mühelos schafft) oder
irgendein billiges Schaltnetzteil von Pollin.

von Matthias Asselborn (Gast)


Lesenswert?

welchen code hast du auf dem µC drauf, der für die Zeilen und Spalten
verantwortlich ist
lässt sich dieser an ein 28x12 er Analyzer anpassen bzw gibts du ihn
heraus ?
denn bei meinen Analyzer wäre schon die Matrix ( 2 x 14 x 12 leds
fertig )

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist der Code für den LED Displaycontroller.
Über den UART werden die Grafikdaten mit 115200Baud empfangen und in
den Speicher geschrieben. Jede Spalte belegt 2 Bytes, insgesamt werden
also 64Bytes benötigt.
Der FFT uC sendet die Daten etwas verschachtelt, und zwar zuerst die
oberen 8 LEDs (32x, da 32 Zeilen) und dann die unteren 8 LEDs. Daher
wird in der UART Interrupt Routine der Zähler zweimal erhöht.
Durch einen externen Interrupt (Sync Signal) wird der Zähler wieder auf
0 gesetzt. Darauf kann man eigentlich verzichten.
Im Timer Interrupt werden 2x16bit seriell ausgegeben.

von philip (Gast)


Lesenswert?

kannst du auch mal musik drüber laufen lassen?
mich würde mal interessieren wie schnell das ganze ist,

gibt eventull auch eagel layouts ? für 32x16

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Ein Layout habe ich nich erstellt, da dieses Doppelseitig ausgefallen
wäre (Zeilen und Spalten kreuzen sich), daher doch lieber
Lochrasterplatine.

Im Anhang ein Video mit Musik. Falls jemand ein anderes Lied wünscht,
noch habe ich die Kamera aufgebaut.
Die Anzeige ist auf jedenfall schnell genug. Selbst die kürzesten
Geräusche erkennt man deutlich.

von Philip (Gast)


Lesenswert?

sind das jetzt alle leds oder kommen noch welchd dazu?

von Matthias Asselborn (Gast)


Lesenswert?

ich werde mich nun hinsetzen ein layout machen die matrix ist ja schon
fertig bei mir !
lasse es bei nem bulgarischen kumpel ätzen !
werde auch den code von 16x16 auf 12x14 ändern da ich eine 12x28 matrix
habe / benötige :-)

von Philip (Gast)


Lesenswert?

ich mache nun die front blende für 32x16 LEDs fertig und werde mich dann

hinsetzen und in eagel ein layout machen, für das teil, habe nochn paar
rück fragen bezüglich des layouts... das werde ich die tage dann mal
fragen... wegen der matrix....

wenn ihr wollt lasse ich für euch mit äzen lasse wie Matthias  in
bulgarien ätzen...

von Matthias Asselborn (Gast)


Lesenswert?

benedikt welche zahlenwerte muss ich verändern um den code von dir
auf eine 14 spalten 12 zeilen matrix umzuändern
zuvor 16x16 bei dir

von Benedikt (Gast)


Lesenswert?

Ich werde es mal ändern und morgen eine 28x12 Version hochladen.

von Matthias Asselborn (Gast)


Lesenswert?

vielen lieben dank also 12 led s pro spalte und 28 spalten !

frage lassen sich die frequenzen auch bestimen ?
bzw die db werte ?
wo ändere ich dies ?

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Das Programm ist nur die Anzeige.
Die Frequenzen und die Pegel werden auf dem anderen uC bestimmt.

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Und hier das FFT Programm (noch als 32er Version mit 0-10kHz
Frequenzen)

PS: Beim anderen Programm muss im Timer Interrupt die Anzahl auch auf
die LED Anzahl begrenzt werden:

Timer 0 Interrupt:
clr P3.2
  inc MuxPos
  a=MuxPos
  if a=#LEDs then
    MuxPos=#0
    a=#0
  end if

von Matthias Asselborn (Gast)


Lesenswert?

ist nun die  ledmuxlog28.a51 auf 28 Spalten gestellt ?
da ich immer noch eine 8 bzw 16 lese ?
kannst du mir die Stellen zeigen wo dies umgestellt wird
eine fft mit 0-20khz gab es doch hier auch mal ?

von Benedikt (Gast)


Lesenswert?

Die 16 ist falsch, hier muss LEDs stehen
Die 8 kommt von den 8bit pro 4094.
28x12 ist nicht möglich, sondern nur 28x16, aber da kannst du ja
einfach 4 Pins unbenutzt lassen.

20kHz ist mit einem AVR nur bedingt möglich, da der ADC dies nicht
schafft. Mit einem externen ADC sollte aber sogar ein Bereich 0-1MHz
möglich sein.

von Matthias Asselborn (Gast)


Lesenswert?

also



Timer 0 Interrupt:
clr P3.2
  inc MuxPos
  a=MuxPos
  if a=#16 then
    MuxPos=#0
    a=#0


die Zeile if a=#16 then muss also if a=#LEDs then
heissen ?


  end if
  rl a
  setb acc.6
  push acc
  add a, #LEDs
  r0=a        ;Rechte Hälfte
  inc r0
  a= @r0
  for r7=#8


was bedeuten die nummer 8 ?
da ich ja 2x 14 habe (28)

                clr Clk
    rlc a
    Dat=c
    nop
    setb Clk
  next
  dec r0
  a= @r0
  for r7=#8
    clr Clk
    rlc a
    Dat=c
    nop
    setb Clk
  next

  pop acc
  r0=a        ;Linke Hälfte
  inc r0
  a= @r0
  for r7=#8
    clr Clk
    rlc a
    Dat=c
    nop
    setb Clk
  next
  dec r0
  a= @r0
  for r7=#8
    clr Clk
    rlc a
    Dat=c
    nop
    setb Clk
  next

  clr OE
  a=MuxPos
  swap a
  P1=a
  setb Latch
  nop
  clr Latch
  nop
  setb OE
  setb P3.2
reti


gruß matthias

von Matthias Asselborn (Gast)


Lesenswert?

nehm ich dann 2 avrs ? @20khz ?

von Matthias Asselborn (Gast)


Lesenswert?

was ist der U1 IC auf deinem Schaltbild ?
wo gehen die nicht verdrahteten Transistoren hin ?
ist die FFT nun bis 20khz oder nur bis 10khz ?

von Matthias Asselborn (Gast)


Lesenswert?

transistoren sind klar nun ... die fft nun auch geht ja nur bis 10 khz
ähm wie könnte ich die samplingfrequenz erhöhen (ums doppelte)
so dass es mir 22khz anzeigt ?

von Matthias Asselborn (Gast)


Lesenswert?

mit nem ADC ?

von Matthias Asselborn (Gast)


Lesenswert?

also 10khz ist sehr übel um das Teil nicht nur als Schaustellstück
einzusetzen und die 170hz über 5k bzw unter 5k ne andere Einteilung
der Frequenzen ist mir auch viel zu ungenau
mein Bandpass Analyzer mit der 1/3 Oct Teilung, festen db Werten
nach Studionorm bleibt somit bestehen

von Philip (Gast)


Lesenswert?

jupp, werd meinen nun auch mit bandpässen baue is wohl doch besser....

oder gibts n möglichkeit das teil auf 20-22khz zu bekommen ?

von Benedikt (Gast)


Lesenswert?

Ich habe es gestern mal gestestet:
mega8 @ 18,432MHz, ADC Teiler auf 32, ergibt 44,2kHz Samplerate. Ist
zwar außerhalb der Spezifikationen, aber es geht. Das Rauschen ist ein
klein wenig höher, aber das Ergebnis ist noch brauchbar.
Wenn ich jetzt noch irgendwo einen Switched Capacitor Filter auftreibe
und im unteren Bereich die Auflösung erhöhe, dann lasse ich es
eventuell sogar auf 44kHz Samplerate.

von Benedikt (Gast)


Lesenswert?

@Matthias Asselborn
Wie steil sind eigentlich die Bandpässe in deinem Spektrum Analyser ?
Auf den alten Fotos von der ersten Version sieht man eine Frequenz, die
aber fast auf der halben Anzeige mit abfallenden Pegeln erscheint.
Dies war eigentlich der Hauptgrund wiso ich mich für FFT entschieden
habe: Hier erscheint ein sauberer Sinus auf max 2-3 Balken, aber nicht
weiter.

von Benedikt (Gast)


Lesenswert?

So, jetzt läuft man Analyser mit 0-22kHz Frequenzbereich und 43Hz
Auflösung bei niedrigen Frequenzen. Jetzt brauche ich nur noch einen
Switched Capacitor Filter oder einen anderen, steilen Tiefpass Filter
mit 5 bis 8db, für 2kHz und 20kHz.

von Matthias Asselborn (Gast)


Lesenswert?

das wäre ja dann akzeptabler !
@Benedikt

könntest du mir nun mal den fft code
überreichen dann baue ich die fft auf
und danach das display
welchen ad hast du verwendet ?

bei meinem bandpass wenn ich eine sinus anlege
(beim kalibrieren ) hatte ich einen balken  weiter nichts
die bilder die du gesehen hast waren halt mit sound !
also nicht nur eine frequenz sondern ein kompletes lied !

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Könntest du mal die Schaltung eines Bandpassfilters verraten ?
Wenn es bei einem Sinuston wirklich nur ein Balken aufleuchtet, dann
muss der Filter ja ziemlich steil sein.

Der FFT Code ist jetzt sehr ähnlich dem von ape.
Als ADC verwende ich den internen des mega8.

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Video zu der jetztigen Version.
Bei den Bässen sieht man gut, dass die Auflösung im unteren Bereich
deutlich höher ist als vorher, vor allem wenn die Balken so schön nach
links wandlern...

von Matthias Asselborn (Gast)


Lesenswert?

verrate ich gerne ich entnahm ihn dem Spektrum Analyzer der
zu meinem Geburtsjahr im Elektor erschienen ist !
es kann aber sein, dass ein paar leds noch flackern wenn ich ein signal
draufgebe da jeder günstige sinus generator vor allem die hardware
abhängigen vom pc verschieden teils ungenau sind

es ist halt schade bei dir dass nur ein paar led balken fpr die tiefen
töne verantwortlich sind
eine 1/3 oct teilung wäre da angemessener....
z.b.

31,5 40 50 63 80 10 125 usw...
da hast du ja nur 40, 80 und 120 von ?

verrate du mir mal deinen kompletten schaltplan ! bitte !
inklusive ad verdrahtungen usw...
was der u1 ist... das ich das mal nachbauen kann und weiterwentwickeln
evtl neue einteilungen usw...

von Matthias Asselborn (Gast)


Angehängte Dateien:

Lesenswert?

das ist z.b. ganz normaler sound

von Matthias Asselborn (Gast)


Lesenswert?

und das die filter !

bitte benedikt mach mir doch mal n schaltplan ! für alles was ich
brauche !
den rest krieg ich dann schon selber hin !
aber ich bräuchte mal n schönen plan !

von philip (Gast)


Lesenswert?

kannst du mal nen sinus ton von 10-22khz düber jagen ?

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

U1 ist ein NE555.
Dieser arbeitet als retriggerbares Monoflop, das bei jeder Low-High
Flanke am Eingang den Spaltentreiber für etwa 5ms aktiviert. Hängt sich
der uC auf, schaltet alles ab. Bei meiner letzten Mux Schaltung sind mir
die LEDs halb abgebrannt als das passiert ist... Man lernt eben aus
seinen Fehlern.

Ich sehe gerade, in dem Plan ist ein Fehler:
Die Adressen für den Spaltendekoder IC2 sind nicht an P1.0-P1.3 sondern
an P1.4 bis P1.7 angeschlossen, da P1.0 und P1.1 nur Open Collektor sind
und ich mir aus Faulheit die Pullups gespart habe.

Der Schaltplan mit dem mega8 ist vorläufig. Entweder bekomme ich
irgendwo ein MAX29x oder ich werde einen steilen Tiefpass (20db oder
steiler) verwenden und diesen an ADC1 anschließen. Die normalen Signale
(0-22kHz) gehen dann an ADC0, die LF (0-1,5kHz) an ADC0

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Hier der Sinus 10Hz-20kHz
Rechts fehlt einiges, da ich nicht ausreichend Platinen da hatte um 32
Spalten aufzubauen. Im Momet habe ich nur 22 Spalten.
Die Störungen im unteren Frequenzbereich kommen von der hochohmigen
Leitung quer durch mein Zimmer.

von Michael (ein anderer) (Gast)


Lesenswert?

@Benedikt:

Sieht ja schon mal gut aus. Ich habe diesen Thread nicht gelesen, es
sieht aber so aus, als ob Du im höheren Frequenzbereich
Aliasing-Effekte hast. Man sieht schön, wie es die hohen Frequenzen
reinspiegelt.

von Benedikt (Gast)


Lesenswert?

Ja, das ist ein Problem bei dem ganzen.
Da ich aber keinen Switched Capacitor Filter (MAX29x oder MAX740x)
bekomme, muss ich mir demnächst wohl einen steilen 1,5kHz Tiefpass
bauen, dann sind die ganzen Störungen weg.
Ich sample mit 5,5kS/s, macht also 2,8kHz Bandbreite. 40db Abschwächung
reichen mir, also brauchte ich Filter das 1,3kHz weniger als 1db dämpft,
und 4,3kHz mit mindestens 40db dämpft. Also etwas mehr als 20db/Oktave
sollte reichen.

Hat jemand schonmal mit einem elliptischen Tiefpass gearbeitet ? Dieser
ist ja im Grenzbereich sehr steil, daher sollte ich mit einem DualOpamp
hinkommen ?
Oder kennt jemand eine andere (nicht zu komplizierte Schaltung) die den
geforderten Übertragungsbereich hat ?

von Michael (ein anderer) (Gast)


Lesenswert?

@Benedikt:

Wenn Du mit 5,5 kHz samplest, muss der Filter doch bei 2,75k kHZ
absolut dicht sein, damit Du keine Aliasing Effekte bekommst?!

Da Deine Anforderung im Durchlassbereich ja nicht so kritisch ist,
würde dort auch etwas Welligkeit wohl nicht schaden.

Also würde ein 4-poliger Tschebyschedd-Filter mit 2dB Welligkeit gerade
so hinkommen. Der würde die 40dB gerade so erreichen.

Dafür bräuchtest Du einen Dual-Op-Amp, 8 Widerstände und 4
Kodensatoren.

Wenn Du ihn steiler haben möchtest, könntest Du mit einem Quad-Op-Amp
einen 8-poligen Filter bauen, der käme auf über 80dB (erste Oktave).

Hast Du das Buch "Art of Electronic" zu deutsch "Hohe Schule der
Elektronik"? Da sind super Entwurfstabellen drin mit denen Du so ein
Filter ganz einfach aufbauen kannst.

von Michael (ein anderer) (Gast)


Lesenswert?

Ich habe die betreffenden Seiten mal gescannt. Mal sehen ob ich es hier
als Anhang reinstellen kann (ist groß)...

von Michael (ein anderer) (Gast)


Lesenswert?

Aha, hat also nicht funktioniert. Sag' mal Deine Email-Adresse und ich
schicke es Dir per Mail (3MB).

von Benedikt (Gast)


Lesenswert?

Danke ! (Emailadresse: benedikt83 ät gmx punkt net)

Ich bin schon die ganze Zeit am suchen und simulieren, komme aber nicht
über ein Filter 4. Ordnung hinaus.

Der große Frequenzbereich kommt daher, dass ich nur Frequenzen
unterhalb von 1,3kHz verwende. Die Frequenzen oberhalb von 2,8kHz
erscheinen gespiegelt, so dass sie bis 2,8kHz + (2,8kHz-1,3kHz)=4,3kHz
nicht stören.

von Michael (ein anderer) (Gast)


Lesenswert?

Du hast Post.

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Diese Schaltung sollte meine Anforderungen erfüllen:
Kaum einen Überschwinger beim Frequenzgang und insgesamt -38db bei den
4,3kHz gegenüber dem DC Pegel. Der Frequenzganz ist bis 1,3kHz
annähernd linear.

von Michael (ein anderer) (Gast)


Lesenswert?

Naja, das sind ja einfach zwei gleiche Tiefpässe hintereinander. Das
sollte auch besser gehen. Einfach nur andere Werte für die Cs und Rs
verwenden. Die Bauteilanzahl bleibt gleich.

Hast Du meine Mail bekommen? Da ist das doch schön erklärt.

Aber wie Du es letztendlich machst, ist Deine Sache.

von Benedikt (Gast)


Lesenswert?

>Naja, das sind ja einfach zwei gleiche Tiefpässe hintereinander. Das
>sollte auch besser gehen. Einfach nur andere Werte für die Cs und Rs
>verwenden. Die Bauteilanzahl bleibt gleich.

Dann habe ich wohl die Beschreibung nicht so ganz verstanden.
Wie berechne ich aus dem K und Fn Wert aus Tabelle 5.2 die Rs und Cs ?

Ich habe die Grundschaltung verwendet und so lange in einer Simulation
die Werte angepasst, bis ich einen passenden Signalverlauf hatte.

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Der Filter könnte noch etwas steiler sein, denn dann könnte ich die
Trennfrequenz ein klein wenig höher legen. Man sieht kurz den
Amplitudenabfall, ehe auf die 44kS/s FFT Daten umgeschaltet wird. Dann
sieht man etwas später die unterste LED Reihe nochmal kurz lang links
laufen. Das sind die letzten Reste, die der Tiefpass nicht schafft. Die
hohen Frequenzen sind da, wurden aber vom Audiocodec geschluckt.
Aber ansonsten bin ich damit jetzt ziemlich zufrieden. Jetzt muss ich
nur noch warten bis Reichelt die Platinen liefert, damit ich die
fehlenden 160 LEDs rechts anbauen kann. Im Moment geht die Anzeige bis
etwa 3,5kHz.

von Michael (ein anderer) (Gast)


Lesenswert?

Du willst einen 4-Pol-Tschebyscheff-Filter bauen. Du brauchst zwei OPVs
und Widerstände und Kondensatoren wie in Deiner Zeichnung (zwei
Sektionen).

Seite 314, Abschnitt "Bessel- und Tschebyscheff-Tiefpaßfilter":

"Allerdings sehen die RC-Produkte für die einzelnen_ _Sektionen im
Vergleich zum Butterworth-Filter anders aus, und sie müssen mit dem
Normalisierungsfaktor_ _fn (...) nach RC=1/(2*pi*fn*fc) skalliert
werden."

Also:

Bis 1300 Herz soll der Filter möglichst linear sein, dann soll er
anfangen zu sperren. Verwenden wir mal einen 4-Pol-Tschebyscheff-Filter
mit 0,5dB Welligkeit.

Zwei Sektionen brauchen wir. Die Faktoren fn gibt's in der Tabelle 5.2
auf Seite 313.

Fn für die erste Sektion 0,597 und für die zweite Sektion 1,031.

Nun die benötigten RC-Produkte für beide Sektionen ausrechnen:

1. Sektion: RC = 1 / (2  pi  0,597 * 1300) = 0,0002051

2. Sektion: RC = 1 / (2  pi  1,031 * 1300) = 0,0001187

Nun müssen wir passenden Kondensatoren und Widerstände "wählen". Da
muss man ein wenig improvisieren. Probieren wir mal 100 Kiloohm für die
1. Sektion:

R*C=0,0002051 --> C=0,0002051/R = 0,0002051/100000 = 2,051 nF

So einen Kondensator gibt's nicht, der nächste in der Nähe wäre 2,2nF.
Dann rechnen wir für 2,2 nF mal R aus:

R*C=0,0002051 --> R=0,0002051/C = 93,2 Kiloohm.

Das sieht schon ganz gut aus. Nächster lieferbarer Widerstand wäre
93,1 Kiloohm (Metallschicht, 1%, E96 Reihe).

D.h. die drei Widerstände R1, R2 und R für die erste Sektion wären eben
93,1 Kiloohm. Fehlt nur noch der vierte Widerstand (K-1)R:

Rk = (K-1)*R = (1,582 - 1) * 93,2 Kilohm = 54,3 Kiloohm.

Der nächste lieferbare Wert wäre 54,9 Kilo oder 53,6 Kiloohm. Da liegen
wir ziemlich in der Mitte.

Nun haben wir alle Werte für die erste Sektion. Die zweite Sektion geht
genau so, nur eben mit anderen Werte für die RC Kombination und für den
K-Faktor, der in der zweiten Sektion in diesem Fall 2,66 ist (siehe
Tabelle).

So weit alles verstanden?  Die zweite Sektion musst Du Dir schon selbst
ausrechnen. Ich hoffe ich habe keinen Fehler in meiner Berechnungen.

Wenn Du die passenden Widerstände nicht hast, wähle einfach die am
besten passenden. Allerdings nimmt die Qualität des Filters dann ab,
z.B. wird die Steilheit flacher, Welligkeit im Durchlassbereich höher
etc.

Aber da Du ja eh alles in Spice oder so simulierst, kannst Du die
Auswirkungen zwischen theoretischen und realen Werten ja leicht
überprüfen.

Viel Spaß mit der zweiten Sektion! ;-)

von Benedikt (Gast)


Lesenswert?

Nochmals Danke !
Jetzt habe ichs verstanden.

Ich glaube da werde ich mir erstmal ein kleines Prog schreiben, das mir
die ganzen Werte berechnet...

von ape (Gast)


Lesenswert?

Hab via Google das hier gefunden:
http://www.web-ee.com/primers/files/slod006b.pdf

Tschebyscheff-Filter sind so um Seite 300. habs mir noch nich näher
angesehen wie hilfreich das is die berechnungen sehen auf den ersten
Blick recht kompliziert aus :)

von Björn (Gast)


Lesenswert?


von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Ja, das ist genau das richtige.

Jetzt ist der Filter so wie ich ihn wollte: Unterhalb von 1,7kHz ist
das Signal absolut linear (+/-1db) und bei 4kHz hat es bereits -38db.
Man kann problemlos steile Filter bauen, aber die meisten haben einen
für solche Anwendungen einen zu großen Übergangsbereich.

Interessant ist auch, dass diese Filter eine DC Verstärkung von 1
haben. Die Filter aus dem Buch verwenden dagegen eine höhere
Verstärkung um eine Überhöhung kurz vor der Grenzfrequenz zu
verursachen. Bei den Filtern aus dem Program laufen die Opamps mit
einer Verstärkung von 1, was nicht nur zwei Widerstände spart, sondern
auch die Hilfsspannung, beim Betrieb an einer Unipolaren Spannung. Hier
wird die Überhöhung durch ungleiche Filterwiderstände und Kondensatoren
erreicht.

Das ist jetzt meine entgültige Hardware. Jetzt passe ich nur noch die
Software ein kleinwenig an, um einen möglichst gleitenden Übergang
zwischen den beiden FFTs zu erhalten.

von Matthias Asselborn (Gast)


Lesenswert?

ok dann mach ich mich mal an s werk @hardware
ist deine display hardware gleichgeblieben ?

von Benedikt (Gast)


Lesenswert?

Ja, das Display ist noch gleich.
Um das ganze nicht künstlich komplizierter zu machen, würde ich dir
empfehlen die 32x16 Version zu bauen, da ich für diese auch
Softwareupdates usw. machen werden.
Für ein 28x12 Display lässt du dann einfach die oberen 3 und unterste
LED Zeile weg (in der untersten habe ich ab und zu kleine Störungen
ohne Signal). Ebenso die rechten 4 LED Spalten.

Ein interssanter Nebeneffekt des Displays: Durch den UART als
Dateneingang kann kan es auch an einen PC hängen und Text oder Grafik
anzeigen.

In den nächsten Tagen werde ich das komplette Projekt mit Software,
Hardware, Beschreibung, Fotos usw. in die Codesammlung stellen.

von Matthias Asselborn (Gast)


Lesenswert?

alles klar !

könntest du mir noch sagen wie das mit den Freuquenzen ist ?
wo liegen die nun ? könnte man die an einen 1/3 oct Maßstab anpassen ?


welche Werte hast du nun zwischen den einzelnen Led s ?
in Volt oder Db !

von Benedikt (Gast)


Lesenswert?

Die Amplituden Werte für die einzelnen LEDs sind Wurzel aus der
Amplitude. Die db Werte kannst du daraus selbst berechnen.

Im Bereich unterhalb von etwa 1500Hz sind 43Hz Auflösung möglich,
darüber 346Hz.
Wenn du mir eine Tabelle erstellst, welche Frequenzen du für jeden
Balken haben möchtest (ausgehen von obigem Frequenzraster), dann kann
ich versuchen das zu realisieren.
Ich fasse dazu immer 1,2,3,4,6 oder 8 Werte zu einem Balken zusammen.

Hier mal ein Beispiel, wie ich es im Moment habe:
0-43
43-86
86-129
129-172
172-215
215-301
301-387
387-473
473-602
usw.

von Matthias Asselborn (Gast)


Lesenswert?

1/3oct wäre der Studiostandart der Spectrum Analyzer
angefangen mit (32 Band)

20   hz
25   hz
31,5 hz
40   hz
50   hz
63
80
100
125
160
200
250
315
400
500
635
800
1000
1250
1600
2000
2500
3150
4000
5000
6350
8000
10000
12000
16000
20000
22000

somit wäre deine Samplerate von 44khz optimal ausgenützt und du
bekommst ein vernünfiges Bild !


für meinen 28 er würde gelten :
die letze und ersten Beiden weglassen )

31,5 hz
40   hz
50   hz
63
80
100
125
160
200
250
315
400
500
635
800
1000
1250
1600
2000
2500
3150
4000
5000
6350
8000
10000
12000
16000 hz

wie meinst du das mit dem Frequenzraster ?
brauchst ne Formel wie die Werte entstehen ? kein Problem !

unter Terzbänder

http://fasae.ibpmw.uni-essen.de/ibpm/studium/Lehre/Schall/Buch/Tabellen.htm#tab01

anbei noch ne Datei
http://www.pas-products.com/bilder/ana_3.8.gif

von Benedikt (Gast)


Lesenswert?

Eine 64Punkt FFT teilt den gemessenen Frequenzbereich in 64 gleiche
Bereich. Bei 44kS/s erhält man einen Frequenzbereich bis 22000Hz.
Dieser wird in 64 Bereiche unterteilt, also je 346Hz breit.
Um eine höhere Auflösung bei den niedrigen Frequenzen zu erziehlen,
mache ich noch eine zweite Messung mit 5,5kS/s, was 43Hz Auflösung
ergibt. Daher sind die ersten paar Werte wie
31,5Hz
40Hz
50Hz usw. nicht möglich.

von Matthias Asselborn (Gast)


Lesenswert?

du hast doch 8 AD s am Atmel !
wenn du nun 8 mal teilst ?

also bei 0 - bis 22khz/8 ( 2,75 khz)
dann bei 2,75 - 5,5
         5,5  - 8,25
         8,25 - 11
         11   - 13,75
         13,75- 16,5
         16,5 - 19,25
         19,25- 22

oder ist der atmel da zu lahm ?

von Matthias Asselborn (Gast)


Lesenswert?

die ad s nacheinander auslesen und ausgeben
sollte doch möglich sein ?

von Matthias Asselborn (Gast)


Lesenswert?

möglich evtl schon aber die geschwindigkeit geht dann wieder den berg
runter ?

hmm hierbei frägt es sich das ganze nicht odch mit einem dsp aufzubauen
?!

von Benedikt (Gast)


Lesenswert?

Mit einem DSP ist das ganze kein Problem, aber ob der soviel billiger
wird als ein diskreter Analyser ?

So wie du dir das vorstellst mit den 8 ADCs geht es nicht:
Der Frequenzbereich beginnt immer bei 0Hz, was ja auch nicht weiter
schlimm ist, denn bei höheren Frequenzen reicht ja ein gröberes
Frequenzraster.

Mit einem entsprechend schnellen uC mit viel Rechenleistung und
ausreichend RAM (64kB sollten es schon sein) reicht auch eine einzelne
FFT. Am PC erreiche ich 1,5Hz Auflösung bei einem Frequenzbereich von
0-48kHz. Allerdings ist mein Athlon 64 dann voll ausgelastet, wenn er
das ganze flüssig darstellen soll...

von Matthias Asselborn (Gast)


Lesenswert?

so ein dsp von z.b. TI liegt bei ca 30 euro
welcher preislich im vergleich zu nem atmega128 steht
schon klar dass der frequ beriech immer bei 0 anfängt
ich dachte halt an mehrere kleine ( 4 stück ) ffts
mit genauerer auflösung
10 hz wären optimal ! die durch 4 große bandpassfilter
getrennt werden

würde der 128 er atmel nicht reichen für mehr power ?

von Matthias Asselborn (Gast)


Lesenswert?

was kostn z.b. der TMS320 von TI ?

von Matthias Asselborn (Gast)


Lesenswert?

ach herje die TMS320 Serie ist doch nicht so billig ............

aber gibt es denn keine DSPs für ca 30-50 euro ?
und nicht gleich 500+

von Matthias Asselborn (Gast)


Lesenswert?

welche von Zilog ?

von Matthias Asselborn (Gast)


Lesenswert?

ìch habe vor ein paar Jahren n VU Meter gebaut
mit nem ADSP2105 und nem 27C512
da kostete der DSP ca 10-20 DM
der dürfte auch von den Pins her reichen

von Matthias Asselborn (Gast)


Lesenswert?

is von Analog Devices lief auf 10 Mhz
ich denke diese Serie ist noch erschwinglich !

von Matthias Asselborn (Gast)


Lesenswert?

bzw bis 40 mhz liese sich organisieren

von Matthias Asselborn (Gast)


Lesenswert?

anbei ne preisliste von analog devices und TI


http://www.mercateo.com/c/108-8916/DSPs.html

von Matthias Asselborn (Gast)


Lesenswert?

nun hab ich einen gefunden !
der TI

TMS320LF2403APAGA

bringt 40 mhz 40 mips (denke das reicht)

für 30 euro

von Benedikt (Gast)


Lesenswert?

10MHz ist aber nicht das schnellste. So viel besser als die FFT mit
einem AVR wird das auch nicht...

Ich hab gerade den Digikey Katlog hier liegen:
TMS320 kostet so 10€ bis 200€

von Matthias Asselborn (Gast)


Lesenswert?

problem is der hat halt keine ram ....

der TMS320VC5402PA hätte für ca 15 euro nur 16k ram auf 40 mhz 40mips

aber für 43 euro gäbe es nen 34k ram und 64k ram mit 100 mhz mips für
80 euro

von Matthias Asselborn (Gast)


Lesenswert?

aktualisier mal Benedikt oben hab ich ja von 40mhz geschrieben !

von Matthias Asselborn (Gast)


Angehängte Dateien:

Lesenswert?

komplette Übersicht

von Benedikt (Gast)


Lesenswert?

Hab noch ein paar TMS320BC52 hier liegen, wollte schonmal was mit
machen, aber ohne C Compiler oder Assembler und ohne irgendwelche
Anleitunge ist der Einstieg ziemlich unmöglich. Die Software kostet
irgendwas im 3 oder 4 stelligen Bereich wenn ich das richtig gelesen
habe, und eine Demoversion habe ich nirgends gefunden.

von Matthias Asselborn (Gast)


Lesenswert?

sag mir mal den name der soft
bzw für ein versuch könnten wir uns ja die soft..........organisieren
was möchtest du fü einen tms320bc52

von Benedikt (Gast)


Lesenswert?

Schau mal bei Pollin, da gibts ein Intel Web Meeting Set für 29,95€.
Da ist eine NTSC Farbkamera, eine ISA ISDN Karte, Kabel, Mikrofon und
eine Audio/Video Karte dabei. Auf dieser sind zwei schnelle 32kB SRAMs
als Speicher für den TMS320, ein Video ADC, ein AD8xxx Soundport (ne
simple Soundkarte) und noch andere schöne Sachen.
Welchen Zweck der TMS320 genau erfüllt kann ich nicht sagen, aber
irgendeine Videokompression anscheinend.

von Matthias Asselborn (Gast)


Lesenswert?

benedikt könntest du mir solch einen wie du hast verkaufen ?
wenn ja für wieviel - mein ich nun ernst !
das mit dem programmieren könnte ich hinbekommen !
bzw müsstest du nen neuen code machen ?

von Matthias Asselborn (Gast)


Lesenswert?

der compiler / die software sollte auch kein problem darstellen !

von Matthias Asselborn (Gast)


Lesenswert?

weil ich denke wenn schon n spec analyzer mit ner fft dann richtig !
und in 1/3 oct schritten

von Benedikt (Gast)


Lesenswert?

Die 2 oder 3 Stück die ich habe wollte ich eigentlich selbst verwenden
(irgenwann mal, wenn ich eine passende Platine für dieses 0,4mm Raster
habe.
Kauf dir doch die Karte bei Pollin, das ist einfacher. Den Rest kannst
du ja bei Ebay verkaufen.

Ich habe jetzt doch eine Software auf der TI Seite gefunden:
Unter DSP, Getting Startet, How Do I geht Going ?, C5000 Platform

Morgen früh werde ich dann hoffentlich die Software haben (227MB über
ISDN...)

von philip (Gast)


Lesenswert?

hmms wie komme ich an den chip ?

von Matthias Asselborn (Gast)


Lesenswert?

grundsätzliche Frage an dich Benedikt !
wenn das mit dem DSP klappt
wäre dann über eine 1/3 Oct Einteilung wie oben beschrieben
zu überlegen ?
denn dann wäre halt auch das Bild viel schöner ! weil im
Tiefpassbereich deutlich mehr Balken zu sehen wären !

von Björn (Gast)


Lesenswert?

Was is denn, wenn ihr ne Zoom-FFT macht?
Habt ihr euch schon mal die dsPic's von Microchip angeschaut?

Ach so noch was, die Auflösung der FFT entspricht doch delta_f = fa/N
....?

Gruß Björn

von Benedikt (Gast)


Lesenswert?

Wenn das mit dem DSP klappt, dann sind 10Hz Auflösung kein Problem.
Der langsamste aus der TMS320C52 Reihe schafft 20MHz. Da er in einem
Taktzyklus eine 16x16 Multiplikation macht, ist er um einiges schneller
als der AVR.
Eine 4096 Punkt FFT sollte daher kein Problem sein um 11Hz Auflösung zu
erhalten.

von Matthias Asselborn (Gast)


Lesenswert?

wäre ja sogar erschwinglich der DSP !!!!
bzw ein spezielles Programmierboarboard für den DSP macht mir grad noch
Sorgen !

von Benedikt (Gast)


Lesenswert?

So wie ich das verstanden habe, hat der DSP keinen ROM, sondern das
Programm wird bei jedem Programmstart neu in den SRAM geladen.
Dies scheint bei diesen DSP häufig der Fall zu sein: Auf meiner DVB-S
Karte sitzt auch irgendein TMS320 als MPEG Dekoder. Bei jedem
Programmstart wird ein ein paar 100kB großes Prgramm in den DSP
geladen.

von ChristianF (Gast)


Lesenswert?

hi,

wie Björn schon schrieb, schaut Euch mal die dsPICs von Microchip an.
Die können 30MIPS und haben auch eine MAC usw. - und die gibt's mit
Flash. Es ist eigentlich bei allen DSPs so, daß man einen externen
Flash o.ä. fürs Programm braucht.

512Pkte. sollten mit dem dsPIC gehen, so aus dem Bauch raus, bei mehr
wird der Speicher knapp.


cf

von Matthias Asselborn (Gast)


Lesenswert?

bei dem früher VU hatte ich einen 27C512 er Eprom dafür hergenommen
512 punkte wären auch ausreichend viel genauer jedoch die 4096

von Thorsten (Gast)


Lesenswert?

Hallo,

Microchip stellt für den dsPIC30F sogar eine optimierte FFT-Funktion
zum download bereit. Eine 256-Punkte FFT (komplex) soll in 635µs gehen.
C-Compiler und Simulator gibts kostenlos. Der C-Compiler soll angeblich
ne 60-Tage Demo sein, kann ich bisher allerdings nicht bestätigen. Hab
ihn schon länger auf dem Rechner, und er läuft immer noch. Hier der
Link, falls es interessiert:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010091

Gruß
Thorsten

von Benedikt (Gast)


Lesenswert?

512 Punkt sind nicht ausreichend, wenn man eine FFT macht:
Mit 1024 Punkten erreicht man 43Hz Auflösung, so wie ich es gerade
habe. Macht man dagegen wieder zwei FFTs (eine mit 44kS, die andere mit
5,5Ks) ist man schon bei 5Hz Auflösung !

von Matthias Asselborn (Gast)


Lesenswert?

wie sieht es denn mit der Soft aus Benedikt hast du was erreicht mit dem
DSP den du daheim hast ?
Frage @Benedikt
wie alt bist n du ?
ja 4096 wären schon super...
wie programmiert man denn den DSP ? mit nem Board ???
ich habe ihn damals über JTAG programmiert

von ChristianF (Gast)


Lesenswert?

Leute, folgendes:
Ihr wollt eine 4096Punkte fft machen. D.h. Ihr müßt 4096 Abtastwerte
vorhalten, die nehmen jeweils 16Bit in Anspruch.
Das sind alleine für die Abtastwerte 4096*16Bit=64kb.
Dazu kommen dann die Werte für die berechnete fft. Das sind komplexe
Ergebnisse, d.h. 32Bit pro Werte, also 128kb.
Das ist eine Menge Holz...

Ich hab mir da auch mal ein paar Gedanken drüber gemacht, so wie
Benedikt es vorschlägt ist es doch super, also das ganze aufteilen in
mehrere ffts. Habt Ihr Euch schon mal überlegt, einen digitalen Tiefpaß
zu realisieren um das "downsampling" von 44kHz auf 5,5kHz o.ä. zu
machen?

@Thorsten:
Hast Du eine eval board von dem dsPIC? Ich arbeite bei einer Firma mit
einem und würde gern privat ein bißchen was mit denen machen. Weiß aber
nicht, wo man ein Evaluation Board o.ä. bekommen kann. Letztes Jahr
während dem design contest hat man wohl recht günstig ein dsPICDEM1.1
bekommen können, das hab ich leider verpasst...
Kennst Du Bezugsquellen?

Gruß,

cf

von Thorsten (Gast)


Lesenswert?

@ChristianF

Leider habe ich kein Board. Ich bin kürzlich günstig an einige
dsPIC30F6014 gekommen und werde mir jetzt selbst ein Minimalboard auf
Lochrasterplatine bauen. Den dsPIC hab ich schon auf ne Adapterplatine
gelötet. Bisher habe ich nur mit dem Simulator gearbeitet aber was ich
da gesehen habe, hat mich schon sehr begeistert.

Gruß
Thorsten

von ChristianF (Gast)


Lesenswert?

Thorsten:
Ich find die Teile auch ok, aber 30MIPS sind halt nicht die Welt. Aber
es ist für einen Hobbyisten schon einiges...

Hast Du so ein ICD-2 Teil? Wo hast Du die Prozessoren herbekommen?
Was hast Du bezahlt? ;-)

Vielleicht versuche ich sogar mal, ein kleines Evaluation Board zu
layouten, aber ich hab sooo viele Pläne und wenig Zeit...


zu der FFT Geschichte:
Sorry, das sind natürlich nur 4096*16Bit=64kbit=8kb, also 24kb für
Eingangswerte+Ausgangswerte, wenn die Eingangswerte der fft rein reell
vorgehalten werden können. Ist immer noch sehr viel...

Gruß,

Christian

von Thorsten (Gast)


Lesenswert?

Ich hab mir einen ICD2 Clone gebaut, hängt mit nem FT232 an USB und
funktioniert sehr gut. Habe es allerdings nocht nicht mit den dsPICs
probiert, ich gehe aber davon aus das es tut denn bei den PIC10, PIC16
und PIC18 hat es auch problemlos funktioniert. Die Prozessoren habe ich
bei eBay erstanden, der Preis lag bei 6 Euro/St. incl. Versand. Hab die
dort eher zufällig entdeckt und sofort zugegriffen da ich schon seit
längerem überlege, mal was mit 16 Bittern zu machen. Und warum sollen
es nicht die dsPICs sein?

Thorsten

von ChristianF (Gast)


Lesenswert?

Hi Thorsten,

danke für die Infos, werde mir vielleicht auch so ein ICD 2 nachbauen,
ich nehme mal an mit google finde ich da genug...

Viel Spaß beim basteln,

Christian

von Thorsten (Gast)


Lesenswert?


von Benedikt (Gast)


Lesenswert?

Kann man die dsPICs mit der Schaltung programmieren ?
Wenn ja, dann bestell ich mir einem DSPIC30F2010-30I bei Digikey.
Kostet ca. 11$, also vermutlich so um die 10€
Das ist der einzige der ein DIP Gehäuse hat...

von Thorsten (Gast)


Lesenswert?

Ja, er ist ICSP-tauglich. Funktioniert im Prinzip genauso wie bei allen
anderen PICs auch. Bruachst nur ne 5-polige Stiftleiste vorsehen:
Pin 1 : /RESET
    2 : (VCC)
    3 : GND
    4 : Data
    5 : Clock

4-5 kann auch umgekehrt sein, weiß grad nicht. Hast du ein
Programmiergerät dafür?

von Benedikt (Gast)


Lesenswert?

Ich habe noch garnichts, daher frage ich ja, ob man den ICD2 Nachbau von
dem Link für den dsPIC verwenden kann.

Ich habe noch nie mit PICs gearbeitet, werde demnächst mit anfangen und
dann auch mal die dsPICs testen.

von Thorsten (Gast)


Lesenswert?

Ich kann dir morgen (oder vielleicht schon heute Abend) sagen, ob der
Nachbau funktioniert.

von Benedikt (Gast)


Lesenswert?

Ich habe gerade mal nachgeschaut:
Der dsPIC30F2010 hat nur 512Bytes SRAM. Für eine ordentliche FFT
bräuchte man schon den F6010, der hat 8192 Bytes, aber ist
warscheinlich nicht ganz billig.
An sich ist der AVR ja schnell genug, nur es fehlt an RAM.
d.h. man müsste auf den mega8515 mit externem 64kB 15ns SRAM umsteigen,
und einen externen ADC verwenden.

von ChristianF (Gast)


Lesenswert?

Benedikt:
Ich weiß, daß man den 6010 für um die 20$ kriegt, in Stückzahlen.
EInzelstücke werden vielleicht so 30Euro kosten, wenn man die überhaupt
irgendwo beziehen kann. Allerdings würd ich den 6014 nehmen, der hat
einen 12Bit-ADU gegenüber 10Bit beim 6010.

von Philip (Gast)


Lesenswert?

währ es net viel besser einfach 2 avrs zu nehmen ?

ein für tiefen ein für hochton bereich ?

von Matthias Asselborn (Gast)


Lesenswert?

geht ja nicht
hat Benedikt ja schon probiert !
eine FFT (Fast Furier Transformation)
digitalisiert ja nur ein Spektrum (von 0 - Samplerate/2 ) Herz
da kannst nicht irgendwo anfangen
deshalb ja der Filter vor der 2. FFT
und du hast immer Übergänge sei es z.b. in der Geschwindigkeit
deshalb wäre ein vernünftiger DSP doch schon viel besser
habe mit PICs auch noch nichts gemacht ich könnte sie aber in
einer Elektronikfirma programmieren

von Philip (Gast)


Lesenswert?

für uns alle ;) ?

von Matthias Asselborn (Gast)


Angehängte Dateien:

Lesenswert?

im H-Mpeg (www.h-mpeg.de) Mp3 Player
wurde auch ein 8515 er atmel mit einem externen RAM verwendet

von Matthias Asselborn (Gast)


Lesenswert?

Autor: Philip
Datum: 09.02.2005 18:31
---------------------------------------------------------------------
für uns alle ;) ?


dumme Frage!
liese sich machen!

von ChristianF (Gast)


Lesenswert?

Hallo,

die gängigen DSPs muß man bei jedem einschalten neu programmieren.
Natürlich kann man sowas machen, aber man brauch noch einen externen
Speicher, einen 2. Prozessor der das Programm lädt o.ä. usw.

Das ist recht kompliziert...

Meiner bescheidenen Meinung nach kann man in der Tat mehrere Atmels
nehmen, z.B. einen mit f_s=44kHz für 5...22kHz (oder so) und einen
anderen mit f_s2=10kHz für 0...5kHz. Das Problem mit den
unterschiedlichen Geschwindigkeiten bekommt man ganz einfach dadurch in
den Griff, daß man bei dem Prozessor, der entsprechend "schneller"
ist, nicht jedes Ergebnis auf dem Display ausgibt/eine Mittelung
durchführt/usw., auf jeden Fall so, daß die Aktualisierungsintervalle
ähnlich sind.

Bei entsprechend schnellem Prozessor geht sowas auch mit einem,
versteht sich, aber so macht es Benedikt ja...

von Matthias Asselborn (Gast)


Lesenswert?

es geht ja nun darum andere Intervalle zu bekommen !
eine exaktere Teilung !
soe wie sie die Studioanalyzer haben (Terzbänder)
also 20 25 30,5 40 hz usw...
das ist ja grad das problem

von ChristianF (Gast)


Lesenswert?

und?
512Pkte bei f_s=10kHz macht immerhin 10000/512 Hz=20Hz Abstände. Das
müßte man sich halt mal ausrechnen und überlegen, wie man das so
aufteilen könnte...

von Benedikt (Gast)


Lesenswert?

Reicht denn die Lösung von ape nicht ?
Ein mega32 mit 2x 512 Punkt FFTs liefert im Bereich 0-2kHz eine
Auflösung von 10,8Hz und im Bereich bis 22kHz eine Auflösung von 86Hz.
Und das sollte doch reichen, oder ?

von Matthias Asselborn (Gast)


Lesenswert?

Frage:

warum nicht 7 sehr steile Filter machen
die 1. FFT von 0 bis 2,75 khz
Ausgabe auf's Display !
dann die 2. FFT mit nem Bandpass 2,75 bis 22khz
starten
Ausgabe aufs Display
usw...
dan hätte mal zwar 8 Schaltungen aber die liesen sich ja durch SMD
Technik auf einer 100x160 er Platine unterbringen !

dann könnte man über die paar Herz eine FFT mit 4096 Punkten
legen

von Philip (Gast)


Lesenswert?

meinst du jetzt einfach 7 einzelne komplett getrente ? die dann ihre
eigenen leds? haben ?

sprich jeder FFT hat ein paar leds die er ansteuert.. und sonst keine
aufgabe? die anderen machen dann die anderen bereiche ?

von Matthias Asselborn (Gast)


Lesenswert?

Autor: Benedikt
Datum: 09.02.2005 20:48

------------------------------------------------------------------------ 
--------

Reicht denn die Lösung von ape nicht ?
Ein mega32 mit 2x 512 Punkt FFTs liefert im Bereich 0-2kHz eine
Auflösung von 10,8Hz und im Bereich bis 22kHz eine Auflösung von 86Hz.
Und das sollte doch reichen, oder ?


sorry habe deinen Post zu spät gelesen ! das wäre ja fantastisch !!!

von Matthias Asselborn (Gast)


Lesenswert?

zumal ich noch 2 atmega 16 und 32 in smd daheim habe !
gut das machen wir !

von Matthias Asselborn (Gast)


Lesenswert?

problem ! die Samplerate ist wieder bei 22khz oder ?
wo gibt es denn den Code ?
könnte mal einer Licht ins dunkle schaffen ?

von Björn (Gast)


Lesenswert?

Auch auf die Gefahr hin, dass ich mich wiederhole:
Macht doch ne Zoom-FFT und dann am besten noch zwei

von Philip (Gast)


Lesenswert?

ist zwar offtopic, aber erklär mal bitte wie das funzt mit ner
Zoom-FFT?
ich weiss nicht so genau was das ist-.-

von Benedikt (Gast)


Lesenswert?

Was ist eine Zoom-FFT ?

@Matthias Asselborn
Schau mal weiter oben, da gibts den Code von ape.
Den musst du nur noch mit meinem mischen um die FFTs auf 512 Punkt
anzupassen aber als Ausgabe den UART zu verwenden.

von Matthias Asselborn (Gast)


Lesenswert?

frage ich mich auch schon die ganze Zeit
ist das eine FFT die NUR einen speziellen Bereich
fasst ?

@Benedikt könntest du mir da mal helfen ! weil dein code C und der von
Ape ASM ?!
assembler kann ich leider nicht
bzw hoffe es im Studium noch zu lernen

von Björn (Gast)


Angehängte Dateien:

Lesenswert?

Ja mit ner Zoom-FFT lassen sich bestimmt bereiche im Spektrum
berechnen.
Ich hab auch da mal nen Protokoll von mir rangehängt. Das ist zwar
ziemlich hektisch mit Abgabetermin im Nacken zusammen geschrieben, aber
das Prinzip sollte zu erkennen sein.

Ach ja und ich weiß per Definition berechnet die DFT das Spektrum von
0-Fa ;-)

Gruß
Björn

von Matthias Asselborn (Gast)


Lesenswert?

ja gut mir würde aber trotzdem die von Benedikt angesprochene Variante
besser gefallen

Ein mega32 mit 2x 512 Punkt FFTs liefert im Bereich 0-2kHz eine
Auflösung von 10,8Hz und im Bereich bis 22kHz eine Auflösung von 86Hz.


könntest du mirmit dem Code helfen ?
c und asm mixen ?
evtl hinter die Zeilen schreiben was geschiet ?

grüßles matthias

von ape (Gast)


Lesenswert?

@benedikt hast du nen lauffähigen code für eine 512er FFT? Hab den
Thread eben durchgescrollt und nichts gefunden.
Aber mit 2 512 Punkte FFTs wär auch ein mega32 speichertechnisch
überfordert oder (Ich hab jetzt nich nachgerechnet aber ich denke
nichtmal eine würde ohne Probleme passen)?

von Matthias Asselborn (Gast)


Lesenswert?

ich weis auch nicht wo Benedikt das im Forum gelesen hat...

von Benedikt (Gast)


Lesenswert?

@ape
Hast du nur einen 256er FFT im mega32 ?
Du hast doch die Schleifenzähler usw. schon auf 16bit geändert, so dass
man eigentlich nur noch auf 512 umstellen muss ?

Gena nachgerechnet habe ich nicht, aber eine 128 Punkt FFT braucht ca.
860Byte, und eine 512er sollte daher mit 4kB auskommen.

von ape (Gast)


Lesenswert?

der mega32 hat aber nur 2kB SRAM :P
Hab gerade nachgerechnet: 512 Punkte benötigen 3328 Bytes. Man bräuchte
also mindestens einen mega64 oder ein externes SRAM.

Und ich benutze sogar nur eine 128er FFT.
Die Zähler auf 16 Bit zu erweitern hat leider nicht das gewünschte
Ergebnis erbracht, da in der do_fft routine anscheinend noch ein
anderer Wert bis FFT_N zählt und mit diesem auch multipliziert wird
(Ich vermute es ist das u bzw. XH). Soll heißen man müßte noch eine
16Bit Multiplikation einbauen. Das war mir so auf die Schnelle mit
meinen bescheidenen asm-Kenntnissen zu aufwendig.
2 128 Punkte FFTs reichen mir aber auch. Wobei man mit 512 Punkten die
gleiche Auflösung (~40Hz) bei der gleichen Bandbreite (0-11kHz) mit
einer einzigen FFT erreichen würde.

von Benedikt (Gast)


Lesenswert?

Stimmt, der mega32 hat nur 2k, hatte das mit dem 64er verwechselt.

Ich fasse mal kurz das bisherige zusammen:
Im unteren Frequenzbereich wird eine Auflösung von 10Hz benötigt. Dafür
benötigt man eine 4096 Punkt FFT für den Bereich 0-22kHz.
Eine 4096 Punkt FFT lässt sich mit AVRs also nicht verwirklichen, und
andere DSPs die dazu in der Lage wären (also genügend Speicher und
Rechenleistung haben), sind nicht gerade günstig, und würden daher kaum
einen Vorteil gegenüber eines diskreten Spektrum Analysers bieten.

Somit bleibt nur die Lösung mit mehreren 128 Punkt FFTs und dem
MAX29x:
a) Tiefer Bereich mit 1,385kS/s für 0-500Hz mit 10,8Hz Auflösung
b) Mittlerer Bereich mit 5,54kS/s für 0-2kHz mit 40Hz Auflösung
c) Hoher Bereich mit 44,3kS/s für 0-22kHz.

Warscheinlich wird das ganze auf 2-3uC hinauslaufen:
Einer für den mittleren und hohen Bereich, und einer für den tiefen. Im
tiefen Bereich benötigt der uC alleine schon 100ms nur um die Daten
aufzzeichnen. Der zweite uC macht den restliche Frequenzbereich.
Die Daten könnte man auf dem Tiefbereich uC verarbeiten und
zusammenfassen, da der sich während der Aufzeichnung langweilt.
So hätte man insgesamt 192 Messwerte, die man zu 16-64 Werten mit
einigermaßen logarithmischer Verteilung zusammenfassen kann.

von Matthias Asselborn (Gast)


Lesenswert?

hab ich aber schon oft vorgeschlagen z.b. 3 oder am besten 4 ffts zu
machen

von ape (Gast)


Lesenswert?

Problem dabei dürfte aber sein, das, wie du schon selber geschrieben
hast, der tiefebereichnur nur gut 10 berechnungen schafft ergo die
komplette FFT nur 10mal pro Sekunde refreshed wird. Man könnte zwar die
höheren Frequenzen öfter refreshen, aber in den Tiefen kommt man da nich
drumrum.

Wobei mir gerade doch eine evtl. Lösung einfällt.
Möglicherweise könnte man einfach immer die zweite Hälfte des Capture
Buffers in die erste kopieren und dann nur die zweite wieder auffüllen,
so dass man überlappende Bereiche hätte. Damit ließe sich die
Refreshrate verdoppeln oder auch noch mehr wenn man eine noch größere
Überlappung nimmt. Und bei dieser niedrigen Samplingrate sollte es auch
machbar sein den Buffer shcnelle genug umzukopieren, do dass keine
Samples verloren gehen.

von Matze (Gast)


Lesenswert?

was spricht gegen einen externen speicher ?
die kosten nichts ! und  gibt es in 16..32..64kb..

von Benedikt (Gast)


Lesenswert?

Gegen einen externen RAM spricht, dass man dann einen externen ADC
braucht, da es keine AVRs mit Datenbus und ADC gibt, zumindest nicht in
der billigen Preisklasse. Zumindest habe auf die schnelle keine
gefunden.
Insgesamt wird alles dadurch aufwendiger.
Für 3 FFTs sollte der mega32 problemlos ausreichen, eigentlich sogar
auch der mega8

von Philip (Gast)


Lesenswert?

ich bin auch dafür das wir das einfach mit mehreren avrs machen,
ist billiger und einfacher., was bringt es jetzt teure hardware zu
nehmen, wenn man fürs gleiche geld einen komplett fertig aufgebauten
bekommt...

3-4 FFts sind da viel praktischer...

von Dirk (Gast)


Lesenswert?

@ Björn

ich habe mir mal dein script durchgelesen, sehr schön erklärt, mir ist
nur aufgefallen das du "Hanning-Fenster" geschrieben hast, ich aber
in büchern immer vom Hemming-Fenster lese. Was ist nun richtig ?

von Benedikt (Gast)


Lesenswert?

Es gibt sowohl Hamming als auch Hanning

von ape (Gast)


Lesenswert?

@philip: gegen so viele FFTs spricht, das es
1) sau langsam ist
2) wesentlich größerer hardware aufwand, weil mehrere AVRs, die jeder
nen tiefpass-filter brauchen
3) damit einhergehend wesentlich mehr platzbedarf (Für nen LED Spec
Analyser mag das nich so das Problem sein, aber bei mir ist kleiner =
besser)
und 4) is das spektrum an den übergängen halt immer irgendwie
unterbrochen. Bei Musik fällts i.d.R. nich so auf aber wenn nen sinus
durchläuft sieht mans doch recht deutlich.

und 5) hör ich gerade von dir immer ich will, ich will, ich will und
meistens nichts konstruktives...

von Philip (Gast)


Lesenswert?

ja mei ape, ich kann in dem bereich nicht viel dazu bei tragen, weil mir
die möglichkeiten fehlen, ich helfe Matze so weit ich kann, wir kennen
uns scho recht lange, aber mehr als ein paar ideen kann ich nicht
beitragen... naja was soll ich sonst machen, wenn du dich jetzt darüber
auf regst tja sorry kann ich nix machen, dann ignorier mich oder so...

ich werds überleben

von Benedikt (Gast)


Lesenswert?

@ape
Den Übergang sieht man nur, wenn man die Werte 1:1 anzeigt.
Bei meiner Anzeige sieht man den Übergang bei weitem nicht so deutlich
wie bei deinem LCD, das ich versuchte eine einigermaßen logarithmische
Anzeige zu bekommen, indem ich mehrere Werte zusammenfasse um so bei
hohen Frequenzen die Auflösung zu verringern.

von Matthias Asselborn (Gast)


Lesenswert?

folgendes erst mal ne Streiten !!
es war nur eine Idee mit dem externen Speicher da der halt im Mp3
Player damals auch recht hilfreich war die Daten der CD dort
zwichenzuspeichern ect.... andererseits habt ihr schon recht @externer
AD
weil der von analog devices n 24 bitter gleich mal 30 euro kostet oder
bin ich da nicht mehr auf dem laufenden
ganz am anfang hab ich schon vorgeschlagen das ganze mit mehreren
filtern bzw atmels mit fft dahinter zu schalten
also 4 ffts dürften ja reichen ....
oder von CS weis nicht Crystal glaub ich hatte ich mal n DA für 12 euro
da ...
es kommt halt dann auf die Filter drauf an ...denke ich
wenn die net exakt sind ist das alles nicht so optimal
@ape wie wirkt sich das auf die Geschwindigkeit aus ?
müsste ich mal aufbauen und guggen

von Matthias Asselborn (Gast)


Lesenswert?

@ape :is das spektrum an den übergängen halt immer irgendwie
unterbrochen. Bei Musik fällts i.d.R. nich so auf aber wenn nen sinus
durchläuft sieht mans doch recht deutlich.


ja gut das wusste ich nicht ist das echt so extrem ? also liegt es an
den filtern .......

von Benedikt (Gast)


Lesenswert?

Die Unterbrechung kann man per Software vollständig kompensieren, denn
die FFTs liefern alle dasselbe Ergebnis (nur mit unterschiedlichen
Auflösungen für unterschiedliche Bereiche).
Egal ob mal die Gleichung 5*5+5*x=5*10 löst, oder 5+x=10, es kommt
dasselbe raus. Dasselbe ist bei FFT: Dies ist ja im Prinzip eine
umkehrbare, mathematische Berechnung.

von Thorsten (Gast)


Lesenswert?

@Benedikt:

Sofern es noch von Interesse ist, der dsPIC30F6014 lässt sich
problemlos mit dem ICD Nachbau programmieren und auch debuggen. Sollte
mit anderen Typen also auch funktionieren.

Gruß
Thorsten

von Benedikt (Gast)


Lesenswert?

Für das FFT Projekt vielleicht nicht, aber da ich sowiso mit PICs
demnächst arbeiten werde, werde ich mir die dsPICs auf jedenfall mal
anschauen und testen.

von Benedikt (Gast)


Lesenswert?

Ich habe gerade mal die letzen Fehler aus meinen 32MS/s DSO mit einem
AVR behoben und dabei mal alle möglichen Signale am Spektrum Analyser
gemessen.
Eigentlich hätte die Schaltung garnicht funktionieren dürfen, denn ich
hatte ein paar schlimme Softwarefehler drin.
Der mega8 schiebt die Daten zum Display mit rund 30fps raus, also rund
die Hälfte der Orginalsoftware. Immerhin muss der uC jetzt ja auch 2
128 Punkt FFTs machen.

Fazit: Die 5,5kS bremsen kaum was aus, wenn man z.B. die
Zusammenfassung und die Übertragung der Daten in die Samplingphase für
die 5,5kS legt.
Werden allerdings 3 FFTs verwendet, sollte man für die ganz langsame
doch einen 2. uC verwenden.
Ich denke ich werde daher mal die Idee von ape ausprobieren, immer nur
eine Hälfte des Samplingpuffers neu aufzufüllen.
Allerdings benötigt man dazu zwei Samplingpuffer, da während der FFT
die Aufzeichnung unterbrochen wird und so eine Lücke entstehen würde.
Es wäre ja ungünstig, wenn sich während der FFT die Daten ändern...

von Matze (Gast)


Lesenswert?

also um n 2. µC wäre es nicht ! ist doch egal ein oder 2 Smd Atmels auf
der Platte ?!
würde fast 4 FFT s machen !
was hältst du davon ?

von ape (Gast)


Lesenswert?

@matthias:
Also der Preis wär bei nem externen AD noch das geringste Problem, es
gibt auch welche für 3€ und 24 Bit wäre nu wirklich etwas übertrieben
(abgesehen davon das die Software nur mit 16 Bit rechnet und da ich mir
noch nich die Mühe gemacht habe die Berechnung genauer zu untersuchen
könnts auch sein das nichtmal mehr als die 10Bit des internen ADs
gehen, da sonst möglicherweise Variablen überlaufen könnten)

@benedikt: wenn man die FFTs nacheinander auf einem AVR macht sind sie
eben nicht genau gleich, da sich das Spektrum ja ändert, die FFTs also
das Spektrum zu unterschiedlichen Zeiten darstellen.
Außerdem wird das Spektrum am Ende des Frequenzbereiches einer FFT
durch die einsetzende Dämpfung des Filters verfälscht.
Und ich denke man würde mit einem Sampling-Buffer auskommen, wenn man
diesen als Ring-Buffer auslegt. Vor Beginn der FFT werden die Samples
ja in den Butterfly-Buffer geladen, das geht ja recht schnell. Der
AD-Wandler sampled dann halt die ganze Zeit durch und im Buffer liegen
immer die letzten 128 Samples.

von Matze (Gast)


Lesenswert?

ja also was spricht dann gegen n externen rom bzw ad ?
die 3 sachen wären doch dann die hauptbestandteile der
fft platine !

@ape welcher 16bitter AD z.b. @3-4 euro

von ape (Gast)


Lesenswert?

Wer redet von 16 Bit? Der Interne macht 10 Bit und das ist vollkommen
ausreichend.

z.B. Microchip MCP320x mit dem hab ich sehr gute Erfahrungen gemacht.
Das ist ein 12 Bit Wandler. Preis auf der Microchip Seite: 1,91$ (für
den zweikanaligen)
Wird im Einzelstück wahrscheinlich noch ein bisschen mehr sein und ich
weiß auch nich ob man den hier irgendwo kaufen kann, aber 10 bis 12Bit
Wandler gibs wie Sand am Meer und die kosten alle nich so viel.

Aber bei den externen Wandlern ist das Ergebnis auslesen etwas
aufwendiger und es ist wieder ein Bauteil mehr.

Abgesehen davon hat man halt immernoch das Problem, das man auch mit
externem Speicher nich beliebig viele FFTs in einem AVR machen kann,
weil das dann einfach zu langsam wird.

von Benedikt (Gast)


Lesenswert?

@ape
>Außerdem wird das Spektrum am Ende des Frequenzbereiches einer FFT
>durch die einsetzende Dämpfung des Filters verfälscht.

Wenn man nicht alle Werte verwendet, sondern nur die unteren 2/3, dann
hat mand amit keine Probleme.
Bei 3 FFTs kann man das auch bedenkenlos machen.

Meine Idee wie ich das ganze machen würde:
Ein mega8 macht die FFT für die 5,5kS/44kS und sendet die Daten an den
zweiten mega8.
Dieser macht die langsame FFT und setzt alle 3 FFTs zu einem
logarithmischen Gesamtspektrum zusammen, bei dem man keine Übergänge
sieht.

von philip (Gast)


Lesenswert?

@Benedikt wenn du die zeit hättest,
ich hätte ein lied, das du vielleicht mal drüber laufen lassen
könntest, würde es dir per mail schicken oderwo hochladen, bitte mal
wenn du zeit hast mit cam apfilmen, mich würde mal die leistung des
spectrums interessieren die wir gerade haben... falls du zeit hast meld
dich doch kurz..

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe ein kleines Problem mit der Software im mega8:
Mein LED Display hat jetzt eine getrennte Spannungsversorgung (6V, max.
3A  über LM2576) von der restlichen Elektronik bekommen. Beides läuft an
einem 12V Netzteil. Je nachdem wieviele LEDs an sind, zieht das ganze
bis zu 3A (auf der 12V Seite). Wenn ich zu laut mache, bricht
anscheinend die Spannung zusammen, und der mega8 hängt sich auf.
Eigentlich sollte der Watchdog ihn dann nach einer viertel Sekunde
resetten.
Kann man jemand über den Code schauen, ob irgendwo ein Fehler bei der
Watchdogroutine ist? Ich bin eigentlich der Meinung, dass der Watchdog
funktionieren müsste.

von ape (Gast)


Lesenswert?

>    in r16, WDTCR
>    ori r16, (1<<WDCE) | (1<<WDE)
>    out WDTCR, r16
>    ldi r16, (1<<WDE) | (1<<WDP2)
>    out WDTCR, r16

Mhmm du schreibst zuerst das WDE und WDCE in den control-register und
gleich danach nochmal WDE und WDP2. Ich hab das Datenblatt jetzt nur
überflogen aber wenn ich das richtig verstanden habe brauchst du zum
aktivieren des watchdog timer nicht das WDCE-Bit setzen.
Nichts desto trotz sollte es eigentlich funktionieren :)

von Benedikt (Gast)


Lesenswert?

Ich hatte es erst anderst, also WDT aktiviert und gleichzeitig den Rest
gesetzt, dann ging es nicht.

Ich habe alles mal extrem übersteuert, so dass die Spannung wirklich
total zusammenbricht, dann erkennt man den Reset (wenn 1/4s lang alles
steht).

Manchmal bleibt aber alles trotzdem hängen. Keine Ahnung warum.

von ape (Gast)


Lesenswert?

So hab jetzt meine Version auch mal in der Codesammlung veröffentlicht:

http://www.mikrocontroller.net/forum/read-4-159757.html

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Endlich hat es Reichelt geschafft die fehlenden Platinen zu liefern, und
nach einem weiteren Nachmittag LEDs bestücken ist nun der 32x16 Spektrum
Analyser fertig.
Im Bereich >3kHz tut sich echt eine Menge. Auch der Bereich >10kHz ist
interessant, denn man erkennt sofort ob die mp3 auf 10kHz Bandbreite
beschränkt ist, oder nicht.
Leider ist der internde ADC des AVR mit 44kHz Samplerate (ca. 570kHz
ADC Takt !) doch etwas überfordert, so dass die unterste LED Zeile
konstant leicht flackert.
Die Auflösung im unteren Bereich liegt bei 40Hz, am oberen Ende sind es
rund 3,8kHz.
Die Stromaufnahme liegt bei etwa 1A bei 12V wenn ich den Analyser mit
Musik so ansteuere, dass die Peaks etwa in den gelben Bereich gehen.
Bei Vollaussteuerung (alle LEDs an) zieht die Schaltung ca. 40-50W,
aber das schafft der LM2576 nicht lange.
Der LED Strom liegt bei rund 150mA bei 1/16 Tastverhältnis.

von philip (Gast)


Lesenswert?

kannst du mal was bewegtes zeigen?

von matthias asselborn (Gast)


Lesenswert?

dachte du wolltest :

Somit bleibt nur die Lösung mit mehreren 128 Punkt FFTs und dem
MAX29x:
a) Tiefer Bereich mit 1,385kS/s für 0-500Hz mit 10,8Hz Auflösung
b) Mittlerer Bereich mit 5,54kS/s für 0-2kHz mit 40Hz Auflösung
c) Hoher Bereich mit 44,3kS/s für 0-22kHz.

das erreichen ?

grüßles matthias

von Benedikt (Gast)


Lesenswert?

Ohne eine Bezugsquelle, bei der man auch als normalsterblicher den
MAX29x zu einem vernünftigen Preis bestellen kann, oder einen anderen,
einfachen Tiefpass, habe ich eigentlich keine Lust an der jetzigen
Schaltung was zu ändern.

von keksohr (Gast)


Lesenswert?

:) kannst du mal sagen wie du das mit den bandpass filtern gelöst hat?
bekommt man den auf normalen weg bzw die teile ? oder ist das echt son
dummes ding was man nur alsfirma oder so bekommt....

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Es gibt keine Bandpassfilter. Das ganze läuft (außer einem 2kHz Tiefpass
für den unteren Bereich) komplett digital in einem mega8 mit 18,432MHz.

Ich habe mal ein Video angehängt, das ganz gut die große Auflösung des
Analysers zeigt. Vor allem am Anfang erkennt man (auf dem Video nicht
ganz so gut), dass bei jedem, Bing (keine Ahnung wie man diese
Geräusche bezeichnet), ein anderer LED Balken aufleuchtet, da die Bings
immer eine unterschiedliche Frequenz haben.

von keksohr (Gast)


Lesenswert?

das is im untereren bereich auf jedenfall schon mal nach meinen
ansprüchen, nur was ich jetzt ihrgend wie dumm finde, das es nur 32
leds sind, 64 währen jetzt ganz erlich gesagt viel geiler.... das ist
ihrgend wie im unteren bereich zwar okay, aber hmm kann man das
erweitern ?

von Benedikt (Gast)


Lesenswert?

Natürlich kannst du das erweitern. Du kannst sogar eine 64x64 LED Matrix
aufbauen, aber glaub mir: 512 LEDs zu löten ist genug Arbeit.

von Benedikt (Gast)


Lesenswert?

@ape

Könntest du mal etwas für mich ausprobieren ?
Den Analyser mit Musik stark übersteuern, denn bei mir hängen sich dann
die FFTs auf, obwohl ich den Watchdog laufen lasse.
Einmal hat sich sogar nur der 44kS FFT aufgehängt (die rechte
Bildhälfte hat sich nichtmehr verändert), die 5,5kS FFT lief aber ganz
normal weiter.

von matthias asselborn (Gast)


Lesenswert?

hmm eine frage hab ich noch dazu
wieso sind wenn s steile balken gibt die nachbar balken nicht
davon betroffen ?
könntest mal n sinus drüber laufen lassen ??
aber an und für sich schon ok

wieso was kostn son max ?

von matthias asselborn (Gast)


Lesenswert?

der max 29x is doch son bandpassfilter 3 kanal
stimmt und ich überlegte mir damals diesen zum analyzer zu verwenden
ich glaube beim electronicpool gibt es denn für glaub mal 5 euro
mal guggen

von Benedikt (Gast)


Lesenswert?

Ich verstehe nicht ganz was du meinst mit steilen Balken.
Einen Sinus hatte ich vor einiger Zeit schonmal laufen lassen, auch mit
den restlichen 160 LEDs die damals noch fehlten hat sich nicht viel
verändert:

http://www.mikrocontroller.net/attachment.php/152417/fftsinus.avi

Was ein MAX29x kostet weiß ich nicht, denn man bekommt ihn ja nirgends
(außer als Sample von maxim). Zumindest nicht bei den "normalen"
Elektronikversandhändlern (Reichelt, Spoerle, RS, Farnell, Bürklin,
Digikey usw.)

von matthias asselborn (Gast)


Lesenswert?

also bei segor gibt es den MAX 275 ,280, 297

der 280 is n 5 . ordnung lowpass
der 297 ein 8. ordnung lowpass

gruß matthias

von matthias asselborn (Gast)


Lesenswert?

einfach bei segor  unter halbleiter im onlinekatalog ics nach hersteller
m
dann m/max typen bis max499
dann kommen die ganzen filter

von Benedikt (Gast)


Lesenswert?

Bei dem Preis kann man das ganze vergessen. Da kommt ein diskreter
Tiefpass um einiges billiger, selbst mit 1% Widerständen und guten
Kondensatoren.

MAX 297 CPA                Bestelltyp, nicht ab Lager lieferbar
8.Ord.Elliptic LPass DIP8
Lieferzeit 10Wochen  (VE: 1 St.) :      14.20 EUR

MAX 296 CPA                Auslauftyp 8.Ord.Clk-Tun.LPass DIP8
Nicht mehr lieferbar  (VE: 1 St.) : nicht lieferbar

MAX 280 CPA                Bestelltyp, nicht ab Lager lieferbar 5.Ord.
Lowpass DIP8
  (VE: 1 St.) :      11.15 EUR
ab 10 VE:       8.92 EUR

von matthias asselborn (Gast)


Lesenswert?

liesse sich da noch was im tiefpass verbessern?
frage: wie isn das mit dem flackern ?
mit den balken meinte ich ich sehe auf dem video
das z.b. einr vollausschlägt der nebendran nichts macht aber der
nächste wieder aussteuert... das meinte ich ...

von Benedikt (Gast)


Lesenswert?

Meinst du das Flackern der rechten paar LEDs in der untersten Zeile,
auch wenn kein Signal anliegt, oder allgemein das Flackern ?
Ersteres habe ich jetzt dadurch behoben, dass ich nur Werte >2 anzeige,
und alles darunter (also 1 und 2) zu Null mache.
Ansonsten flackert nichts, in der Software wird der Spitzenwert
gebildet und langsam auf Null gefahren, also so wie bei einem echten
Spitzenwertgleichrichter.

Das ist ja das schöne an der FFT:
Wenn ein reiner Sinuston anliegt, erhält man wirklich nur einen Peak.
FFT ist eben schon nahe dran an der idealen Durchlasskurve mit fast
unendlicher Steilheit.

von keksohr (Gast)


Lesenswert?

was muss denn jetzt noch gemacht werden ?

von ape (Gast)


Lesenswert?

@Matthias: Es hängt halt vom Eingangssignal ab, Wenn da nunmal 2 laute
Sinustöne drin sind deren Frequenzen etwas auseinanderliegen, sieht man
das in der FFT an Hand von 2 Balken die auftauchen, wenn die Frequenzen
dazwischen nicht vorkommen leuchten auch die Balken nicht auf...

@Benedikt: Habs mal probiert, bei mir ist nichts abgeschmiert. Ich
denke aber das liegt bei dir tatsächlich an den vielen LEDs, und die
auftretenden recht großen Ströme die ja doch recht schnell geschaltet
werden. Kann gut sein das das ganze auch einfach ganz ordentlich
strahlt und damit den AVR lahm legt.
Ich hab neulich 24 super helle LEDs (3,3V; ins Gesamt 500mA) mit einer
30kHz PWM angesteuert und damit meine Funkt-Tastatur lahm gelegt.
Im Zweifelsfall den AVR in ne geerdete Blechbüchse tun :P

Als ich nach dem MAX297 geguckt hatte gabs den bei Segor noch nicht.
Aber 10 Wochen Lieferzeit is ja ganz schön übel und 15€ sind auch nich
wenig.

von keksohr (Gast)


Lesenswert?

dann baut den doch einfach ohne diese teile auf und dann mit OPS oder so
mit mehreren einfach... das der richtig schön steil wird...., warum so
einen stress dann lieber so !

was istn wenn man den avr in ne blechbüxe packt und die spannung noch
mit ein paar GoldCap Kondensatoren sichert ? die hätten genug leistung
und kosten auch nicht mehr die welt zb für 5-6V.... bei reichelt gibt
es die für 3-7 euro.... 2 stück und gut ist^^

von Benedikt (Gast)


Lesenswert?

@ape
Danke, ich habe das Problem zwar nicht gefunden, aber umgangen:
In jeder Routine wird jetzt ein Bit gesetzt, und wenn am Ende nicht
alle Bits gestzt sind, gibt es kein WDR -> Reset
Mit voller Lautstärke lief das das ganze fast zwei Stunden ohne
Probleme, dann hat sich mein Netzteil verabschiedet. Das Display
braucht verdammt viel Leistung. Jetzt läuft das Display an einem 15V 2A
Netzteil.

Störungen kann ich eigentlich ausschließen: Ich habe getrennte
Spannungen für die LEDs und den AVR und auch getrennte Massen auf der
Platine, die nur an einem Punkt verbunden sind. Außerdem ist der mega8
bei mir etwa 50cm von der LED Treiber Platine weg, über eine 10 adriges
Kabel ausgelagert um genau diese Störungen nicht im Audiosignal zu
haben.

von matthias asselborn (Gast)


Lesenswert?

nun benedikt wollte ich dich wegen dem code
und den 2 schaltplänen fragen so dass ich da n vernünftiges layout
entwerfen kann

grüßles matthias

von Benedikt (Gast)


Lesenswert?


von matthias asselborn (Gast)


Lesenswert?

dann kann ich die schaltpläne von ape verwenden und den code von dir ?

von matthias asselborn (Gast)


Lesenswert?

ah da hast ja die pläne gleich implementiert
könntest du mir die eagle ? datei per mail senden ?
das wäre toll !

gruß matthias

von matthias (Gast)


Lesenswert?

benedikt könmntest du mir ein paar infos über den asm fft code geben wie
ich ihn verändere
denn ich bekomme in nächster zeit doch nen max bzw wenn nicht bastle
ich mir n filter
oder ist das dann 3 mal der selbe code aber wie verändere ich die
frequenzen ?

den ehrlich gesagt sind mir 40hz auflösung doch etwas zu wenig wenn ich
da die frontplatte des audioscope angugge....

grüßles matthias

von Benedikt (Gast)


Lesenswert?

Eine Version mit 3 FFTs wird um einiges komplizierter, da man entweder
mit einem zweiten mega8 arbeitet, oder mit 5fps zufrieden sein muss.
Und das ist mir ehrlich gesagt zu viel Arbeit.

Bei der Initialisierung wird an OC1B ein 444kHz Takt ausgegeben. Dieser
muss an die jeweilige Samplerate entsprechend angepasst werden.
Im Flags Register dient Bit3 zur Unterscheidung ob gerade der hohe oder
Tiefe Frequenzbereich berechnet wird, damit werden die entsprechenden
Routinen ausgewählt und die neuen Messungen gestartet.
Die Routinen do_window und do_fft benutzen beide. Bei make_bars gibt es
eine High und eine Low Routine in denen aus den Komplexen Werten de
Betrag der jeweiligen Frequenz ermitteln.
In der rfsh_bars Routine werden die Werte dann zusammengefasst:
Dazu gibt es die ganzen makexp Routinen
In rfsh_bars werden aus jeweils x Werten der Maximalwert
herausgesucht.
Das ganze funktioniert folgermaßen (am Beispiel von ds_hl2):
CL bestimmt die Anzahl an erzeugten Werten, hier 16:
Ist CL >=12, werden die Werte unveränder übernommen.
Ist CL >=9, werden 2 Werte zu einem zusammengefasst
Ist CL >=6, werden 3 Werte zu einem zusammengefasst
Ist CL >=4, werden 4 Werte zu einem zusammengefasst
Ist CL >=2, werden 6 Werte zu einem zusammengefasst
Ansonsten werden 8 Werte zusammengefasst
Insgesamt stehen 64 Werte zur Verfügung, von denen aber nur 59
verwendet werden, da die unteren 5 (daher oben bei der Zweisung des Y
Pointers die +5) schon durch den tiefen Bereich abgedeckt wurden.

Vielleicht werde ich irgendwann die Software mit 3 FFTs schreiben, aber
im Moment habe ich weder einen Grund, noch Lust dazu, da mir die
Auflösung ausreicht, und mein PC die tiefen Frequenzen auf einem
getrennten Kanal ausgibt, sie also sowiso nicht dargestellt werden.

PS: brauchst du noch meine Eagle Dateien ? Warscheinlich werden die
aber wenig hilfreich sein, da ich die Bauteile nur für einen
ordentlichen Schaltplan, nicht aber fürs Layout ausgewählt habe. Die
Größen passen also nicht.

von matthias (Gast)


Lesenswert?

ja bitte um die Eagle Dateien !
das erspart mir einige Zeit! kann mich also mit dem Code nun endlich
mal auseinandersetzen!  studiere ja nächstes Jahr Informatik
da werde ich dan wohl etwas mehr über Assembler lernen
oben schreibst du: "es stehen 64 Werte zur Verfügung"
ist das eine 64 Punkt FFT ?

grüßles Matthias

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Nein, es ist eine 128 Punkt FFT, denn es werden 128 Sample Werte in 64
Real und 64 Imaginärteile für die Amplitude umgerechnet, so dass man im
Prinzip 64 Beträge und 64 Phasenwinkel für die Amplituden bekommt.