Forum: Mikrocontroller und Digitale Elektronik LED Audio Spectrum Analyzer


von Michael M. (skyscater)


Lesenswert?

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

von Michael M. (skyscater)


Angehängte Dateien:

Lesenswert?

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

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

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

von Michael M. (skyscater)


Lesenswert?

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.

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

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

von Michael M. (skyscater)


Lesenswert?

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

von Lötlackl *. (pappnase) Benutzerseite


Lesenswert?

Meine Schaltung hast Du weiter oben schon gepostet! ;-)
An Deiner Statt würde ich einfach mal die Baudrate gehörig 
hochschrauben.

mfg

von Sascha W. (sascha-w)


Lesenswert?

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

von Michael M. (skyscater)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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.

von Michael M. (skyscater)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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"

von Jens (Gast)


Lesenswert?

vielleicht hier:

Beitrag "Re: Audio Spectrum Analyzer"

mal reinschauen.

JJ

von Michael M. (skyscater)


Lesenswert?

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