Forum: Digitale Signalverarbeitung / DSP / Machine Learning ARM Audio Spektrum Analyser


von Johann K. (jo-hann)


Lesenswert?

Hallo zusammen,

Erstmal großes Lob an die Community, ich lese jetzt seit einer Weile 
immer mal was und bin immer auf interessante Sachen gestoßen.
Jetzt zu meiner Projektidee: Ich will einen Spektrum Analyser mit dem 
LPC2124 realisieren. Eingabe soll per Mikrofon erfolgen. Ausgabe in 
einer 3D LED Matrix, die 3. Dimension wird die Zeit, damit will ich also 
eine laufende Spektrumsanzeige erreichen was hoffentlich cool aussieht 
:)
Der LPC sollte meiner Meinung nach genug Speicher bieten und auch genug 
Rechenleistung, und ich will etwas mit ARM machen.

Als Anfänger stell ich da folgende Fragen: ist die FFT geeignet wenn ich 
aufgrund der vielen benötigten LEDs nur 8 Berechnungspunkte nehmen will? 
(Insgesamt dachte ich an eine 8x6x6 (FrequenzxBetragxZeitpunkt) Matrix) 
Ist der Bausatz von Conrad 
(http://www1.conrad.de/fas6/fh.php?fh_params=fh_search%3Dmikrofonvorverst%25c3%25a4rker%26fh_secondid%3Db2c197688%26fh_lister_pos%3D6%26fh_location%3D%252f%252fb2cconrad_de_b2c%252fde_DE%252f%2524s%253dmikrofonvorverst%255cu00e4rker%26fh_eds%3D%25c3%259f%26fh_refview%3Dsearch&fh_host=http://www1.conrad.de&fh_session=/scripts/wgate/zcop_b2c/~flN0YXRlPTQwMDQ4NzU3NTE=?&fh_pic_url=//images.conrad.de&layout=b2c&fsm_host=&fsm_insertkz=) 
zur Ansteuerung des ADC geeignet? Würdet ihr mir als Einsteiger das 
Developer Board von Olimex empfehlen oder gibts es bessere?

Viele Grüße
Johann

von Jupp (Gast)


Lesenswert?

Wie willst du die dritte Dimension realisieren?

von Johann K. (jo-hann)


Lesenswert?

Na ich wollte einfach die einmal berechneten Spektren in den Speicher 
legen. Diese werden dann per Schieberegister oder so weitergereicht in 
die 3. Dimension. Also wenn ich beispielsweise von vorne auf den LED 
Würfel schaue, sehe ich Spektrum(t_jetzt) in der 1. Reihe, 
Spektrum(t_jetzt-1) in der 2. Reihe usw.

von Johann K. (jo-hann)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt hier ein Mikrofon mit einem Frequenzspektrum von 20Hz bis 
20KHz (-10dB bei 20kHz). Wenn ich da also mit 50KHz abtaste, sollte ich 
ohne Anti-Aliasing-Filter auskommen. Aber ich werd aktuell aus dem 
ADC-Teil im Datenblatt des STM32 nicht schlau, da ist die Rede von einer 
f_ADC, welches für weitere Angaben mit 14MHz angenommen wird und dann 
gibt es noch f_S, die Samplingfrequenz. Die müsste ich mir ja auf die 
50KHz einstellen, aber was ist mit der f_ADC?

Viele Grüße
Johann

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Hallo Johann,

das Stichwort für dich ist Spektrogramm. Für gewöhlich analysiert man 
das Signal überlappend:

 1.)  ++++++++--------
 2.)  --++++++++------
 3.)  ----++++++++----
 4.)  ------++++++++--
 .
 .

Damit geht man Blockeffekten weitgehend aus dem Weg. Problematisch ist 
deine geringe Blocklänge, die Granularität ist da eher mäßig - aber für 
deine Zwecke vllt ausreichend. Je größer die Überlappung desto mehr und 
schneller muss gerechnet werden - 50% der Blocklänge sollten genügen. 
Ich habe sowas mal in Verbindung mit MATLAB/Blackfin auf dem Rechner als 
Wasserfalldiagram darstellen lassen und habe dabei 256 Punkte benutzt.

von Timmo H. (masterfx)


Lesenswert?

