Hallo, bin schon länger hier im Forum unterwegs und hab auch schon oft durch die unzähligen Beiträge Hilfe gefunden. Hab schon ein wenig Erfahrung mit der Programmierung von uC's und hab auch schon ein paar Projekte fertig gestellt. Bin seit einiger Zeit am überlegen und planen eines LED Audiospectrumanalyzers und jetzt mit meinem Latein am Ende. Hab hier im Forum reichlich Infos gefunden nur sind da noch ein paar Ungereimtheiten die sich aufgrund meines mangelden Wissenstandes einfach nicht lösen wollen: Von der Seite http://elm-chan.org/works/akilcd/report_e.html hab ich mir den Quellcode herunter geladen und versteh schon einigermaßen worums in der FFT geht und wie das abläuft. Hier meine Vorstellungen: Ich würde gerne 32 x 16 LED Matrix bauen die ich mit einem ATMEGA8 per Multiplexing mit Schieberegistern usw. ansteuer. Die FFT soll ein 2ter uC übernehmen und dem Matrixtreiber dann per UART oder TWI zuschicken. 1.) Welchen uC sollte ich zur Berechnung am besten nehmen? Der Type von der Website benutz einen ATMEGA 8. Hätte aber auch gerade einen ATMEGA 32 herumliegen. (Nur währen dann ziehmlich viele Pins unbelegt ist das nicht Verschwendung?) 2.) Mit welcher Grenzfrequenz sollte ich am besten arbeiten? Was ich gelesen habe liegen die hörbaren Frequenzen zwischen 16Hz und 20kHz. Viele benutzen für einen Spectrum Analyzer nur bis zu 10kHz. Könntet ihr was empfehlen? Erfahrungen? 3.) Wieviele Samples sollte die FFT mindestens haben damits auf oben gennater Matrix gut aussieht? Hab gelesen das mehr als 128 wegen des Begrenzten SRAM's des MEGA8 ohne zusätzlichen SRAM nicht möglich sind (128 Samples benötigen laut meiner Rechnung um die 898 Bytes). Sollte ich einen zusätzlichen Ram benutzen wodurch dann sicher auch eine 1024 FFT möglich währ wenn der uC es schafft. 4.) Wozu ich absolut nur recht wenig bzw. für mich recht unverständliche Lösungen gefudnen habe ist das Anschließen des Audiosignals an den ADC-Eingang. Von über ohne zusätzliche Beschaltung bis mit 3 Tiefpassfiltern war alles dabei. Könnt ihr mir bitte kurz die Mindestanforderungen (zB.: zum testen/ vertraut werden) und die optimalen Voraussetzungen bzw. wie ich das Aufbauen kann erklähren. Was ich gesehen habe gehen fast alle Schaltungen von 2 Steckern fürs Audiosignal aus. Was ist wenn ich zB.: mein Handy mit nur einem Stecker verbinden will? Wo zapf ich das Audiosignal ab? Ich dachte mir direkt wenns aus meinem PC raus kommt bevors zur Anlage weitergeht. Ist das Richtig? Das wars erst mal. Ich hoffe ich hab nichts evrgessen und es findet sich wer der sich die Zeit nimmt einem Anfänger wie mir weiter zu helfen. Jetzt schon mal Vielen Vielen Dank :) mfg.skyscater
Hab mich jetzt noch durchgelesen und bind ann auf den Beitrag gestoßen: Beitrag "[C] AVR-Lichtorgel per FFT MEGA8 32 644" Ich hab zum einlesen des Audiosignals die angehängte Schaltung die ich aus dem Beitrag hab anchgebaut (nur den Bandpassfilter). Laut dem Beitrag liegt die Grenzfrequenz bei 9 kHz. Was eigentlich passen würde. Zum einlesen verwend ich volgenden Code den ich von elm-chan.org hab:
1 | void capture_wave(int16_t *buffer, uint16_t count) { |
2 | ADMUX = _BV(REFS0)|_BV(ADLAR)|_BV(MUX2)|_BV(MUX0); // channel |
3 | |
4 | do { |
5 | ADCSRA = _BV(ADEN)|_BV(ADSC)|_BV(ADFR)|_BV(ADIF)|_BV(ADPS2)|_BV(ADPS1); |
6 | while(bit_is_clear(ADCSRA, ADIF)); |
7 | *buffer++ = ADC - 32768; |
8 | } while(--count); |
9 | |
10 | ADCSRA = 0; |
11 | }
|
Ich lass meinen ATmega8 die FFT berechnen und sende die Daten dann per UART an meinen Pc zum darstellen. Nur gefällt mir das überhaupt nicht. Der erste Balken ist immer extrem hoch und die anderen Balken extrem klein. Nach bissl überlegen denk ich dass das von den 2,5V die ich dazuaddier kommt oder? Ich hab mir gedacht das ich die dann einfach Softwaremäßig abzieh. Lieg ich da richtig? Nur hab ich dann gesehn das erstens die Wandlung durch ADLAR linksbnündig ausgerichtet wird und er dann noch 32768 abzieht. Hat jemand eine Ahnung weshalb? Ich hoff ich bin nicht im falschen Unterforum und hoffe das jemand eine Idee hat. mfg. Michi
Michael Mokricky schrieb: > Nur gefällt mir das überhaupt nicht. Der erste Balken ist immer extrem > hoch und die anderen Balken extrem klein. > Nach bissl überlegen denk ich dass das von den 2,5V die ich dazuaddier > kommt oder? > Ich hab mir gedacht das ich die dann einfach Softwaremäßig abzieh. Lieg > ich da richtig? > Nur hab ich dann gesehn das erstens die Wandlung durch ADLAR > linksbnündig ausgerichtet wird und er dann noch 32768 abzieht. Hat > jemand eine Ahnung weshalb? Der Codefetzen rechnet den Gleichspannungsoffset schon raus. Da mußt Du nix mehr tun, schon gar nicht dazuaddieren(?). Ohne Deinen Geheimcode gesehen zu haben kann man allerdings gar nix dazu sagen, wie es dann bei Dir weitergeht. mfg
Vielen dank schon mal für deine Antwort :D! Asso. Könntest du mir das villeicht kurz erläutern bitte? (das substrahieren von 32768 muss irgend was mit dem 16 bit register zu tun haben -> 2^16 =32768. Nur was weiß ich nicht :/ ) Sorry meinte substrahieren. Sorry dachte es währ klar ich für eigentlich nur die FFT aus und schick die Daten so wie sie sind an den PC:
1 | #define F_CPU 16000000UL
|
2 | #define BAUD 9600L // Baudrate
|
3 | |
4 | #include <avr/io.h> |
5 | #include <string.h> // Für "strcmp" |
6 | #include <stdlib.h> // Für "itoa" |
7 | #include <util/delay.h> |
8 | #include <avr/pgmspace.h> |
9 | #include "ffft.h" |
10 | |
11 | int16_t capture[FFT_N]; |
12 | complex_t bfly_buff[FFT_N]; |
13 | uint16_t spektrum[FFT_N/2]; |
14 | |
15 | void initUART (void){ |
16 | UBRRH = UBRR_VAL >> 8; |
17 | UBRRL = UBRR_VAL & 0xFF; |
18 | |
19 | UCSRB = (1 << RXEN) | (1 << TXEN); // UART Receiver und Transmitter anschalten |
20 | UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0); // Data mode 8N1, asynchron |
21 | }
|
22 | |
23 | void uart_putchar(unsigned char c){ |
24 | while (!(UCSRA & (1 << UDRE))); |
25 | UDR = c; |
26 | }
|
27 | |
28 | void uart_putstring(char *str){ |
29 | unsigned char i; |
30 | for (i=0;i<255;i++) { /* Maximal 255 Zeichen ausgeben ... */ |
31 | if (str[i] != 0) |
32 | uart_putchar(str[i]); |
33 | else
|
34 | break; // Ende des Strings erreicht |
35 | }
|
36 | }
|
37 | |
38 | void capture_wave(int16_t *buffer, uint16_t count) { |
39 | ADMUX = _BV(REFS0)|_BV(ADLAR)|_BV(MUX2)|_BV(MUX0); // channel |
40 | |
41 | do { |
42 | ADCSRA = _BV(ADEN)|_BV(ADSC)|_BV(ADFR)|_BV(ADIF)|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0); |
43 | while(bit_is_clear(ADCSRA, ADIF)); |
44 | *buffer++ = ADC - 32768; |
45 | } while(--count); |
46 | |
47 | ADCSRA = 0; |
48 | }
|
49 | |
50 | int main(void) { |
51 | char temp[10]; |
52 | uint16_t n; |
53 | initUART(); |
54 | while(1) { |
55 | |
56 | capture_wave(capture, FFT_N); |
57 | fft_input(capture, bfly_buff); |
58 | fft_execute(bfly_buff); |
59 | fft_output(bfly_buff, spektrum); |
60 | for ( n=0; n < FFT_N/2 ; n++){ |
61 | utoa(spektrum[n],temp,10); |
62 | strcat(temp,","); |
63 | uart_putstring(temp); |
64 | |
65 | }
|
66 | uart_putstring("\r\n"); |
67 | }
|
68 | }
|
Der Prescaler für den ADC war auf 64 eingestellt was 250kHz ergibt. Im Datenblatt stand was von maximal 200KHz. Deswegen hab ich ihn testweise mal auf 128 gestellt. Was ich gerade bemerkt habe, ist, dass die ersten beiden Balekn auch wenn kein Signal anliegt aussteuern. Und wenn ein Signal anliegt kommen die ersten beiden imemr am höchsten rauf. Noch so eine Frage nebenbei. Ich komm am Pc grad mal auf 10 fps. Ist die UART übertragung so langsam oder mach ich mit dem UART auch was falsch? :/. mfg. Michi.
Michael Mokricky schrieb: > Asso. Könntest du mir das villeicht kurz erläutern bitte? (das > substrahieren von 32768 muss irgend was mit dem 16 bit register zu tun > haben -> 2^16 =32768. Nur was weiß ich nicht :/ ) NF besteht bekanntlich aus Wechselstrom, die einseitig spannungsversorgte Filterschaltung und der ADC können also mit den negativen Halbwellen nix anfangen, daher wird die NF mit der halben Betriebsspannung beaufschlagt, und per Software wieder entfernt. Am ADC-Eingang sollte also U/2 zu messen sein. Sonst sehe ich bei grobem Überfliegen nix auffälliges. mfg
Na ich meinte wie er das abzieht. Ich hätte das ADLAR bit nicht gesetzt und 512 abgezogen weil 1024 ja das maximum is. Nur kommen dann viel viel kleienere Werte raus als bei ihm. Ich nehm an du hast sowas auch schon gebaut? könntest du mir villeicht deine Schaltung zum einlesen des Audiosignals zeigen(wegen tiefpass/hochpass/bandpassfilter). Wenn mit der Software alles in Ordnung ist nehm ich an dass die immer hohen Werte bei den ersten 2 Balken an der Beschaltung liegen. Rauschen? Hättest du eine Idee wie ich das raus bekomm? Welche Frage auch noch offen ist, ist warumm das UART so langsam ist bzw. wie ichs beschleunigen kann. mfg. Michi
Meine Schaltung hast Du weiter oben schon gepostet! ;-) An Deiner Statt würde ich einfach mal die Baudrate gehörig hochschrauben. mfg
Michael Mokricky schrieb: > Na ich meinte wie er das abzieht. > Ich hätte das ADLAR bit nicht gesetzt und 512 abgezogen weil 1024 ja das > maximum is. durch die linksbündige Ausgabe liegt der Maximalwert bei 65535 (0xFFFF), alse ist 32768 die Hälfte ich hab mir die fft Berechnung nicht angesehen, aber warscheinlich erspart man sich dadurch eine Multipikation der ADC-Werte > Nur kommen dann viel viel kleienere Werte raus als bei ihm. > > Ich nehm an du hast sowas auch schon gebaut? könntest du mir villeicht > deine Schaltung zum einlesen des Audiosignals zeigen(wegen > tiefpass/hochpass/bandpassfilter). > Wenn mit der Software alles in Ordnung ist nehm ich an dass die immer > hohen Werte bei den ersten 2 Balken an der Beschaltung liegen. Rauschen? eher Netzbrummen > Hättest du eine Idee wie ich das raus bekomm? erst mal den ADC-Eingang auf Ub/2 legen - ohne den ganzen Vorverstärker kram > > Welche Frage auch noch offen ist, ist warumm das UART so langsam ist > bzw. wie ichs beschleunigen kann. warum nimmst du nur 9600Baud? Sascha
** Lötlackl schrieb: > Meine Schaltung hast Du weiter oben schon gepostet! ;-) > An Deiner Statt würde ich einfach mal die Baudrate gehörig > hochschrauben. Asso ^^ Dann vieln Dank für die Schaltung! :D Hab die Baud jetzt mal auf 56000 hoch gedreht und jetzt läufts recht flüssig :D Hab mit einer 128 Punkt FFT 15 fps. Sascha Weber schrieb: > durch die linksbündige Ausgabe liegt der Maximalwert bei 65535 (0xFFFF), > alse ist 32768 die Hälfte > ich hab mir die fft Berechnung nicht angesehen, aber warscheinlich > erspart man sich dadurch eine Multipikation der ADC-Werte OK Danke :D Sascha Weber schrieb: > warum nimmst du nur 9600Baud? Aus unwissenheit. In den ganzen Tuts die ich gelesen hab stand nicht wie groß man die am besten annimmt und wie hoch sie maximalo sein kann. Sascha Weber schrieb: > eher Netzbrummen >> Hättest du eine Idee wie ich das raus bekomm? > erst mal den ADC-Eingang auf Ub/2 legen - ohne den ganzen Vorverstärker > kram Hab ich vorher schon versucht, nur hab ich dann Frequenzen über 9kHz auch drin die ich nicht brauch. Auch ohne bleiben die ersten beiden balken immer ein bissl ind er höhe wenn kein signal anliegt. Naja werd ich softwareseitig irgend wie schonw eg bekommen. Das einzige was mich jetzt noch stört is, dass die Balken recht stark herumhüpfen sprich die unetrschiede recht groß sind. Werd mal versuchend as ganze mit fading/flüssige Übergänge ind en Griff zu bekommen. Ein ATMEGA 644 is auch schon bestellt, villeicht schaff ich mit dem 512 Punkte :D Auf jeden Fall vielen Dank an euch! mfg. michi
Michael Mokricky schrieb: > Auch ohne bleiben die ersten beiden balken immer ein bissl ind er höhe > wenn kein signal anliegt. Naja werd ich softwareseitig irgend wie schonw > eg bekommen. Das ist nicht gut. Wenn die Störung hardwaretechnische Ursachen hat, die z.B. an Deinem Versuchsaufbau liegen und Du die nun "rausrechnest", kann (wird) es passieren, dass die Hardware in einem anderen "Kontext" (anderer Ort, anderes Netzteil, anderes wasauchimmer) diese 'Störung' (ich tippe auch auf Netzbrummen, da gibts genug, was man dagegen tun kann) dann nicht auftreten und Deine Software dann Mist ausgibt, da die Software ja immer noch auf die 'Störung' im Versuchsaufbau kalibriert ist. Störungen rausrechnen ist nicht immer gut, vor Allem, wenn es scheint, dass diese durch ein paar einfache Bauteile zusätzlich entfernt werden kann.
Sebastian schrieb: > Michael Mokricky schrieb: >> Auch ohne bleiben die ersten beiden balken immer ein bissl ind er höhe >> wenn kein signal anliegt. Naja werd ich softwareseitig irgend wie schonw >> eg bekommen. > > Das ist nicht gut. Wenn die Störung hardwaretechnische Ursachen hat, die > z.B. an Deinem Versuchsaufbau liegen und Du die nun "rausrechnest", kann > (wird) es passieren, dass die Hardware in einem anderen "Kontext" > (anderer Ort, anderes Netzteil, anderes wasauchimmer) diese 'Störung' > (ich tippe auch auf Netzbrummen, da gibts genug, was man dagegen tun > kann) dann nicht auftreten und Deine Software dann Mist ausgibt, da die > Software ja immer noch auf die 'Störung' im Versuchsaufbau kalibriert > ist. > Störungen rausrechnen ist nicht immer gut, vor Allem, wenn es scheint, > dass diese durch ein paar einfache Bauteile zusätzlich entfernt werden > kann. Stimmt. Hab mich dahingehend noch nicht umgesehn. Werd das mal tun aber könntest mit villeicht Tips geben was man dagegen tun kann? mfg. Michi
Michael Mokricky schrieb: > Hab mich dahingehend noch nicht umgesehn. Werd das mal tun aber > könntest mit villeicht Tips geben was man dagegen tun kann? Wenns um NF (Audiosignale) geht, fällt mir spontan "Galvanische Trennung" "Trenntrafo" ein, wo man sich mal schlau machen könnte. Optisch geht das wohl auch, wurde hier im Forum besprochen: Beitrag "Suche analogen Optokoppler für Audio"
Dann meld ich mich wieder mal: Hab mein Programm jetzt um eine Anzeige vom digitalisierten Signal erweitert und die Baud auf 256000 hoch gschraubt. Dass die ersten Balken auch beim anliegen keines Signales ausschlugen hat damit zu tun dass nicht genau 2,5V hinzuaddiert werden sonder um die 2,43V. Wenn man sich das Signal ansieht sieht man das recht gut. Ich hab einfach die Zahl die nachd er AD-Wandlung subtrahiert wird angepasst und scho läufts wies soll :D (wenn kein Signal anliegt is auch alles andere aus). Was ich nach einer Simulation mit LTSpice auch herausgefunden habe ist, dass der Verstärker das Signal unschön bei 4V abschneidet. Da der ADC aber von 0 bis 5V geht will ich das Signal eigentlich nicht begrenzen, somit hab ich den Verstärker einfach mal ausgelassen. Was mich noch stört ist, dass der Tiefpass einer recht neideren Ordnung ist. Bei der Schaltung von Elm-Chan wird ein IC (Tiefpass 8ter ordung) verwendet der leider nicht aufzutreiben ist. Kennt villeicht jemand so einen IC den ich bei Conrad oder Reichelt bekommen kann? Was mich jetzt noch stört, ist dass die ersten par Balken im unterschied zu den letzteren immer noch viel viel höher ausschlagen. Kann es ein dass das mit den höheren Frequenzen (>10kHz) die durch den Tiefpassfilter zu wenig geschwächt werden zusammenhängt? Ich hab mir für Winamp gerade ein Audio Sequenc Analyzer Plugin (Classic Audio Spectrum Analyzer) runter geladen und hab dort eine Einstellung "equalize" gefunden. Wenn ich die deaktivier ist das Spectrum ind er ersten hälfte auch viel größer als das in der zweiten. Wenn sie aktiviert ist, sieht alles recht gut und gleichmäßig aus. Ich hab keine Ahnung wie ich sowas Softwaremäßig realisieren könnte. Hat von euch jemand eine Idee? mfg.skyscater
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.