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...
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.
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.
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.
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?
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.
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.
@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
@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.
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.
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...
g Ja is sehr komplex das ganze... werd mal versuchen mit einem fertigen Quellcode was anzufangen...
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.
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.
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
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
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
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...
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
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.
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 :)
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.
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
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.
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
@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.
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.
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.
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.
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.
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
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.
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
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.
@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.
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
ah wie ich sehe ist nun aus der digitalen Spec Analyzer Variante nun doch was geworden g
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.
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?
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.
@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.
habe 2mA led s verwendet vom reichelt platinen in bulgarien ätzen lassen ! habe aber daheim auch noch samsung led dot matrix displays 3 farbig...
sendest du mir bitte mal einen schaltplan deiner version mit µC das würde mich nun brennend interessieren ! bzw layouts oder codes ?
@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.
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
@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.
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.
@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.
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
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.
@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
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
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.
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.
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
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
n 12x28 oder 32 würde ja auch schon reichen aber das lässt sich ja variieren
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 :)
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 :)
Für die LEDs empfehle ich so vielfachLEDfassungen da man die LEDs sonst schwierig exakt gerade in eine reihe bekommt.
ach ja ich poste anbei mal Fotos @ Steuerung , Display ! Frontplatte usw...
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.
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.
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.
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
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 ?
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...
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.
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.
@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
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.
@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?
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
@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 !
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...
@Matthias Asselborn Ich vermute mal du hast analoge Filter verwendet. Irgendein AVR digitalisiert die Werte und steuert die LEDs im Multiplex an ?
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
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.
@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.
@Benedikt ja so ist es aber wenn nun die fft schon mal funktioniert lässt sich das ganze schnell umbauen !
>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
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.
@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.
in welchem preisbereich würde sich ein zb. 10x10 Spec mit einem AVR bewegen? Und wie viel Khz sind schon möglich?
@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...
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
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..
könnte einer fürn 32x16 oder 32x12 oder ovn mir aus auch nur 28x12 oder 28x16 LEDs einen schalt plan machen ?
@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?
@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
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.
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.
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.
gingen 10 er auch ? di hab ich grad noc rumfahren aber ich beende für heute evtl morgen abend andere besorgen
10er? es sollte jedenfalls alles vom mega8 an gehen. muss halt nur genug pins für das LCD und ne TWI Schnittstelle haben
ah ok :) fürs TWI? naja probieren kost nichts aber ich schätze die sind zu groß
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)
ich habe mal eine frage ! der eigentliche fft ist doch in assembler ? das display dann in c oder verstehe ich da was falsch ?
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.
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 !
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
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
funzn das mit einer frequent scho gut ? wenn ja schicks mir doch bitte einfach per icq weisst ja wo du mich findest ;)
@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...
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 !
>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...)
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 !
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.
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..
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
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)
@ 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 ?
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...
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 ??
@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)
Hallo Benedikt hast du irgendeine Scalierung bei den Led s nach Db ? oder lässt sich die nachträglich programmieren ?
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.
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 )
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.
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
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.
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 :-)
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...
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
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 ?
Das Programm ist nur die Anzeige. Die Frequenzen und die Pegel werden auf dem anderen uC bestimmt.
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
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 ?
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.
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
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 ?
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 ?
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
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 ?
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.
@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.
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.
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 !
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.
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...
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...
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 !
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
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.
@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.
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 ?
@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.
Ich habe die betreffenden Seiten mal gescannt. Mal sehen ob ich es hier als Anhang reinstellen kann (ist groß)...
Aha, hat also nicht funktioniert. Sag' mal Deine Email-Adresse und ich schicke es Dir per Mail (3MB).
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.
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.
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.
>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.
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.
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! ;-)
Nochmals Danke ! Jetzt habe ichs verstanden. Ich glaube da werde ich mir erstmal ein kleines Prog schreiben, das mir die ganzen Werte berechnet...
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 :)
Vielleicht hilft euch das ja...? http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010007&part= Gruß Björn
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.
ok dann mach ich mich mal an s werk @hardware ist deine display hardware gleichgeblieben ?
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.
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 !
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.
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
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.
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 ?
die ad s nacheinander auslesen und ausgeben sollte doch möglich sein ?
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 ?!
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...
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 ?
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+
ì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
is von Analog Devices lief auf 10 Mhz ich denke diese Serie ist noch erschwinglich !
nun hab ich einen gefunden ! der TI TMS320LF2403APAGA bringt 40 mhz 40 mips (denke das reicht) für 30 euro
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
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
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.
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
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.
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 ?
weil ich denke wenn schon n spec analyzer mit ner fft dann richtig ! und in 1/3 oct schritten
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...)
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 !
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
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.
wäre ja sogar erschwinglich der DSP !!!! bzw ein spezielles Programmierboarboard für den DSP macht mir grad noch Sorgen !
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.
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
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
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
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 !
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
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
@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
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
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
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
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...
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?
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.
Ich kann dir morgen (oder vielleicht schon heute Abend) sagen, ob der Nachbau funktioniert.
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.
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.
währ es net viel besser einfach 2 avrs zu nehmen ? ein für tiefen ein für hochton bereich ?
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
im H-Mpeg (www.h-mpeg.de) Mp3 Player wurde auch ein 8515 er atmel mit einem externen RAM verwendet
Autor: Philip Datum: 09.02.2005 18:31 --------------------------------------------------------------------- für uns alle ;) ? dumme Frage! liese sich machen!
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...
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
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...
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 ?
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
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 ?
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 !!!
zumal ich noch 2 atmega 16 und 32 in smd daheim habe ! gut das machen wir !
problem ! die Samplerate ist wieder bei 22khz oder ? wo gibt es denn den Code ? könnte mal einer Licht ins dunkle schaffen ?
Auch auf die Gefahr hin, dass ich mich wiederhole: Macht doch ne Zoom-FFT und dann am besten noch zwei
ist zwar offtopic, aber erklär mal bitte wie das funzt mit ner Zoom-FFT? ich weiss nicht so genau was das ist-.-
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.
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
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
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
@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)?
@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.
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.
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.
hab ich aber schon oft vorgeschlagen z.b. 3 oder am besten 4 ffts zu machen
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.
was spricht gegen einen externen speicher ? die kosten nichts ! und gibt es in 16..32..64kb..
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
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...
@ 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 ?
@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...
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
@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.
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
@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 .......
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.
@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
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.
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...
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 ?
@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.
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
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.
@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.
@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..
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.
> 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 :)
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.
So hab jetzt meine Version auch mal in der Codesammlung veröffentlicht: http://www.mikrocontroller.net/forum/read-4-159757.html
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.
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
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.
:) 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....
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.
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 ?
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.
@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.
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 ?
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
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.)
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
einfach bei segor unter halbleiter im onlinekatalog ics nach hersteller m dann m/max typen bis max499 dann kommen die ganzen filter
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
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 ...
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.
@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.
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^^
@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.
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
dann kann ich die schaltpläne von ape verwenden und den code von dir ?
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
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
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.
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
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.
Ob ein Informatikstudium so viel bei Assemblerprogrammierung weiterhilft, bezweifle ich. Das ist alles sehr theoretisch, und für meinen Geschmack zu wenig Praxisbezogen.
ach ja klar ich vergas geteilt durch 2 ... ja dann sind wir bei 128 :-) danke dir für die eagle Dateien ! grüßles Matthias
anbei mein Vorschlag der FFT Platine werde beide (FFT und Steuerplatte) auf eine 160x100 Eurokarte routen!
ich denke mal die Spannung ist 5V bei den Led Zeilen hast du mal 6V geschrieben.... wie kamst du auf den TLC272 ?
Die 5V sind für die gesamte Elektronik (also die beide uC, die HC4094 usw.), die 6V brauchen die MOSFETs für die Gate Source Spannung um die 5A verlustfrei zu schalten. Ich habe keine P-Kanal Logik Level MOSFETs bei Reichelt gefunden, die bei 5V Gate Source Spannung 5A schalten können. Anfangs dachte ich an irgendwelche MOSFETs im DIP-4 Gehäuse, aber die meisten können keine 5A schalten, zumindest die wo man bei Reichelt bekommt. Du kannst die LEDs zwar auch mit 5V betreiben, musst dann aber darauf achten, möglichst keine Verluste in den Leitungen, MOSFETs oder sonst wo zu haben, denn die LEDs brauchen alleine schon 4,3V ! Den TLC272 hatte ich rumliegen. Abgesehen vom LM358 war es der einzige der mit 5V auskommt den ich da hatte.
gibt es ne möglichkeit eventull nen schalter einzu bauen wo man von baar auf dot mode umstellen kann ? oder reicht der platz nicht mehr..
frage wieso so overkill transistoren ??? mein analoger spektrumanalyzer multiplext schneller und zwar die volle matrix 12x31 hat pro zeile n multiplex strom von nem ampere den ich mit den BC517 und BC518 schalte
Bei mit fließen 150mA pro LED. Ich multiplexe 1/16, also fließen 32*150mA=5A. Da gehen BC517 aber schenll in Rauch auf...
ja gut bei mir mit 2ma leds 20ma pro led dann bei 31 multiplex 31*20ma = ca 620ma die zeile da ich aber 4 multiplex anzeigen habe geteilt durch 4 das ganze und das machen die 517 er und 16 er locker mit
matthias hast du die eagel datein schon fertig ? so das ich mir das alles ätzen kann ? oder wie machen wir das jetzt?!
ich weis nicht mir gefällt die FFT nicht ! die Frequenzscala ist mir zu ungenau und die Stärke des Ausschlages passt in keiner Weise zu der db Norm dann gefallen mir die 5A Transistoren nicht bei meinem Bandpassanalyzer multiplexen 4 Atmels das Display so dass ich so Teile gar nicht erst brauche aber ich mach das Layout trotzdem für die FFT hast ja schon erhalten !
meine 16x16 er Matritzen möchten mal arbeit ! so baue ich ihn doch mal mit der FFT zum Test evtl bau ich ihn um - hat ja noch AD Wandler frei so dass ich 4 Filter machen kann und dadurch eine höhere Auflösung erziele Gruß Matthias
@ Benedikt du hast ja den einen Adc mit dem Filter versehen den anderen mit einem 100nf Kondenator in Reihe ? was bringt der ?
bzw was ist das für ein Filter ? n Tiefpass ? oder Bandpass ? oder n Hochpass ?
Das ist ein Hochpass mit einigen 10 bis 100Hz, der mir die Gleichspannung entfernt. Meine Soundkarte liefert ein aus Masse bezogenes Signal ohne Gleichspannungsanteil, der ADC benötigt aber ein Offset von ein paar Volt, da der AVR keine negative Eingangsspannung verträgt. Den selben Zweck haben auch C11 und C5.
was ist der große Filter ist das ein bp hp oder tp ? weil ich möchte nun 4 von den filtern einsetzen
mir ist das Prinzip noch nicht ganz klar du sprachest von einer 5,5khz Trennung ?! du sendest das volle Audiosignal in den 1.ADC der Filter sieht mir wie ein Bandpass aus der dann von 5,5khz bis Ende den 2.ADC versorgt nun bekommt aber der 1. ADC das volle Programm ? rechnet also das gesamte Spektrum das macht das doch langsamer ? wie wäre es man würde 3 oder 4 Bandpassfilter nehmen der FFT klare Bereiche zuteilen oder wie schneidest du das Signal am 1. ADC ab ? oder ist die 1.FFT im Atmel eine mit nur 11khz Samplerate die dann bis 5,5 khz den Bereich abdeckt ? so könnte ich es mir erklären ich versuche demnächst wenn ich von dir erfahre wie man den Filter berechnet das Ganze nur bis 2,5khz gehen lassen also die 1.FFT nur 5 khz Samplerate so müsste dann schon wieder ein paar Herz weniger in den Zwischenräumen gehen könntest du mir mal die entscheidenden Stellen im Code zeigen ? bzw mal ne Info über den großen Filter geben :-) das wäre Klasse Gruß Matthias
nochmal ne Frage bevorzugst du keinen Halb oder Vollwellen Ggleichrichter vor dem ADC ? oder erledigen das die Kondensatoren ..c11...c5 usw..
anbei mal die Bandpassfilter eines orginal Audioscope Spectrum Analyzers die PNG zeigt den 1. und letzen Filter unten in der Tabelle sind die verschiedenen Werte aufgeführt
anbei noch einige Simulationsprogramme oder kennst du Benedikt etwas besseres? http://www.modul-bus.de/compas/compas25/simulat.html
Wenn du Low Current LEDs verwendest, und den Strom etwas reduzierst, dann geht es auch mit BC547. Bei 150mA ist ein BC547 etwas überfordert. Die ganzen Kondensatoren am Eingang und direkt vor den ADC dienen nur als Koppelkondensatoren um das DC Offset zu beseitigen. Das große Filter ist ein Tiefpass mit etwa 2kHz Grenzfrequenz (etwas unter der halben Samplerate: 5,5kS/s -> 2,275kHz Bandbreite -> 2kHz Tiefpass. Berechnet habe ich das ganze damit: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010007&part= Es ist eines der besten Programme die ich gefunden habe, das mir die einfachsten und auch steilsten Filter liefert. Wenn du also noch eine weitere FFT, z.B. mit 1,4KS/s machen willst, dann ist ein 500Hz Filter hilfreich.
Wenn du also noch eine weitere FFT, z.B. mit 1,4KS/s machen willst, dann ist ein 500Hz Filter hilfreich. wieso dann nicht 700hz bei 1,4KS/s ? dann bräuchte ich ja einen Tiefpass z.b. mit 500-700hz oder tiefer danach einen Bandpass wieder einen Bandpass und am Schluss einen Hochpass dann wären es 4 Filter die ich in die 4 ADC Eingänge eintreten lasse Frage: der Tiefpass Filter bei dir muss ja die 1. FFT sein ! und das normale Line die 2. richtig ?
andere Frage wenn ich da nun 4 Filter hinklemme genügt dann die Rechenleistung des Avrs ?
Anscheinend hast du immer noch nicht verstanden, wie das ganze funktioniert: Jede FFT erzeugt 64 Frequenzen von 0Hz bis SampleRate/2 mit SampleRate/2/ 64Hz Abstand Der Tiefpassfilter muss sicherstellen, dass keine Frequenzen größer als SampleRate/2 an den ADC kommen. Da braucht man keinen Bandpass, sondern es reicht ein unendlich steiler Tiefpass mit SampleRate/2 Grenzfrequenz. Da man sowas aber nicht bauen kann, verwendet man einen Tiefpassfilter mit einer etwas niedrigeren Grenzfrequenz, damit die höheren Frequenzen auch wirklich unterdrückt werden. Man kann daher aber nicht alle 64 Werte, sondern eben nur 50 oder 60 davon verwenden. Ich verwende nur die unteren 30 Werte, um mit einem einfachen Tiefpass mir nur 2 Opamps auszukommen. Ich habe mal die FilterLab Datei angehängt, mit dem ich das Filter berechnet habe.
anbei ein Bild ! ich sehe gerade ! es würden 2 Filter reichen ein Tiefpass von 0 - 250hz in 10hz Schritten dann ein Bandpass von 300hz bis 2,5khz mit 100 hz Schritten dann ab 3khz bis 20khz die normale fft verwenden in 1khz schritten das wäre doch machbar ?
achso ja dann wären es 2 tiefpässe einer bis 250 hz und einer bis 2,5khz das wäre aber doch machbar ?
also fang ich mal an ! 1. Tiefpass bis 640hz 1. FFT Samplerate 1,28hz 64 Werte kann ich bis 250hz entnehmen bei einem 4. Ordnung Filter entnehme ich die ersten 25 Werte also 640hz /64 = 10 Herz Schritte 10hz 110hz 210hz 20hz 120hz 220hz 30hz 130hz 230hz 40hz 140hz 240hz 50hz 150hz 250hz 60hz 160hz 70hz 170hz 80hz 180hz 90hz 190hz 100hz 200hz diese lass ich an den folgenden Frequenen darstellen 30 40 50 60 80 100 120 160 200 250 2. Tiefpass bis 6,4khz 1. FFT Samplerate 12,8khz 64 Werte kann ich bis 6,4khz entnehmen bei einem 4. Ordnung Filter entnehme ich die ersten 25 Werte also 6,4khz /64 = 100 Herz Schritte 100hz 1,1khz 2,1khz 200hz 1,2khz 2,2khz 300hz 1,3khz 2,3khz 400hz 1,4khz 2,4khz 500hz 1,5khz 2,5khz 600hz 1,6khz 700hz 1,7khz 800hz 1,8khz 900hz 1,9khz 1000hz 2,0khz diese lass ich an den folgenden Frequenen darstellen 300 400 500 600 800 1000 1200 1600 2000 2500 3. normales Audio Signal FFT 16khz 1. FFT Samplerate 32,0khz 64 Werte kann ich bis 16khz entnehmen bei einem 4. Ordnung Filter entnehme ich die vollen 64 Werte also 16khz /64 = 250 Herz Schritte 250hz 2,75khz 5,25khz 500hz 3,00khz 5,50khz 750hz 3,25khz . 1000hz 3,50khz . 1250hz 3,75khz . 1500hz 4,00khz 16,0khz 1750hz 4,25khz 2000hz 4,50khz 2250hz 4,75khz 2500hz 5,00khz diese lass ich an den folgenden Frequenen darstellen 3000 4000 5000 6000 8000 10000 12000 16000 die Filter zu berechnen wären kein Problem ! 2 Filter an ADC 2 und 3 an ADC 1 das Line Signal @Benedikt könntest du mir ein wenig mit dem Code helfen ? ich kann C aber bin noch nicht soo fit @Assembler
anbei die komplette Analyzer Schaltung so wie ich es mir vorstelle mit den 2 Filtern evtl könnte ich auch 8. Ordnung aufbauen ! die paar Bauteile... was meinst du dazu Benedikt ? also meiner Meinung nach müsste das doch realisierbar sein vom Code her!
Das ganze zu realisieren ist kein Problem, nur etwas Arbeit. Bei 1,28kHz Samplerate und 128 benötigten Samples benötigt diese FFT alleine schon 10ms nur zum Daten aufzeichnen -> kontinuierlich Daten in einen Ringpuffer schreiben und für die FFT nur die neuesten 128 Werte entnehmen. Dies erfordert aber einen eigenen uC.
um das wäre es mir nicht aber mein problem liegt an 2 sachen 1. problem - assembler ist mir fremd 2. problem meine demo eagle version macht nur die kleine board und mit ner gecrackten naja du weist schon @fehler 290 die orginale ist mir ehrlich gesagt zu teuer ... über 1000 euro für das geld würde ich den obigen audioscope spec analyzer bekommen :-) ähm gibt es denn nicht für ein paar hundert euro eine schüler /studentenversion bin dieses jahr noch schüler (bos bayern) nächstes jahr bzw ab juni dann student ... könntest du mir ein wenig helfen @code ..... aber du hast doch auch einen filter drinnen oder weil es nun 2 filter sind ?
ja gut 230 euro für die 100x160 er verison naja.... und 450 für die volle ... ist auch schon viel .... für nen schüler/studenten....
naja 125 euro für die non profit könnte man sich überlegen ... aber dann auch nur 160x100 hmmmmmmmmmmmm
Benedikt wenn ich 2 µC verwende wie kann ich dann die Leitungen Sync und Daten ? multiplexen ?
Die uC müssten dann die Daten untereinander austauschen: Der erste mega8 macht die ganz schnelle FFT und die mittelschnelle abwechselnd. Sobald eine FFT fertig ist, werden die Daten an den 2. mega8 gesendet. Dieser macht die langsame FFT, hat also an sich nicht viel zu tun außer die Audio Daten sehr langsam aufzuzeichnen und dann eine FFT zu machen. Wenn diese fertig ist, und die Daten vom ersten mega8 da sind, werden die 3x 64Bytes zu den Daten für die LED Matrix zusammengefasst und übertragen.
Ich bin gerade an der Software. Die 1,28kHz Samplerate sind kein Problem, aber die 32kHz werden nicht einfach: Du nutzt den vollen Frequenzbereich bis 16kHz. Da musst du entweder den Tiefpass sehr steil machen, oder eine höhere Samplerate verwenden. Mit 42,67kHz Samplerate hätte man den Bereich bis 21,33kHz mit 333Hz Auflösung. 3 Stück zusammengefasst und man hat genau das 1kHz Raster. Der Tiefpass kann dann auch einfacher werden, da er nur bis 16kHz alles ungehindert durchlassen muss, dann aber bis über 25kHz abfallen kann.
und bis wie viel mhz müsste man den avr dann jagen damit man 42khz sampel rate hat?
konntest du die Dateien in der Email öffnen Benedikt ? denn wenn ja mache ich die komplette Platine ! den neuen Schaltplan und das Layout ! wie mache ich das nun eine 2. FFT genau so wie die erste und wo verbinde ich die Atmels ?
Mit 42,67kHz Samplerate hätte man den Bereich bis 21,33kHz mit 333Hz Auflösung. 3 Stück zusammengefasst und man hat genau das 1kHz Raster. Der Tiefpass kann dann auch einfacher werden, da er nur bis 16kHz alles ungehindert durchlassen muss, dann aber bis über 25kHz abfallen kann. wie gesagt das wäre ja schon mal super ! aber ich dachte einen 3. Tiefpass brauch ich garnicht ? oder doch ? hab ja nun 2 Filter und einen kompletten Signalgang
Die Software muss ich dann erstmal testen. Dazu muss ich erstmal die Schaltung auf dem Steckbrett aufbauen und das LED Display am PC simulieren. Den 3. Tiefpass kannst du weglassen, wenn du sicherstellst, dass keine Frequenz > halbe Samplerate vorkommt. Das ist bei mir dadurch gegeben, dass die Soundkarte im PC einen 22kHz Tiefpass eingebaut hat. Verwendest du dagegen 16kHz brauchst du einen Filter.
also ich möchte ien line in signal am ende anschliesen ... also einen 3. Filter für 16khz ? evtl den auch bis 20 khz laufen lassen den Filter so dass die 16khz noch gut im Bereich sind ? ging da nicht so wie bei dir auch nur n Kondensator ?
wie sieht das dann mit dem atmels aus also der 2. fft aus ? wo klemm ich welchen filter hin ?
Die Dateien konnte ich problemlos öffnen. Aber das Layout ist nicht dein Ernst oder ? Du hast doch alle Bauteile einfach nur auf die Platine geschmissen, und dann den Autorouter drüber gelassen, oder ? Wenn die Schaltung laufen sollte, dann kann man den AT89C2051 als absolut stabil gegen alle Arten an Störungen bezeichnen. Die Transistoren werden kaum warm, sagen wir mal 40° maximal für die Treiber der untersten LED Reihe, die immer an ist. Versuch mal das ganze etwas zu ordnen, und die Spannungen von LED Matrix und Digital ICs zu trennen. Zur FFT, das ganze wird folgendermaßen ablaufen: Der AVR der die beiden schnelleren FFTs macht bekommt die 20kHz an ADC0 und die 6,4kHz an ADC1. Dessen TXD Pin geht zu dem RXD des zweiten AVR, und der Sync Pin ist an INT0 angeschlossen. Der zweite AVR bekommt an ADC0 das 640Hz Signal. Eigentlich benötigt jeder ADC Eingang einen eigenen Tiefpassfilter. Da ich meine Anzeige aber nur am PC betreibe, kann ich mir den Filter für die 22kHz sparen, da dieser auf der Soundkarte eingebaut ist.
Benedikt es ging mir nur darum, ob du die Dateien lesen kannst! denn wenn nicht wäre die Mühe eines 100%igen Layouts umsonst gewesen und bis ich das Tip Top geroutet habe rechne ich mal 1-2Std klaro ist das nicht mein Ernst ich habe die Bauteile nur rübergeschoben um zu sehen ob das neue Eagle auch mit größeren Platinen > 100x160 zurecht kommt ! Werde die Schaltung so anpassen wie du sagst und Posten ! Gruß Matthias
frage du hast ja chebychev filter genommen ?! warum? weshalb? ich hab mich für butterworth entschieden
Bei Chebychev ist der Übergang viel steiler als bei Butterworth oder Bessel. Ich benötigte einen Filter mit möglichst abruptem Übergang von <+/-1db auf den entsprechenden Abfall. Bei Butterworth gibt es noch einen Übergangsbereich, der etwas störend ist.
Ich bin heute nicht mehr dazugekommen die Software zu testen. Werde das aber morgen machen. Bis auf die Zusammenfassung der 3x 64 Werte müsste aber jeder uC alleine schon funktionieren. Aber so wie ich meine Software kenne, werde ich noch eine Menge Fehler drin haben...
die Schaltung ist nun soweit fertig ich hoffe ich bekomme alles auf eine 100x160 oder 200mm Platine :-) es fehlen halt noch die Pforstenstecker für die LED Matritzen die ich ja schon fertig geätzt gebaut habe könntest du das mal kritisch anguggen Benedikt ?
Zur FFT, das ganze wird folgendermaßen ablaufen: Der AVR der die beiden schnelleren FFTs macht bekommt die 20kHz an ADC0 und die 6,4kHz an ADC1. Dessen TXD Pin geht zu dem RXD des zweiten AVR, problem : da ist ja schon der display atmel dran ? oder soll ich den an den 2. fftatmel klemmen ? und der Sync Pin ist an INT0 angeschlossen. Der zweite AVR bekommt an ADC0 das 640Hz Signal.
TXD von mega8 1 -> RXD von mega 8 2 Sync von mega8 1 -> INT0 von mega 8 2 TXD von mega8 2 -> RXD von 89C2051 Sync von mega8 2 -> INT0 von 89C2051
mega8 1 -> 20khz und 6,4khz Filter mega8 2 -> 640hz Filter Sync = SCK dann wäre er nun außer den Pforstenbuchsen für die LEDs und Masse an den Transistoren fertig
Bei dem Sync Pin passt was nicht, den habe ich versehentlich doppelt belegt. Der Sync Ausgang ist der Int1 Pin (PD3) und der Eingang für Sync ist INT0 (PD2). Allerdings muss ein AVR warscheinlich durch einen mega32 ersetzt werden, da 1k RAM nicht ausreichen. Ich benötige wegen dem extra Ring Samplebuffer für die tiefen Frequenzen 256Bytes RAM mehr, also 1,25kB... Eine Alternative wäre, den Ringpuffer wegzulassen, was die Refreshrate aber auf etwa 10fps bei den tiefen Frequenzen reduzieren würde. Der Code für die beiden schnelleren FFTs in einem mega8 ist soweit fertig.
also kein thema @mega32 dann nehmen wir für die 640 herz geschichte einen mega32 hab sowas noch daheim werde sofort den schaltplan ändern ! könntest du mir die software des schnellen mega 8 noch ausbessern @ sync pins ? eilt ja nicht
anbei mal den plan ! frage: kann ich das so machen mit den ISP anschluss an dem atmel dass ich den drann lasse ! an allen atmels oder streite sich da die spannung reset z.b. mit dem isp ??? gruß matthias
du Benedikt ! kann ich den ISP Adapter, so wie ich ihn auf dem Board 2 mal habe dran lassen oder muss ich den mit einem 9 poligen Dil Schalter trennen ? Gruß Matthias
klaro sind es 2x 9 polige sub d buchsen aber ich meine zurzeit sind sie ja immer dran also mit den atmels verbunden bekomme ich da durch den reset pin oder andere keine probleme ? da der ja auf +ub ist ? deshalb dachte ich mir die schaltungen mit dip schaltern zu trennen ? gruß matthias
ich denke so wie es ist wird es einen Kurzschluss am Reset Pin geben ! anbei mein Schaltplan vom Programmer ! das ISP Teil hab ich integriert in den Schaltplan ! da ist noch ein Taster auf GND und der Transistor schaltet nach GND wenn nun also Vb+ am Reset Pin des Atmels so wie du ursprünglich ihn angebracht hast anliegt gibts n kurzen ! hast du mir n Rat Benedikt ? das ganze Zeug weglassen und außerhalb vom Analyzer programmieren ?
hab ihn nun rausgeschmissen !!!!! weil es vermutlich einen kurzen gegeben hätte ! mit dem reset und isp muss ich den reset pin durch einen dil schalter von der +ub trennen wenn ich den atmel programiere ?
Hier der Code für die langsame FFT im mega32 Getestet habe ich nur teilweise, mangels vorhandener Hardware
wurde die 640hz FFT durch den Mega 32 nicht schneller oder wieso schreibst du "langsame"
vielen Dank erst mal für deine Hilfe weist du wie ich in Eagle mittels ULP die Bibliotheken der zu klein geratenen Widerstände ändern kann so dass die mit den wirklichen Größen übereinstimmen
Das langsame bezog sich auf die Samplerate. Der mega32 sollte sich eigentlich die meiste Zeit langweilen: Er wartet auf die Daten vom mega8, die rund 30-40 mal pro Sekunde übertragen werden. So hoch ist dann auch die Aktualisierungsrate des Displays, also 30-40fps was eigentlich schnell genug sein sollte. Mit Eagle kenne ich mich nicht gut aus, ich bin froh wenn entweder das Layout oder Schaltplan gut aussieht. Beides gleichzeitig gut zu machen habe ich noch nicht geschafft. Kannst du mir mal das Layout schicken, wenn du damit fertig bist ? Verwendest du die IRF9531 MOSFETs, oder hast du entsprechend starke logik Level MOSFETs gefunden ?
wollte dich gerade auf die IRF9531 MOSFETS ansprechen wo hast du die denn gekauft ? da ich sie beim Reichelt garnicht finde nun habe mich noch nicht auf die Suche eines anderen Typen gemacht wenn der Schaltplan zu 100% fertig ist mach ich das Layout ! ich muss noch die Pforstenstecker für die LED Displays anklemmen dann die 200 Widerstände auf ein anderes Package bringen so dass ich mit dem Board loslegen kann klar poste ich das dann ! welche günstigen MOSFETS bieten sich denn an wir brauchen ja P Channel !
ich sehe dass der IRF9530 baugleich mit dem 31 ist nunja 0,65 Euro beim Reichelt wären ja bei 16 Stück 10,4 euro ginge ja noch ich denke du hast da keine soo große Auswahl an den P-channel Transistoren auf einen IRF wird es rauslaufen !
ich denke aber auch.... nun 5 V für die Transistoren wären Super... aber so ist halt doch die Spannung des Displays getrennt ... bzw ich suche mal nach einem logik Level MOSFET
es gäbe da schon... den FDD5202P zum Beispiel ... aber woher bekommen ?
ich habe eine Bitte Benedikt ! bitte poste mir mal DEINE Eagle Bibliothek wo DEINE Widerstände die du genommen hast drin sind ! bitte !
Bibliothek müsste "discrete" heissen! bitte sei so lieb ! sonst kann ich die Packages nicht ändern! und das Board net machen!
Ich habe den Schaltplan mit der Freeware Version 4.13 erstellt. Für was brauhst du da eine 3.x Version ? Wenn du Low Current LEDs verwendest, und die Konstantstromquellen auf 50mA auslegst, kommst du auf 1,6A. Dafür reicht dann auch irgendein Darlington Transistor. Allerdings müssten dann Widerstände zwischen Transistor und 4zu16 Dekoder eingebaut werden. Der IRF9530 ist ein P Kanal MOSFET, genauso wie der IRF9531. Am Anfang wollte ich auch einen anderen verwenden, vielleicht hätte ich auch einen Transistor verwendet, aber ich hatte noch ein paar IRF9531 hier rumliegen.
nun ich kann die Packages der Widerstände in deinem Schaltplan nicht ändern da mir anzeigt wird, dass du eine Bibliothek "discrete" verwendet hast, die früher in der Version 3.XX statt der rcl vorkam dann tausche ich alle Bauteile von Hand aus, so dass das Rastermaß passt beim IRF9530 habe ich mich gestern verlesen! es ist ein P-Channel! den nehmen ich auch! ich gebe dir dann bescheid wenn Schaltplan sowie Board fertig sind!
Benedikt - es tut mir leid! bitte vergesse das mit den unterschiedlichen Bibliotheken! es lag an mir! habe nun gemerkt, dass mein Linux Notebook viele andere Bibliotheken enthält als mein großer Rechner :-) unter anderem "discrete.lbr" usw... bitte nochmals um Verzeichung Gruß Matthias
@Matthias Sach mal, gestern 11 Posts in Folge quasi in Abständen von zwei Minuten, muß das sein? Kannst du nicht mal sammeln und alles in einen Post schreiben? Wird so leider etwas unübersichtlich.
habe eine Frage an dich Benedikt mein Terzband ging ja über 28 verschiedene Frequenzen was hast du mit den restlichen 4 Leds gemacht, die übrig bleiben ? (vorne 2 hinten 2 ) hast du die noch kleiner / größer gemacht von den Frequenzen ? dann mein Schaltplan / Layout bildet nun einen 16x32 Kanal Analyzer den man auch mit 12x28 betreiben kann (so wie ich ihn möchte) der Frequenzgang beim 32 wäre 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 und beim 28 er vorne 2 leds weg und hinten 2 leds weglassen und im display oben 2 und unten 2 weglassen so ist nun mein Layout / Schaltplan variabel bei der 32 Kanal Version lässt sich ja ein anderer Filter ( 22khz statt 16khz ) verwenden und ein anderer Code könntest du mir noch die Herz aufteilung bei deinem Code pro Led nennen ?
Das mit den 25Hz wird nicht funktionieren. Im Moment habe ich folgende Frequenzen eingebaut: Band Bereich Werte Zählerwert 10 10 1 12 20 20 1 11 30 30 1 10 40 40 1 9 50 50 1 8 60 60 1 7 80 70-80 2 6 100 90-100 2 5 120 110-130 3 4 160 140-170 4 3 200 180-220 5 2 250 230-290 7 1 12 Werte 300 300 1 10 400 400 1 9 500 500 1 8 600 600 1 7 800 700-800 2 6 1000 900-1000 2 5 1200 1100-1300 3 4 1600 1400-1700 4 3 2000 1800-2200 5 2 2500 2300-2900 7 1 10 Werte 3000 2666-3333 3 10 4000 3666-4333 3 9 5000 4666-5333 3 8 6000 5666-6333 3 7 8000 6666-8333 6 6 10000 8666-11333 6 5 12000 11666-13666 7 4 16000 14000-20000 19 3 18000 18000 1 2 20000 20000 1 1 10 Werte
perfekt! genau so ist es korrekt! super ! Beschluss: ich kaufe mir nun Eagle da die gepatchten usw... alle nichts taugen und ich endlich mal in Ruhe routen möchte denke das ist eine Anschaffung fürs Leben!
Ich hätte mir Eagle auch schon gekauft, aber wenn ich mir jetzt 4.13 kaufe, und in einem Jahr jeder 4.14 oder sonstwas verwendet, dann kann muss ich doch die Freeware Version verwenden, da man keine neueren Dateien öffnen kann...
das ist eben auch mein Problem.... nun habe ich einen Weg gefunden es zu routen! bin seit 2Std dabei erst einmal Bauteile plazieren sortieren usw.. danach routen!
anbei die FFT Platine 160x100 doppelseitig habe ich gerade a meinen bulgarischen Platinenhersteller weitergeleitet nun route ich das Display
Übel, übel, Deine Platine: a.) Keine Abblockkondensatoren an den Controllern. b.) Quarze von den Controllern einen halben Kilometer entfernt. c.) Versorgungsspannungsleitungen viel zu dünn. d.) Kein Masse-Konzept. e.) Rückkoplungsnetzwerke an Deinen OPV viel zu weit entfernt. f.) Signalleitungen unter den Quarzen. g.) Analog- und Digitalteil nicht räumlich getrennt. Das ist ja noch schlimmer als ein Steckboard-Aufbau. Wenn das Teil halbwegs reproduzierbar funktioniert, grenzt das an ein Wunder. Vielleicht bekommst Du ja von den 10 Bit der Analog-Digitalwandler unterm Strich noch etwa 6 Bit raus, mehr wird es wohl nicht werden, der Rest ist Rauschen und Störungen... Also, kurz zusammengafasst, in harten Worten: Dieses "Layout" ist Schrott und Pfusch.
ja? wer meckern kann kanns auch besser machen :-| ich werde deine Punkte überdenken
Hi a) immer noch keine Abblock-C's b) Versorgungsspannung immer noch über zu dünne Leiterbahnen c) AVcc nicht extra entkoppelt d) Einsatz von SMD-Technik verbessert die elektrischen Eigenschaften drastisch und macht das Layout kleiner. e) Werf den Autorouter weg PS: Eine solche Grafik niemals nicht als JPG sondern als GIF oder besser noch als PNG. Und dann in einer Auflösung so daß man das Ding auch ohne scrollen ankucken kann. Matthias
Wenn jemand einen mega8 im TQFP Gehäuse löten kann, sollte er auch mit SMD Kondensatoren fertig werden... Ich verwende auf vielen Platinen meist nur eine Art SMD Bauteile: Die 100nF Kondensatoren. Das spart viel Platz, und nur so kann man die Kondensatoren wirklich da platzieren, wo sie sein sollen. @matthias asselborn Versuch mal an jedes IC 100nF zu hängen, bei mega8/32 auch an AVcc, wie im Datenblatt. Ansonsten bekommst du ein ziemliches Rauschen. Weiterhin ist vor allem im Analogbereich eine gute Masseführung wichtig. Bei meiner ersten Version hatten immer die untersten 3-4 LEDs geflackert. Bei der überarbeiteten flackert garnichts mehr. An jeden verwendeten ADC Pin ein kleiner Kondensator (so ca. 1nF) nach Masse, und zwar so nah wie möglich am ADC Pin. Das Audiosignal über einen Widerstand (so 1-2k) einspeisen. Dadurch werden vom ADC verursachte Störungen durch die Sample&Hold Schaltung vermieden, und HF Störungen von außen unterdrückt.
Smd wäre kein Problem für mich zu löten nur nehme ich Rücksicht auf Keksohr der den Analyzer auch nachbauen möchte nur mit Eagle noch nicht zurecht kommt und Probleme mit Smd hat wird halt eine Universalplatine für 28-32 Band Analyzer also gut Matthias du hast mir ja schon beim MP3 Projekt geholfen daher befolge ich auch deine Ratschläge deine auch Benedikt finde es nur ein wenig schwach ein Post zu lesen (Michael) das das Layout gleich so abwertet bin nun mal kein gelernter Elektroniker befinde mich erst nach ner Lehre auf dem Weg zum diesjährigen Wintersemester Informatik
.... vielleicht hätte ich schreiben sollen das ich von Haus aus IC Sockel mit Abblock C's verwende.... 100nF
mal ne frage, funzt die software schon ? und kannst du mir eventull noch mal ne avi via mail schicken? falls es schon läuft? meine addy müsstest du ja noch haben... die hier stimmt nicht (spam schuzt) @idf-mod.de !
du bist ja lustig erst mal müssen die Platinen gemacht das Teil aufgebaut werden usw... Benedikt schrieb er testete die Soft am PC da Hardwaremangel.. anbei nochmal n Versuch - Handgeroutet - Spannung Leitung dick genug - Massefeld - Abblock C's durch IC Sockel (den ich drauflöte) - Kondensatoren ganz nah an den ADC's - Widerstände in Reihe des Signals zum ADC - png datei
@matthias: Was ist Dir lieber: Gar kein Kommentar und Du bekommst das Teil nicht zum laufen, oder einen ehrlichen Kommentar der zeigt, wo die Probleme liegen? Kritik ist immer hart, wenn man sie bekommt. Aber man darf da keine falschen Gefühle daraus ziehen, sondern Kritik muss man als Chance zu verstehen versuchen. Sieh's mal so: Hätte ich nicht so einen direkten Kommentar geschrieben, hätten wir jetzt keine Diskussion üder das Layout mit Tips für Dich. Du würdest nichts lernen. Und ich habe noch einen Tip für Dich, bzw. Hinweis: Du kannst mit den AtMegas keine Sockel mit inegrierten Abblockkondensatoren verwenden. Die sind nämlich in den Sockeln an verkehrter Stelle eingebaut. Das funktioniert nicht. Und noch einige Tips zur Spannungsversorgung und Masseflächen: Da Du zweiseitig routest, machst Du folgendes: Die Anschlüsse für die Versorgungsspannung in der Mitte der Längskante der Platine. Unmittelbar nach der Anschlussklemme kommt ein kleiner Elko und ein Keramikvielschichtkondensator (100nf) hin. Von den Anschlüssen der Kondensatoren geht einmal Plus und Masse zur digitalen Platinenhälfte, und einmal zur analogen Platinenhälfte. Als Masse verwendest Du eine Massefläche auf der Lötseite. Allerdings trennst Du die Fläche in zwei Teile auf. Ein Teil der Massefläche nur für die analoge Seite, und der andere Teil nur für die Digitale Seite. Zusammengeführt werden die Masseflächen an einem einzigen Punkt, nämlich am Anschluss des 100nf Kondensators unmittelbar hinter der Versorgungsspannungsklemme. Du musst darauf achten, dass Du zwei getrennte Schleifen für den Strom baust. Eine Schleife für den Digitalteil, und eine Schleife für den Analogteil. Der Versorgungsstrom soll nicht in einer großen Schleife durch Analogteil und Digitalteil fliessen. Und eben die Schleifen am Kondensator an der Anschlussklemme zusammenführen.
Nochmals wegen Sockel: Wenn Du einigermassen löten kannst, lass die IC-Sockel ganz weg. Die machen Dir effektiv mehr Probleme als sie lösen. Und wenn ein IC doch mal elektrisch kaputt gehen sollte, kannst Du es auch mechanisch kaputt machen in dem Du alle Beinchen abzwickst und die Beinchenstummel dann in Ruhe und schonend aus der Platine auslötest.
Hast schon recht! ich baue nun den Schaltplan um danach das Layout! ein Kumpel hilft mir nun.
anbei meine plazierte Platine hab ich nun selber gemacht da scheinbar jeder grad krank ist! bitte um kritik was soll ich verbessern?
anbei die geroutete hab ich nun doch selber gemacht/machen müssen so was ist nun noch sch..... ? das hervorgehobene ist die Masse
Mittlerweile gibt es auch elm-chan.org auch C Routinen, die die FFT verwenden: http://elm-chan.org/docs/avrlib/avrfft.zip
nun hat mir n Elektroniker geholfen --> Danke Sven! anbei Schaltplan und Layout! nun lasse ich das ätzen! Gruß Matthias
hi, wo lässt du solche "Einstück" Leiterkarten machen? Und was kosten die? gruss
20 euro kostete die platte ! + versand natürlich bei einem Freund aus Bulgarien der hat ne Leiterplattenfirma ! icq 259-606-808 www.bilex-lp.com 17 euro ohne Lötstopp Grüßles Matthias
da sind auch schon die oberen platten her ( display usw..) top firma netter kontakt - sprechen deutsch einwandfrei kann ich nur sagen saubere arbeit ! grüßles matthias sorry 17 euro war für eine 160x100 doppelseitig + durchkontaktierung bei 15 euro liegt eine 80x100 doppels + durch kontakt nur meine hab ich noch mit lötstopp lackieren lassen bieten nun auch nikel gold technologie für smd und normale bauteile zum selben preis an !
da sind auch schon die oberen platten her ( display usw..) top firma netter kontakt - sprechen deutsch einwandfrei kann ich nur sagen saubere arbeit ! sorry 17 euro war für eine 160x100 doppelseitig + durchkontaktierung bei 15 euro liegt eine 80x100 doppels + durch kontakt nur meine hab ich noch mit lötstopp lackieren lassen bieten nun auch nikel gold -bleifrei- technologie für smd und normale bauteile zum selben preis an ! grüßles matthias
> (ein vergleichbares C Programm ist um den Faktor 10-100 > langsamer !!!!) Wie hast du das getestet bzw. woher kommt die doch sehr große Spanne (1-100)?
Ich habe diverse FFT Algorithmen ausprobiert. Da die meisten für PCs waren, wurden Fließkommazahlen verwendet. Integer Routinen waren natürlich schneller, aber immer noch um ein Vielfaches langsamer. Im Durchschnitt kam ich auf etwa 1 Ergebnis pro Sekunde !
Hallo, mal eine kleine Frage? Die jeweiligen FFT Methoden, die als Beispiele gepostet worden sind, verlangen jeweils als Übergabeparamter den realen und den imaginären Anteil des Eingangssignal. Kann man davon ausgehen, daß der imaginäre Anteil lediglich auf 0 gesetzt wird. Oder muss das Inputsignal vorher konvertiert werden, bevore die FFT genutzt werden kann? Danke, Peter.
An: Matthias Asselborn Habe mir knappe Stunde Zeit genommen und alles gelesen. Mir fehlt das Happy End. Funktioniert deine Platine und die FFT? Hast du vielleicht ein Bild?
Sorry du... hab die geätzte Platine immer noch bei mir liegen sowie das gesamte Display ect.... hatte in letzer Zeit viel zu lernen Studium ect.... und andere Projekte am laufen ein BassHorn da ein Mitteltonhorn da... die Semesterferien sind natürlich zum arbeiten da g sowie jedes Wochenende... hatte genau 4 Tage in diesem Jahr Urlaub... (wenn man das so nenne kann ....) evtl Ende des Jahres nehme ich mir Zeit und dann kommt schon noch das Happy End !!!!!!!!!
:P hatte 9 tage Urlaub seit nehm jahr... Immerhin über 100% mehr :) @Peter wenn du ein Signal hast dass nur reele Werte liefert, dann wird der imag. Teil der FFT auf 0 gesetzt. Grüße Andreas
Ist es der ganz oben geposteten ASM FFT egal, in welchem Pegel Bereich das Singal liegt? Also den ADC mit 2.54V, VCC oder AREF betreibe bleibt mir überlassen, solange mein Signal kommplett in den Bereich 0V->XV passt?
sach mal Benedikt könntest du mir die 2 Codes für den Atmel 8 und 32 compilieren ? hab leider keinen asm Compiler da ... restliche Platinen sind nun fertig bestückt es fehlt nur noch am Code zu nem Happy End gruss Matthias
les ich da fhk community? na dann studieren wir schon an der selben Schule @Benedikt - oder sag mir einfahc mit was du es getipt hast nen compiler werde ich scho auftreiben - sollte halt zusammen passen gruß Matze
Hallo hab grad versucht die FFT für den Mega32 zu compilieren erhielt aber folgende Meldung: AVRASM: AVR macro assembler 2.1.0 (build 38 Oct 1 2005 03:07:42) Copyright (C) 1995-2005 ATMEL Corporation C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(7): Including file 'C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m32def.inc' C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(8): Including file 'C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\avr.inc' C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(9): Including file 'C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\akiglcd.inc' C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(16): warning: Register r12 already defined by the .DEF directive C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(17): warning: Register r15 already defined by the .DEF directive C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(18): warning: Register r25 already defined by the .DEF directive C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.asm(586): No EEPROM data, deleting C:\Dokumente und Einstellungen\Matthias Asselborn\mega32.eep ATmega32 memory use summary [bytes]: Segment Begin End Code Data Used Size Use% --------------------------------------------------------------- [.cseg] 0x000000 0x000708 1160 640 1800 32768 5.5% [.dseg] 0x000060 0x000523 0 1219 1219 2048 59.5% [.eseg] 0x000000 0x000000 0 0 0 1024 0.0% Assembly complete, 0 errors. 3 warnings aber er spuckt kein Hex File aus... könntest du Benedikt mir die des Mega 8 und 32 compilieren? Gruss Matthias
habs nun doch hingebracht ... im richtigen Ordner sollte man suchen .... aber beim mega 32 3 warnings beim mega 8 nur 2 g ich brenn se mal Ende der Woche auf die Atmels und teste mal das ganze könntest du Benedikt mir die 2 codes doch nochmal compilieren ? die 2Codes für Mega 8 und 32 der 1/3 octav Version - mit dem Led Display Gruss Matthias
Moin Jungs, hab mich jetzt näher mit dem Code auseinandergesetzt. Möchte eine externe Wave-Datenquelle für eine 128 FFT verwenden. Reicht es so wie ich es vorhabe 128 16Bit Werte hintereinander signed an "CaptBuf" zu schreiben? Und den ADC Interrupt durch meine eigene Routine zu ersetzten?
Hallo, kann mir jemand erklären wie man bei dem ASM code (von ganz oben oder auch in der mitte...) auf die 11,1khz bzw. 22,2 khz sampling rate kommt. Einmal is doch die Taktteilung von 64 und dann von 128 für den ADC da komm ich auf andere werte für 18,432 MHz systemtakt??
Hallo, kann mir jemand erklären wie man den Code richtig compiliert? mit welchem Programm?
den asm code compilier ich immer mit dem avr studio von atmel. den c code am besten mit avr-gcc oder winavr. Jemand ne antwort auf meine frage? :)
hab ihn mit avr studio compiliert nur da kommen pro chip 2-3 warnings.... gruss matthias
was denn für fehler?? also bei asm dürfte die fehlerbehandlung kein problem sein. da du grad am antworten bist, kannst du drei posting hoch scolln und mir das erklärn?
hmm das sind ja nur warnings, deshalb müsste er die hex ausspucken, vielleicht heisst die auch nur anders weil du irgendwo was anderes eingestellt hast, klickst du auch immer auf built? Die warnings mit r15 und r25, liegt daran das die schon vorher in avr.inc deklariert wurden.. Das mit dem eeprom kann daran liegen das du einfach keine eeprom daten im code hast, der compiler aber so eingestellt ist das er welche extrahieren soll. wie ich rechne? also im code wird doch der takt für den ADC eingestellt. und zwar hier: outi ADCSRA, 0b11101111 dabei bedeutet das die bit0 bis bit2 also (111) den cputakt teilt und lautdatenblatt ist das bei 111 durch 128->also 18,432 MHZ durch 128 sind gleich 144KHz und nich 11,1Khz so wie es dasteht??
eine hex spukt er scho raus halt mit den warnings... aber mal testen ! ja ich teilte die 128 auch durch die 18 nochwas wobei die muss anders gehen ...
Kann mir jemand ganz simpel erklären wie die grössen bei der FFT zusammenhangen. Also was ist die Sample Rate, was beudeutet z.b. 128 Punkte FFT,was ist das Spektrum und wieso wird der Frequenzbereich durch den Tiefpassfilter (max297) eingegrenzt und was bedeutet das? Also wie hängen die ganzen grössen zusammen.
Hallo! also : Die Sampling-Rate bestimmt beim Digitalisieren von unserer Signalquelle (Musik), wie oft das analoge Audiosignal pro Sekunde abgetastet werden soll Bei einer Sample-Rate von 44.1 kHz (Sample-Rate einer Audio-CD) wird das Audiosignal 44100 Mal pro Sekunde abgetastet je höher also desto besser! in unserem Fall eine 128 Punkte FFT in eienr 128 point FFT werden 128 Punkte(Frequenzen) herausgezogen vom Frequenzspektrum und diese dann ausgewertet Frequenzspektrum - Frequenzbereich von 0 bis halbe Samplerate Herz je mehr Punkte du hast z.b. 512 oder 1024 desto genauer wird deine Frequenzanalyse! aber auch rechen intensiver! bei uns reichen 128 Punkte und der Atmel komt noch gut mit ! exakter wären 512 wobei du dann "mehr Power" brauchst evtl einen digitalen Signalprozessor! (DSP) nun deine letze Frage wieso er mit einem Tiefpassfilter begrenzt wird - in der Mitte des Threads ist mal n Schaltplan mit 2 Tiefpassfilter da ich den Analyzer im 1/3 Oct Schritt baue der Tiefpass trennt salopp gesagt den Frequenzbereich ab das nur ein geringerer Frequenzbereich in den Atmel kommt so lässt sich eine eine exaktere Auswertung machen - in meinem Fall habe 3 Tiefpassfilter und 2 Atmels mit FFTs somit wird der Frequenzbereich pro Atmel aufgeteilt und diese können dann exakter / schneller arbeiten wenn alles per DSP gelöst werden würde bräuchten wir solch einen Filter nicht kurz gesagt der Filter teilt quasi dem Atmel Frequenzbänder zu die dann schneller bearbeitet werden können ! Gruss Matthias Asselborn
hmm Danke erstmal..aber es tun sich neue fragen auf:) also der ADC tastet das signal 44100 mal pro sekunde ab. Jedesmal wenn er abtastet, liefert der adc eine 8 bit zahl (bei einem adc mit 8 bit auflösung). Das ist doch erstmal richtig oder? Quasi macht er aus einem zeitkontinuierlichen Signal ein zeitdiskretes? So und bei einer 128 point FFT wird jedesmal beim abtasten nich nur 1 8bit wert gespeichert, sondern 128 8bit werte oder? das wären ja dann bei einer sample rate von 44.1khz gleich 441000 mal 128 abtastwerte pro sekunde??
> So und bei einer 128 point FFT wird jedesmal beim abtasten nich nur 1 > 8bit wert gespeichert, sondern 128 8bit werte oder? Zu jedem Abtastzeitpunkt wird ein Wert gespeichert, geht ja auch nicht anders. Wie willst du mehrere Werte pro Zeitpunkt speicher? Zu jedem Zeitpunkt hat das Signal einen ganz bestimmten Wert. Bei einer 128 Punkte FFT nimmt man dann einfach 128 aufeinanderfolgende, gespeicherte Werte (z. B. aus einem Buffer) und führt die Berechnung durch. Bei einer Abtastrate von 44100 Hz bekommst du pro Kanal 44100 Werte pro Sekunde.
achso, jep...hab das ein bissl durcheinander gehaun.... eine grafik wo, man sowas schön sieht wär nich schlecht..
Hi Gang, ich habe Euren thread wegen dessen Länge leider nur kurz überfliegen können. Da wart Ihr wirklich wacker bei der Entwicklung, man kann richtig neidisch werden! Ich bin beim googeln auf Euch gestoßen, denn ich suche eine Spektrumsanalyse für HF. Habt Ihr eigentlich mal konkret dran gedacht, einen DSP zu verwenden, wie Matthias Asselborn? So ein DSP macht eine Spektrumsanalyse hardware-mäßig besser als es ein Algorithmus jemals hinbekommen kann. Was hindert Euch, zu solchen Werkzeugen zu greifen? Ich habe mich mit der Sache noch nicht so sehr befasst, darum mag das für Experten wie Euch etwas unüberlegt klingen. Welche Schwierigkeiten gibt es dabei? Ich frage nur, denn ich denke an Frequenzen von 1 kHz bis 3 GHz, das ist ab 25MHz für jeden PIC zu schnell. viele Grüße aus Singapore Martin
Sicher, für ein DSP ist eine FFT ein Kinderspiel. Der Reiz hier in diesem Thread war ja eigentlich, dass man auch mit so einem "popeligen" AVR eine brauchbare FFT hinbekommt. Und DSPs, die FFT hardwaremäßig beherrschen, sind schwer erhältlich, teuer und aufgrund des Gehäuses oft schlecht zu handhaben. Und für einen einfachen Audio Spectrum-Analyzer braucht man ja keinen 1 GFLOP 32-Bit Fließkomma DSP, oder?
ja genau in diesem Thread ging es darum eine brauchbare FFT mit normalen µC zu erzeugen die DSPs mit FFT sind unbezahlbar...... und die erst mal anzusteuern ... geschweigedenn hobbymässig auf ne Platine zu bringen ?!.... wobei in einem früheren Elector mal ein Vu Meter mit einem DSP vorgestellt wurde hab den Eeprom noch da der den DSP speisst... naja den Ti DSP gibt es mittlerweile auch nicht mehr war einer mit 40Mhz oder sowas ... damals 10-20 DM nun wenn man das ein wenig umbaun würde.. aber ich bin mit der AVR Version zufrieden ! n DSP wird ja auch anders programmiert wie n Atmel ... bis man den erst mal dort hin bringt wie man es möchte... vergeht ne menge Zeit ... gruss Matthias
hi, von ape (weiter oben im thread) gibts doch diese schaltung (siehe Anhang). Muss man bei dei OP's -6 Volt anlegen? GND müsste doch auch reichen, da die negativen amplituden eh nich gebraucht werden oder? Und anstatt +6 Volt müsste doch auch +5 Volt reichen. Weil die unterschiedlichen Spannungen zu generieren macht mir zu schaffen.. Ausserdem weiss ich nich was die zwei potis (r11 und r10) nach der op-schaltung solln. Oder sind das garkeine Poti's? Kann mir da jemand weiterhelfen?
Hi! naja hab meinen Schaltplan etwas anders aufgebaut mit mehreren Tifpassfiltern da ich ja 3 FFTs habe und 1/3 Oct darstellen möchte ....aber die Potis sehen wie ne ?! Lautstärkereglung des eingangsignales ?! aus ... Gruss Matthias
@Matthias Wollte mal den derzeitigen Stand deines Projektes erfahren. Hat dein Comilieren und der Aufbau der Schaltung geklappt?
Platinen sind nun alle geätzt! habe mir nun ein für alle mal das orginal Eagle von CAD Soft gekauft... zwar deftig für nen armen Studenten wie mich aber immerhin kein Ärger mehr mit 80x100 Platten ! habe sogar von CAD Soft bei PCB Pool nen Gutschein für ne doppelseitige 100x160 erhalten! compilieren ging mit dem AVR Studio gut bis auf viele warnings... von dene ich keine Ahnung hqabe.. n Kumpel hat auch schon alle Atmels für mich "gebrannt" nun fehlt das Geld für die Bauteile... ja lacht nur.... hätt auch net gedacht das man als Student dauer Pleite is g mein Studium wird vom Bundesamt für den Zivildienst im Januar zwangsbeendet! bis dahin werde ich mich wohl noch ein wenig gedulden müssen ... mit dem Bauteilekauf ! Gruss Matthias Asselborn
@Matthias Wenn dein Studium schon länger als 3 Semester dauert, hast du eine gute Chance durch Einspruch eine Aufschiebung bis nach dem Studium zu erreichen. Dazu würde ich auf jeden Fall mehrere Stellen anschreiben (Amt für Zivildienst, Petitionsausschuss des Bundestages,... je mehr umso besser). Welche Version von Eagle hast du gekauft? Gabs als Student Bonusrabatt? Hatte überlegt mir Target zuzulegen (oder SprintLayout (billig und mehr als zweiseitig kann man zu Hause eh nicht ätzen)).
leider geht's noch nicht so lange ansonsten wäre ja alles halb so wild (Rückstellungsantrag und gut fertig) und wenn mir da nicht ein Mädchen so gut gefallen würde, welches ich dann nie wieder sehe ... seufz - egal <--- offtopic lol habe mir die No Profit Version für Windows und Linux gekauft für ähm insgesamt 140-150 glaube ich +/- paar Euros... -Schaltplan -Router -Board beschränkt auf 160x100 naja immer noch besser als deie 80x100 wenn ich ehrlich bin! möchte demnächst mal das Projekt abschliessen aber zurzeit fehlts noch an Bauteilen! Gruss Matze
Erst mal n frohes Neues! es fehlt noch die letze Platine (is grad beim ätzen) Bauteie hierfür hab ich schon dann teste ich das ganze mal an sagt mal mit was compiliere ich den Display code? geht das im CodeVision? oder habt Ihr AVR Studio genommen? Gruss Matze
@Benedikt: "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..." Das hört sich nach 32k Frequenzbändern bei 96kHz Samplerate an. Ist das eine Anwendung? Jedenfalls wäre wohl eine 64k FFT notwendig. Bei FFTs kann jedenfalls immer viel optimiert werden. Ansatzpunkte sind: verw. Algorithmen (Radix-4, Radix-8, Split-Radix, Real-FFT usw.), Tabellen (v.a. Sin/Cos), möglichst keinen "hübschen" objektorientierten Code ;) (hab in einem Projekt eine FFT in Java gebraucht, die vorwiegend OO-Variante war Faktor 8-10 langsamer), notfalls Assembler (Prime95's FFTs sind immernoch ca. Faktor 2-3 schneller als äquivalente FFTs der zu den schnellsten Libs gehörenden FFTW-Library). Zu Prime95: George Woltman hat dort optimierte Assembler-FFT-Makros sowohl für K8 (also Athlon 64, Opteron, X2 usw.) als auch P4 und P3. Insgesamt ist die FFT mit dem Split-Radix-Butterfly nicht mehr so hübsch wie die meist verwendeten Radix-2-Butterflies. Aber <10 ms für eine 64k FFT klingen doch gut, oder? ;) Manchmal hängts auch woanders (z.B. Darstellung). Oder man könnte gleich auf der Grafikkarte rechnen (wurde schon getan).
Hallo, ich soll auf einem ATmega16 euer Programm vom ATmega8 zum laufen bringen. Bekomm es einfach nicht hin. Eigentlich dürfte es doch keine Probleme geben, oder? Worauf muss ich achten? Hat es schon einer ausprobiert? Gruß Heinz
@Heinz: Ich habe hier auf 16MHz Atmega32 gerade eine C-Version fertig mit ASM-Unterstützung (Code etwa 4,7k + Tabellen im Flash-Speicher). Die Variante braucht bei einer 256er FFT (dafür würde auf Atmega16 schon das SRAM nicht reichen) ca. 59ms mit C-Fixed-Point-Multiplikation und 20ms mit der Routine von AVR (welche auch in den Includes hier zu finden ist). Die reine ASM-Version braucht laut Zeiten im ASM-Code so 10 ms (wenn ich mich richtig erinnere). Aber den Code dürfen wir eh nicht verwenden. Er wäre auch etwas schwierig anzupassen. Also den Weg gäbe es auch..
Hi, leider ist die Apetech-Seite down, gibts davon vielleicht ne neue Adresse?
hello, this: http://www.mikrocontroller.net/attachment/9171/IMG_4401.JPG picture is very super, and I please you, send me schematic and software for it. very thank you. P.S. Excuse please my poor English
Hi, ich habe mal zu dem ganzen ein paar Fragen. Ich möchte ebenfalls mit einem AVR eine FFT machen. Allerdings nur im Bereich von 0-500Hz. Die Auflösung sollte dabei schon recht groß sein sprich am besten 1Hz Abstände. Das ganze ist auch nicht unbedingt Zeitkritisch, da ich das Signal nur auswerten und nicht darstellen möchte. Ich hatte dabei an den internen ADC z.B. vom Mega64 oder Mega128 gedacht und für den Speicherbedarf externen Speicher über i2c oder SPI. Das Siganl wollte ich für max 1 Minute loggen und anschließend in kleinen Stücken auswerten. Ist das ganze möglich oder mache ich hier einen Gedankenfehler? Ist es überhaupt realisierbar? Was meint ihr? Vorab schon mal Danke.
Also eine Auflösung von 0-500Hz benötigt 1000Hz Abtastrate. Bei 10 Bit ADC-Auflösung sind das 10Bit * 1000/s * 60s/min / 8Bit/Byte / 1024Byte/KByte = 73,24KByte/min. Problematische ist die Verwurstung der 10Bit, besser man rechnet mit 16Bit. Wenn du eine Auflösung von 1Hz haben möchtest musst du mindestens eine 1000-Punkt DFT/1024-Punkt FFT machen. Das bedeutet, dass du ein 1s-Fenster betrachtest oder ein kürzeres Fenster nimmst und zero-padding machst. Mit genügend Speicher und Zeit ist das machbar. pumpkin
Hallo Sven, es gibt ein Verhältnis zwischen Abtastrate, Auflösung und notwendiger Stützwerte. Ich habe es mal überschlagen... bei 2 kHz Abtastrate und und einer Auflösung von knapp unter 2 Hz komme ich bei mir auf einen Speicherbedarf für die FFT von 6 kB, wenn die vollen 10 Bit A/D-Auflösung in 16-bit-Worte umgelegt werden sollen. Bei nur 8 Bit Auflösung käme ich mit 3 kB hin. Also mindestens ATmega644 oder ATmega128 bei 8 Bit Auflösung, ATmega2560 bei 10 Bit Auflösung, wenn die FFT-Daten nicht mühsam zur Berechnung jedesmal aus der CPU heraus- und in die CPU hereintransportiert werden sollen. Bei 1 kHz Abtastrate und gleichen Randbedingungen zum Speicherbedarf käme eine Auflösung um 1 Hz zu Stande, aber die obere Messfrequenz von 500 Hz ist dann schon kritisch. Mit Abtastraten von 1 oder 2 kHz sollte das Zusammenstellen der Stützwerte die zeitbestimmende Größe sein und es muss nicht unbedingt in Assembler gearbeitet werden. Ohne externes SRAM oder DRAM sprengt eine Erhöhung der Abtastrate sehr schnell die Möglichkeiten des AVR - da sollte also kein Ehrgeiz hinein gesteckt werden. 2 kHz als obere Grenze scheinen angebracht. Bei 1024 Stützwerten mit 16 bit und 2 kHz Abtastrate kommen in einer Minute ca. 120 kB an Daten zusammen. So bescheiden die Forderung "nur 0...500 Hz" klingt, so anspruchsvoll ist der Wunsch nach einer Auflösung von 1 Hz. August Bühne frei für die Besserwisser.
Hallo August, danke für die schnelle Antwort. Sicherlich ist der Bereich von 0-500Hz sehr bescheiden, aber mehr wird eben nicht benötigt. Allerddings ist mein Problem, das ich ein recht unsauberes Signal erwarte, das ich außwerten muß. Im Grund ist in dem Signal eine Bestimmte Frequenz "versteckt", aus der ich die Geschwindigkeit eines Objektes ableiten muß. Von daher brauche ich dann schon die hohe Auflösung um die 1Hz. Ich habe da gerade noch eine andere Frage, wie kommt man denn auf eine Abtastrate von 2kHz? Ich dachte mit dem ADC kann man z.B. Mega16 nur einen Scaler von 128 einstellen und bei 8MHz wären das dann doch 62,5kHz. und selbst wenn man nun sagt das der ADC 13 clk braucht zur Umsetzung, dann wären das doch noch immer 4,8kHz pro Abtastwert. Oder liegt hier ein Gedankenfehler meiner seits? Bezüglich des Speicherbedarfs hatte ich, obwohl ich davon erst Abstand nehmen wollte bezüglich der beschränkten Schreibzyklen, einen EEPROM nehmen mit i2c. Der i2c sollte ja für Daten schnell genug sein, allerdings bin ich nicht sicher, ob der EEPROM da mitkommt. Gibt es denn großen SRAM oder DRAM mit i2c oder SPI?
Hallo Sven, man muss unterscheiden zwischen Abtastrate (= Abstände, in denen A/D-Proben genommen werden) und Umwandlungszeit des A/D selber. Über CPU-Takt und Prescaler definiert sich die Wandlungszeit des A/D. Die sollte natürlich im Idealfall kürzer sein, als Abstände, in denen A/D-Werte benötigt werden. Auf den ersten Blick scheint die Wandlungszeit des A/D ziemlich unwichtig erscheinen, in der Praxis jedoch kann von einer geschickten Wahl des Prescalers und des CPU-Taktes einiges abhängen. 500 Hz als obere Grenze ist absolut in Ordnung - meine Bemerkung "bescheiden" sollte nur unterstreichen, dass ein AVR das in einer FFT leicht bewältigen kann. Der Knackpunkt ist die Forderung nach 1 Hz Auflösung. Die 2 kHz Abtastrate habe ich willkürlich gewählt als ein Vielfaches von der oberen Spektrumfrequenz 500 Hz, um die Überschlagsrechnung anstellen zu können. Die minimale Abtastrate sollte 1 kHz nicht unterschreiten. Soll die Forderung "1 Hz Auflösung" stehen bleiben, würde ich mich von ATmega32 und auch ATmega128 direkt verabschieden und zu einem ATmega2560 mit 8 kB RAM greifen. Damit kann man dann bequem alles im RAM berechnen und vermeidet zahl- lose I/O-Zugriffe auf serielle Datenspeicher. Dann geht das auch in C und muss nicht Assembler sein. Statt EEPROM würde ich FRAM nehmen. Die sind schneller beim Abspeichern, haben praktisch RAM-Eigenschaften und sind auch in brauchbaren Kapazitäten erhältlich. Man bekommt FRAM-Bausteine bei ebay. Es stellt sich natürlich die Frage, warum das überhaupt mit einem Mikrokontroller bewerkstelligt werden muss. In Frage käme auch ein PC/Notebook mit Soundkarte. Oder ein einfacher Datenlogger mit anschließender Ver- arbeitung in einem PC/Notebook. Soweit zu dem Thema - es hat bestimmt noch Leute im Forum, die dazu qualifiziertere Kommentare abgeben können.
Hallo August, das mit dem Mikrokontroller ist eine Vorgabe, an die ich mich halten muß, da es sich um eine Diplomarbeit handelt ;) An Fram hatte ich auch schon gedacht und schon Samples geordert, allerdings weiß ich nicht, ob und wann die ankommen. An ebay hatte ich da noch gar nicht gedacht ist aber ein guter Hinweis. Von "normalen" Speicher wollte ich eigentlich Abstand nehmen, weil die zuviele Pins haben, daher gerne i2c hätte auch den Vorteil, dass sich die Speicheradresse inkrementiert. Wäre also einfacher. So, nochamls zu der Abtastrate. Wenn ich das richtig sehe, ist bei dem ADC eine S&H, d.h. der Wert wird gesampelt, gehalten und ausgegeben. Das bedeutet dann doch, das erst ein neuer Wert "geholt" werden kann, sobald der ADC den alten Wert umgesetzt hat oder? Das mit fa=min 1kHz ist mir durchaus bewußt, aber wenn ich das mit dem Scaler und einer fcore des uC so richtig sehe, komme ich auf minimal fa=4,8kHz und in dem Fall hätte ich auch viel mehr Werte oder nicht. Oder doch nen externen ADC, dann wäre ich unabhängig vom fcore des uC
Hallo Sven, ok - dann weiß ich das schon mal besser einzuordnen und über grundlegende Dinge brauchen wir uns nicht zu verlieren. ;-) Externen A/D-Wandler braucht es nicht, der AVR packt das locker. Nehmen wir eine Abtastrate von 1024 Hz, 1024 Stützpunkte und einen Tiefpass der alles ab 500 Hz vom A/D-Wandler fern hält. Ich betreibe bei mir den A/D-Wandler im "differential Mode", gibt mir gleich das Vorzeichen frei Haus. Mit welcher Auflösung soll die Ausgabe erfolgen? Davon hängt ab, ob man die Dynamik der 10 Bit des A/D überhaupt nutzen muss. Aber nehmen wir mal an, es wären 10 Bit, dann packen wir jeden Messwert, faul wie wir sind, in 16-Bit-Format, also 2 Bytes je Messwert. Gibt einen ersten Puffer von 2 kByte. Dieser Puffer ist nach einer Sekunde voll. So lange die FFT- Berechnung (abzüglich der Rechenzeit für die Interrupts, für die Erbsenzähler) nicht länger als 1 Sekunde braucht, belastet sie den Durchsatz nicht wirklich. In C sollte das zu lösen sein. Mit Assembler wird an einen Faktor 10 optimieren können, auch lassen sich die Messdaten verschachtelt ablegen, damit die X,Y,Z-Pointer-Operationen des AVR so richtig Freude haben. Schön sieht das dann nicht aus, aber flink wird es. ;-) Für die FFT-Berechnung veranschlage ich weitere 4 kByte. Damit wären wir jenseits von ATmega32 und auch ATmega128. Eigentlich etwas für ATmega2560 mit 8 kB RAM, wenn nicht sogar schon etwas für AT91SAM7xxx. Vorsicht beim ATmega256x in Assembler: für Unterprogramme werden nicht 2 sondern 3 Bytes in den Kellerspeicher verschoben! Ich nutze für einen FFT mit LC-Display hier den ATmega644. Der hat die schöne Eigenschaft, dass er den A/D-Wandler aus einem Timer (Compare) heraus anstoßen kann. Ist die Wandlungs- zeit des A/D bekannt, kann der Timer-Interrupt ohne Rechen- zeitverlust noch für die LC-Display-Ausgabe genutzt werden. Aber das ist wieder eine andere Geschichte. So, dann mache ich jetzt Platz für die Besserwisser. August
Kann mir denn jemand sagen wo ich das display das elm-chan verwendet hat beziehen kann oder kann ich auch ein beliebiges anderes display einsetzen? Welche sind kompatibel bzw. wie kann ich den code für andere Displays nutzbar machen? Gruß MaG
Hallo MaG2k, ich habe mal die Routinen von elm-chan mit den S65-Display-Routinen von Christian Kranz verbunden und habe nun ein Spektrum sogar in Farbe! Gruss Hans-Christian
hallo hans-christian, das klingt sehr sehr interessant...kann ich dich mal um den Quellcode bitten, denn ich weiß nicht wie ich das zu machen habe, also die displayansteuerung in des Programm einzubinden! Danke MfG MaG2k
Hallo August, ich habe nochmal eine Frage. Und zwar hast du geschrieben: "Ich betreibe bei mir den A/D-Wandler im "differential Mode", gibt mir gleich das Vorzeichen frei Haus." Wie sieht das Hardwarmäßig aus? Vorab Danke
Hallo hier habt ihr ne 512 Punkt FFT in Gnumeric (Goodbye Windows :). Ich bin gerade dabei diese in einen Mega32 zu programmieren (asm natürlich). Damit ich keine Scheisse programmier hab ich mir dieses Gnumeric-Programm geschrieben. Vieleicht hilft es jemandem, die Mathe hinter der FFT besser zu verstehen (Rechenwege alle nachvollziehbar), ich hatte anfangs Mühe mit den blöden Formeln, aber der Grundgedanke ist einfach... Das Programm sollte soweit stimmen, für eine Gerade und Sinuswerte gibt es das gewünschte Resultat. Wenn jamand Fehler findet, bitte korrigieren. FFT-Input: Funktion die FFT´t werden soll eingeben, BB,BC,BD ist der Output, unten ist noch der Graph der Input und Outputfunktion. Gut Nacht, ich geh jetzt pennen
Hi, kannst du mir deinen Schaltplan etwas erläutern? Wieso liegt das Audiosignal sowohl auf AREF als auch an ADC0. Bekommst du dadurch das du ADC0 und ADC1 verwendest positive und negative Werte? Vorab Danke.
Sorry meine Anfrage bezog sich auf den Schaltplan avrfftmega8.sch von Benedikt
@Patrick Finde Dein gnumeric Sheet sehr interessant. Um das Sheet und die FFT jedoch besser zu verstehen finde ich die Größe von 512 Punkten recht unübersichtlich. Könntest Du das Sheet vielleicht auf 8 oder 16 Punkte abändern, das wäre denke sehr hilfreich. Gruss Mike
@Patrick Da stimme ich Mike zu, das wäre eine feine Sache. MFG Steffan
Nabend, ich habe nun die FFT von Elm auf meinem uC zu laufen bekommen. Ich nutze die Version mit dem C-Modul für WinAVR. Allerdings habe ich ein Problem, das ich mir nciht erklären kann. Mein uC hat einen Takt von 8MHz, der Prescaler ist auf 128 eingestellt also arbeitet der ADC mit 62,5kHz Takt. Ich betriebe den ADC im Freerun. also braucht die S&H 1,5 und die Wandlung des ADC 13 takte, macht zusammen 15 Takte für ein Wandlung. Daraus würde ich schließen, das ich eine Abtastung von 4,16kHz habe. Ich speichere 4096 abgetastete Werte ab. Nun nehme ich aus diesem Array nur jeden vierten Wert und führe eine 1024 Punkte FFT aus. Da ich nur jeden 4. Wert nehme, müßte es doch einer Abtastfrequenz von 1,04kHz entsprechen d.h. die Auflösung der FFT (Auflösung=Abtastfrequenz/Abtastwerte FFT) müßte 1,04Hz betragen. Ich habe noch einen einfach Tiefpass 1. Ordung davor, der eine Grenzfrequenz von 503Hz besitzt. Meine Referenzspannung des ADC beträgt 4,88V und ich habe ein Offset von 2,44V. Wenn ich kein Signal anlege habe ich, so wie es sein soll in dem Array nur Werte zwischen 0 und -64 Wertebereich +-32768 (-64 dürfte der Quantisieurngfehler sein mit 4,88mV). Soviel zu den Daten. Nun zu meinem Problem: wenn ich ein 100Hz Sinus einspeise, wird mir im Spektrum bei 85 die höchste Amplitude angezeigt. Wie kann das sein? In anbetracht der Auflösung müßte das doch bei 104 liegen oder nicht? Hat jemand ne Idee? Bin über jede Hilfe glücklich! MFG Steffan
Hi, kann mir jemand erklären, wozu die folgende Tabelle benötigt und vorallem wie sie errechnet wird? 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 (Code von http://elm-chan.org/works/akilcd/report_e.html, vom Anfang des Threads) MFG Leo
Bin mal gespannt auf die XMegas, haben die überhaupt mehr Dampf oder wieder nur 1MIPS/MHz?
die tabelle brauchst du, um die ergebnisse der fft in die richtige ordnung zu bringen... kenne jetzt den code von elm chang nich genau, aber ich meine der verzichtet auf eine bitreverse sortierung der stützpunkte und darum muss er sie nach der fft wieder mit der descramble tabelle richtig anordnen glg zero
hmmmm... hat denn jemand das Unterprogramm "do_fft" richtig verstanden? Also ich geh jetzt mal von einer 128 Punkt FFT aus. Der Butterflybuffer ist 512 Byte gross und wird im Unterprogramm "do_window" befühlt, wobei jedes zweites word NULL ist! In der FFT Berechnung wird dann Z die Adresse vom Buffer zugeteilt und Y is die Adresse vom gleichen Buffer, allerdings beginnend von der Mitte (Der Buffer wird also in zwei hälften geteilt). Jetzt wird damit gerechnet.... und dabei ist mir aufgefallen, dass einmal mit [y+0] und [z+0] (das sind jeweils 2 Bytes die in "do_window" zugewiesen wurden) und es wird ebenfalls mit [y+2] und [z+2] gerechnet, wobei hier IMMER [y+2] und [z+2] die Werte 0 sind (auch in "do_window" zugewiesen).... WIESO UND WARUM wird das gemacht? es handelt sich doch hierbei um den RADIX-2 Algorithmus von Cooley und Tukey oder is das ein RADIX-4 Algo?? Kann mir da jemand weiterhelfen, ich möchte das gerne verstehen.
Hallo ! Ich habe auf der Internetseite : http://www.youtube.com/results?search_query=Big+Blue+Audio+Spectrum+Analyzer&search_type= ein Sound-Spectrum mit blauen LED'S gesehen , dafür bräuchte ich genau diesen Schaltplan und Stückliste. Wäre das möglich ? Wenn ja meine E-Mail: MartinPersner@msn.com Ich habe versucht mich bei YouTube zu registrieren aber irgendwie gelingt mir das nicht , das herstellen des Account bricht bei mir immer plötzlich ab. Deshab nun die bitte an Euch helfen Sie mir wen es möglich ist. Ich möchte diesen Big Blue Audio Spectrum Analyzer gerne nachbauen. DANKE
zum Thema oled ist es möglich ein analizer mit controller für ein oled display zu bauen das eine höhere auflösung besitzt? ich will es dann an meine aktivmonitore hängen (und ich dachte am besten direkt am eingang). ich möchte die oled displays dann in meine lautsprecher einbauen und erreichen, dass mir die dann in etwa die genaue frequenzlinie anzeigen und das wenns geht zügig und genau. also nicht leicht nachrudernd oder ungenau.......? wäre glücklich, wenn mir einer helfen könnte. wenn es möglich ist will ich es dann in verschiedenen farben darstellen d.h. Tiefbassbereich 0-125 hz z.B. rot bassbereich 125-380 z.B. orange tiefmitten bereich 380-1800 blau hochmittenbereich 1800-6200 grün und Höhenbereich 6200-22000 gelb zum Beispiel muss nicht genau so sein Danke schon mal im voraus für euer interesse mfG Dominik
Eines weckt bei mir doch reges Interesse, wie habt ihr die AGC realisiert oder wurde hier überhaupt eine realisiert. Irgendwie muss ja für eine "konstante" Aussteuerung bei verschiedenen Lautstärken gesorgt werden. Liegt zwar schon ein bisschen zurück das Ganze hier aber würd mich trotzdem über ein paar Antworten freuen. Gruß, der Herr Jo
AGC ist doch vom AD die Ref spannung? einfach auf VCC legen, ich jag zb auch einfach voll wellen drauf, ohne gleichrichtung, nur nen kondensator zumn endkoppeln brauchst du
Hallo zusammen, ich habe eine große Bitte, es geht mir um ein Programm zur Veranschaulichung meiner Technikerarbeit. ich möchte ein Mikrofonsignal verstärken und an den AD- Eingang geben. Die aufgenommenen Töne sollen in 5 Spektren (125, 250, 500, 1000, 2000 Hz) zerlegt werden und je nach Pegelstärke eine Led blinken lassen. Wobei die Impulslänge (led an) immer gleich lang seien soll, nur der Pausenabstand soll immer kürzer werden. Wird z.B ein ton von 500Hz leise ins Mikro geleitet so blinkt die 3. Led mit großen Pausen, wird nun der Ton laut so blinkt die Led sehr schnell. Mit dieser Schaltung möchte ich die Funktionsweise eines CI Implantates und die Umsetzung in Corchlea verständliche Signale veranschaulichen und es wäre schön wenn mir jemand bei dem Programm helfen kann, denn leider habe ich mit dem Kontroller zu wenig Erfahrung.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.