Sehe ich das richtig, dass du mit der LED-Matrix folgende Achsen sind: 
Betrag, Frequenz und Zeit? Dann kommt für dich ja nicht die 
Wasserfalldarstellung in frage, da du pro Punkt (also je Spektrallinie) 
ja nicht den Betrag in form einer Helligkeit bzw. Farbe ausgibst.

Welches Datenblatt verwendest du? Ich sehe immer nur f_ADC und t_s, 
wobei t_s jedoch mit 1/f_ADC angegeben ist,

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Timmo H. wrote:
> Dann kommt für dich ja nicht die Wasserfalldarstellung in frage,
> da du pro Punkt (also je Spektrallinie) ja nicht den Betrag in form
> einer Helligkeit bzw. Farbe ausgibst.

Ob diese Dimension nun einen Farbwert oder die Höhe eines Balkens 
repräsentiert ist sekundär.

von Timmo H. (masterfx)


Lesenswert?

>Ob diese Dimension nun einen Farbwert oder die Höhe eines Balkens
>repräsentiert ist sekundär.
Richtig, aber dann bezeichnet man es eigentlich nicht mehr als 
Spektrogramm.

von Johann K. (jo-hann)


Angehängte Dateien:

Lesenswert?

Zum Thema Spektrogramm: Da habe ich bei Wikipedia eine mittelmäßige 
Erläuterung gefunden (http://de.wikipedia.org/wiki/Spektrogramm) aber 
das ist das was ich mir vorstelle. Nur verstehe ich noch nicht, was du 
mit Blockeffekten meinst weshalb man überlagernd analysieren sollte? 
Wenn ich mit einer Frequenz von sagen wir 5Hz mein Audiosignal per FFT 
analysiere und das entsprechend mit 5Hz durch den LED-Würfel schiebe 
sollte das doch auch gehen?

Zum Thema f_ADC: Ich habe nochmal das gesamte Datenblatt angehängt. Wie 
gesagt ist mir nicht ganz klar, welche Frequenz was bewirkt. Meine 
Vermutung ist das t_s und damit f_s die Abtastfrequenz darstellen aber 
was ist f_ADC?

Viele Grüße
Johann

von FL (Gast)


Lesenswert?

Hi,

f_ADC ist offensichtlich eine Frequenz, welche der ADC intern benötigt. 
Der ADC arbeitet laut Refernce Manual der STM32-Serie mit sukzessiver 
Approximation (siehe z.B. Wikipedia) und benötigt zur "Berechnung" eines 
Datenwortes einige Takte - f_ADC wird wohl die Clock sein, die diesen 
internen "Wandlertakt" vorgibt.

Die FFT halte ich für Dein Vorhaben nicht für optimal -- sie hat per 
Defintion eine lineare Frequenzachse, und das ist nichts, was man bei 
einem Spektrum-Analyzer im Audio-Bereich haben will.
Aus dem Bauch heraus (d.h. ohne groß überlegt zu haben, ob es 
effizientere Methoden gibt) würde ich folgendes machen:

- Das digitalisierte Audio-Signal parallel durch 8 Bandpässe schicken, 
welche jeweils nur den zu messenden Frequenzbereich durchlassen.
- Die Leistung jedes der 8 Ausgangssignale berechnen
- Die Leistung logarithmieren
- Das Ergebnis evtl. entsprechend skalieren, um bei der begrenzten 
Anzahl von LEDs auch ein "interessantes" Blinken hinzubekommen.

Gruss
FL

von jo-hann (Gast)


Lesenswert?

Ahja und richtig, die Achsen sind Frequenz, Betrag und Zeit....

Viele Grüße
Johann

von jo-hann (Gast)


Lesenswert?

Ah besten Dank für den Hinweis bzgl. sukzessiver Approximation, damit 
ist mir das jetzt klar.
Also bei der Signalauswertung lasse ich mich gerne belehren, davon habe 
ich keine praktischen Kenntnisse. Mir ist halt aus div. 
Grundlagenvorlesungen nur die FFT bekannt...
Dein Ansatz mit den digitalen Bandpassfiltern klingt auch gut, hat noch 
jemand andere/bessere Ideen?

Viele Grüße
Johann

von Timmo H. (masterfx)


Lesenswert?

Also ich denke der ARM sollte massig genug Leistung haben für eine FFT. 
Da mit sicherheit entsprechende Implementierungen zu finden sind sollte 
das schneller gehen als noch extra Bandpassfilter zu machen, vorallem 
ist es flexibler.
Der Typ hats auch mit nem ATmega geschafft (sie Videos).
http://elm-chan.org/works/akilcd/report_e.html

von FL (Gast)


Lesenswert?

Hm,

ich vermute, er will ein logarithmisches Frequenzband für seine 8 LEDs 
haben, z.B. folgende Frequenzbereiche:

LED         1        2        3        4        5        6        7 
8

ob.Freq.  150       300      600      1200      2400    4800     9600 
20000

(ob.Freq.: obere Grenzfrequenz des Bandes für die LED).

Also braucht er eine Frequenzauflösung von 150 Hz.

Bei einer Abtastrate von 50 kHz gibt das 50000/150 eine "333 Punkte 
Fourier-Transformation" => 512 Pkte. FFT ist Minimum.
Die 512 Punkte müssten dann noch irgendwie interpoliert werden, um in 
die Frequenz-Bänder "zu passen".

Dann muss er aufpassen, dass die FFT genügend signifikante Bits liefert, 
denn das Ergebnis muss ja noch logarithmiert werden (bei zu wenig 
signifkanten Bits hat er sonst bei leisen Signalen nur noch "Rauschen" 
auf den LEDs).

Ich will nicht behaupten, dass der ARM das nicht schafft -- für mich 
persönlich wären die Bandpässe aber die einfachere und intuitivere 
Lösung.

Wenn's ein Projekt zum Ausprobieren und Lernen ist, würde ich einfach 
mal mit der Herangehensweise starten, die man selbst für intuitiv 
richtig hält -- man lernt einfach durch nichts mehr, als wenn man die 
Probleme selber lösen muss ;-)

von jo-hann (Gast)


Lesenswert?

Hmm, haben will ich nicht unbedingt ein logarithmisches Frequenzband, 
aber wenn man es so machen sollte dann schon :)
Ich habe eben mal nach paar typischen Spektren von Musik gesucht, aber 
keine mit logarithmischer Frequenzdarstellung gefunden.
Gibt es denn so typische Frequenzbereiche für Musik dass das sinnvoll 
wäre?

Aber der Punkt mit den Bändern ist natürlich richtig. Es wird ja 
schlecht reichen, wenn ich mir 8 Frequenzpunkte suche um die direkt per 
FFT-Ergebniss auf die LEDs zu bringen. Da würde ich dann eher eben mit 
beispielsweise 150Hz Auflösung abtasten und dann mir Bänderbereiche 
definieren, in welche ich dann die gemittelte Leistung von vielen 
Abtastpunkten aus dem Frequenzbereich hineinbringe. Da kann ich ja dann 
immer noch experimentieren mit linearer oder logarithmischer 
Bandaufteilung.

Ja es ist ein Projekt zum Ausprobieren, daher würde ich eben intuitiv 
die FFT nutzen wollen. Inzwischen habe auch entgegen dem ersten Posting 
einen Cortex M3 zum implementieren hier, der sollte auch noch etwas 
effektiver sein als der LPC.

Viele Grüße
Johann

von Timmo H. (masterfx)


Lesenswert?

Also Musik liegt üblicher weise von 100-16000 Hz, kannst ja auch bei 
Winamp sehen oder mit AudaCity dir mal das Spektrogramm ausgeben lassen. 
Logarithmische Frequenzskalierung ist bei Musik nicht unbedingt so 
sinnvoll. Bei der Analyse von Filtern oder so hingegen schon.

von Timmo H. (masterfx)


Lesenswert?

Ich sehe gerade dass AudaCity das gar nicht kann. Aber Spektrum geht. 
Nimm nicht unbedingt ein mp3 File mit 128 kbit/s, da wird meist radikal 
bei > 16kHz angeschnitten. Da sich die meisten Töne jedoch bei < 16kHz 
befinden würde ich auch nur diese darstellen.
Mp3 schneidet ja die höheren Frequenzen bei niedriger Bitrate eben ab, 
weil Menschen ab 30-35 eh nichts mehr über 16-17 kHz hören. Auch für 
junge Menschen ist es in einem Lied kaum wahrnehmbar wenn die hohen Töne 
fehlen. UKW Radio geht übrigens nur bis 15 kHz.

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Ist schon richtig was FL sagt, für gewöhnlich spielt sich bei Musik das 
meisste in den unteren Bändern ab. Über Bandpässe würde ich da mal 
nachdenken. Ferner gibt es Korrekturfunktionen die dem menschlichen 
Hörempfinden gerecht werden, Stichwort dBA etc. Das ändert natürlich 
nichts an der Frequenzauflösung.

Was ich mit Blockartefakten meine: Analysiert man überlappend, dann 
bekommt man die zeitliche Veränderung besser aufgelöst, die Übergänge 
sind 'weicher'. Wird bei deiner Anwendung wahrscheinlich nicht so von 
Bedeutung sein, aber wenn du MATLAB hast probier es einfach mal aus.

von Johann K. (jo-hann)


Lesenswert?

Ahja ok dann werde ich mich also auf 0-16KHz beschränken...
Das mit der Frequenzbewertung klingt ganz interessant. Da kann ich ja 
einfach etwas experimentieren damit, die Bewertungskurven kann ich ja 
super nach der logarithmierten Leistungsberechnung der FFT-Ergebnisse 
einrechnen. Erstmal muss ich mir die Code-Basis schaffen (Ansteuerung 
ADC, Ausgabe von Messwerten vorerst per UART) und dann schauen wir 
weiter.
Besten Danke erstmal,

Viele Grüße
Johann

von FL (Gast)


Lesenswert?

Hallo nochmal,

zur Veranschaulichung der Sinnhaftigkeit einer logarithmischen 
Frequenzauflösung:

Tonhöhen von Musikinstrumenten / Gesang etc. werden logarithmisch 
wahrgenommen -- die fundamentale Größe zur Bezeichnung von Tonhöhen sind 
die Oktaven (und dann feiner unterteilt als Sekunde, Terz, ...).
Eine Oktave ist aber nichts anderes als eine Frequenzverdopplung. Also: 
Der Kammerton a' hat 440 Hz, eine Oktave höher sind 880 Hz, dann folgen 
1760, 3520, 7400, 14800 (, 29600, ...) Hz.

Wenn Du nun linear skalierst, hast Du die Hälfte Deiner FFT-Punkte 
und/oder die Hälfte Deiner LEDs für das Frequenzband 10000-20000 Hz 
verschenkt -- einem Frequenzbereich, welcher gerade einmal eine Oktave 
umfasst und in dem sich nicht allzuviel interessantes abspielt. Bist Du 
dagegen logarithmisch unterwegs, wird dieser Bereich nur von einer LED 
abgedeckt, und Du hast genügend LEDs für die anderen Oktaven übrig.

Dass die wenigsten Programme logarithmische Frequenzskalen verwenden 
dürfte genau den Grund haben, den man auch in diesem Thread sieht: Es 
gibt fertige FFTs, und wenn ich genügend Rechenleistung habe, lasse ich 
halt eine FFT mit genügend Punkten auf das Signal los, so dass ich zwar 
im oberen Frequenzbereich eine unnütz feine Auflösung habe, aber im 
unteren Frequenzbereich trotzdem noch genügend Punkte habe.
Wenn Du aber "ernsthafte" grafische Equalizer siehst, so sind hier die 
Frequenzbänder immer logarithmisch -- alles andere wäre für 
Audio-Anwendungen absolut sinnlos.

Gruß
Frank

von Johann K. (jo-hann)


Lesenswert?

Aha ok, bei solchen Sachen wie Oktaven habe ich nicht aufgepasst in der 
Schule ;)
Gut da werde ich es so angehen, dass ich den Cortex erstmal mit ner 
512er oder 1024er FFT quäle. Mal schauen was da machbar ist. Danach 
erstell ich mir 8 logarithmische Bänder in welchen ich die 
Amplitudenwerte mittle. Dann logarithmiere und skaliere ich die 
Amplituden...

Du hast Recht, Bandpässe erscheinen da intuitiver aber andererseits will 
ich mal diese FFT probieren...

Viele Grüße
Johann

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.