Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT in C für einfache Analyse


von Thomas (Gast)


Lesenswert?

Hi,

ich bin auf der Suche nach einer FFT Lösung in C mit der ich aus einem 
Audiosignal feststellen kann ob gerade tiefe, mittlere oder hohe töne am 
ADC ankommen. eine große spectrumanalyse brauche ich nicht.

Besten Dank

Thomas

von Helmi (Gast)


Lesenswert?

Waere es nicht besser 3 Digitale Filter dafuer einzusetzen.
Die kannst du in echtzeit berechnen und nicht wie die FFT im nachhinein.
Auch duerfte der Rechenaufwand dafuer weniger sein.

Gruss Helmi

von eric (Gast)


Lesenswert?


von Thomas (Gast)


Lesenswert?

Hi,

was meinst du mit digitalen filtern, das wäre wohl das beste dafür.
hast du da mal mehr infos zu.

danke

thomas

von Jorge (Gast)


Lesenswert?

Das Spektrum kann man überschlägig berechnen. Eine Lösung dafür findest 
du in "Numerical Recipes in C". Das BUch steht kostenlos Online zur 
Verfügung.



http://www.nrbook.com/a/bookcpdf.php

von Helmi (Gast)


Lesenswert?

Ein Digitales Filter verhaelt sich im Grunde genommen wie ein Analoges 
Filter. Nur das hier keine Analog Bauteile verbaut werden sondern das 
Filter mittels Rechenoperationen dargestellt wird auf deinen Prozessor.

http://de.wikipedia.org/wiki/Digitales_Filter

Auf dieser Seite findest du ein Programm dem du nur Vorgibst welche Art 
deine Filter sein soll (IIR oder FIR) welchen Filtertype dein Filter 
haben soll (Butterworth , bessel ...) die Ordnung des Filters und die 
Grenzfrequenz. Als Ausgabe bekommst du ein C Source File mit allen 
Koeffizenten und berechnung. Diese Routine must du nur bei jedem neuen 
Abtastwert von deinem ADC aufrufen. Als Returnwert bekommst du deine 
gefilterten Werte.

http://www.winfilter.20m.com/

Gruss Helmi

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Das Programm würde ich nicht empfehlen, siehe 
Beitrag "FIR Filter Design Software".

von Thomas (Gast)


Lesenswert?

Hi,

das sieht sehr gut aus.

Was ich noch vergessen hatte zu erwähnen ist, dass ich alles auf einem 
AVR machen möchte. Da es ja auch eine FFT auf einem Mega8, allesdings in 
asm, sollte das funktionieren.

Wie werte ich jetzt das ADC Signals des Atmes am besten aus?
Messe ich die Spannung und schicke diese durch den filter? Oder wie 
genau soll das funktionieren?

Eine andere möglichkeit wäre für mich noch, 3 Filter analog aufzubauen 
und diese an 3 ADC des atmels zu messen? Im grunde möchte ich nur wissen 
welche frequenz des sounds am intensivsten ist.
Also entweder Bass, Mittel oder Hochton?
Funktionsweise im Prinzip wie eine Lichtorgel.

Gruß Thomas

von Helmi (Gast)


Lesenswert?

Du mist mit dem ADC die spannung und schickst sie zur Filterroutine.
Aus der Filterroutine kommt dann der gefilterte Messwert raus.
Wenn jetzt die Mittenfrequenz deines Filter mit der Eingangsfrequenz 
übereinstimmt gibts am Ausgang den höchsten wert.
Du must allerdings mehr als das doppelte Abtasten als die höchste 
Signalfrequenz. Also wenn du 15Khz Messen willst dann must mehr als 
30000 Samples/s abtasten. Diese Samples übergibst du dann deiner 
Filterroutine.

z.B.

while(1)
{
       val = adcwert();             // Messwert einlesen
       filterval = filter(val);     // Filtern ein wert rein einer raus
       dacwert(filterval)           // gefilterten wert ausgeben
}


Am besten schreibst du dir unter Windows ein programm um das mal 
auszuprobieren. Die Messwerte kannst du ja simulieren.

Gruss Helmi

von Thomas (Gast)


Lesenswert?

wie viele adc abfragungen sollte ich denn hintereinander unternehmen?

mir scheint ehrlich gesagt bald die methode mit den analogen filtern 
besser da ich damit keinen rechenaufand für den avr habe, da dieser ja 
noch was anderes machen soll :-)

mh, alles nicht so leicht.

gruß thomas

von Helmi (Gast)


Lesenswert?

Der macht dann fast nix anderes mehr.
Digitale Signalverarbeitung ist nun mal rechenintensiv. Deshalb wird sie 
auch meistens auf DSP gemacht die für sowas spezielle Befehle haben wie 
z.B. ein MAC Befehl de rmultipliziert und addiert gleichzeitig.
Ich habe das mal auf einen mit 40 Mhz getakteten DSP gemacht in ASM.

Wahrscheinlich ist es für dich wirklich besser das mit analogen Filtern 
zu machen.

Gruss Helmi

von Thomas (Gast)


Lesenswert?

Hi nochmal,

ich habe jetzt schon ein wenig im netz nach analogen filtern gesucht und 
bin auch fündig geworden. Jetzt wird das auch nicht mehr so richtig hier 
her passen aber ich führe das mal weiter.

Testaufbauten habe ich bereichts mit einem lm324 und den komponenten für 
einen hoch, tief und bandpass gemacht.
Ich habe zum testen mein simples Einkanal Oszi und einen einfachen 
funktiongenerator verwendet.

Da ich später nur mit 5V arbeiten möchte habe ich auch noch einen 
vorverstärker im netz gefunden und aufgebaut.

Wenn ich nun die filter einzeln ausmesse, funktionsgenerator -> 
tiefpass/hochpass/bandpass -> Oszi sieht alles ganz gut aus, auch wenn 
ich nur mit gnd und 5V, also keiner negativen spannung arbeite.
sobald ich aber den vorverstärker davor hänge, der mir das ganze in den 
positiven bereich schiebt und dann messe habe ich einen sehr geringen 
auschlag nach den filtern, zudem arbeiten diess, wie mir scheint, auch 
nicht richtig.

ohne vorverstärker konnte man schön sehen das die auslenkungen der 
sinuswellen bei >150Hz deutlich kleiner wurde und bei ca 1kHz ganz den 
nullpunkt erreichten.

nun meine frage, ist die vorgehensweise so okay oder sollte man die 
sache anders angehen? am besten sind immer schaltbilder, die man im netz 
leider nur spärlich findet.

auch weiß ich noch nicht genau wie ich später mit hilfe des Atmels 
rausfinde welche tonlage momentan überwiegt.

Der Atmel soll mir später sagen welche Tonlage (tief/mittel/hoch) gerade 
am signaleingang am dominiersten ist und dementsprechend eine RGB led 
verändern.

Besten dank für die bereits geleistete hilfe

thomas

von Helmi (Gast)


Lesenswert?

@Thomas (Gast)

Poste doch mal deine Schaltung.

Die vorgehensweise ist folgendermassen:

Aktiver Bandpass -> Aktiver Gleichrichter -> ADC

Du mist alle 3 Kanäle und vergleichst sie miteinander.
Der mit dem höchsten Pegel gewinnt.

Gruss Helmi

von Thomas (Gast)


Lesenswert?

Hi,

schonmal danke für die antwort.

Meine schaltungen kann ich morgen posten, gibts hier ein tool für?

Aber kann ich das audiosignal, welches ja wechselspannung ist mit einem 
op der mit 5V versorgt wird betreiben.

am besten wäre es die untere wellen nach oben zu klappem um das 
auszuwerten.
hierfür der aktive gleichrichter?

wie sieht ein aktiver gleichrichter überhaupt aus ? :-)

Gruß Thomas

von Helmi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Thomas

Hier schon mal vorab ein Plan wie das so aussehen könnte.
Allerdings noch nicht mit werten weil ich deine Frequenzen nicht kenne.

Gruss Helmi

von Thomas (Gast)


Lesenswert?

Hi,

die filter sehen von mir fast gleich aus, nur sind die widerstände und 
kondensatoren beim tiefpass getauscht.

wärst du so nett die schaltung noch mit werten zu vesehen, denn das 
sieht echt gut aus.

ich benötige, tiefpass bis 150Hz, bandpass von 1,5kHz - 5kHz und der 
highpass ab 10kHz. Denke so liegen die frquenzen ganz gut verteilt.

Besten dank für die mühen helmi.

Was ich später noch vor habe ist folgendes, der Input soll wahlweise 
entweder mit einem mikrofon erfolgen oder durch ein line in signal, 
beides soll über einen vorverstärker laufen und mit einem schalter 
umschaltbar sein. Kann ich diesen vorverstärker, der mir die welle ja 
nur in den positiven bereich schiebt davor benutzen?

nochmal danke

Gruß Thomas

von Helmut L. (helmi1)


Angehängte Dateien:

Lesenswert?

Hallo Thomas

Ich habe die werte mal berechnet.
Den Bandpass von 1.5Khz .. 5Khz habe ich durch einen Hochpass mit einem 
nachgeschalteten Tiefpass ersetzt. Das ging sonst wegen der Bandbreite 
nicht.
Am Ausgang haste du wahlweise einen DC-Bereich von 2.5 .. 5V oder 0..5V. 
Das kannst du dir aussuchen.

Die verwendeten OPs (OPA2340) sind Rail to Rail OPs die kannst du auch 
durch andere ersetzen (TS912 oder so)

Gruss Helmi

von Thomas (Gast)


Lesenswert?

Hi,

danke für die mühen!!!

Ist der OP auch durch einen LM324 zu ersetzen?

MfG

Thomas

von Helmut L. (helmi1)


Lesenswert?

Schlecht denn der LM324 kann an seinem Ausgang nicht bis 5V aussteuern.
max. bis ca. 3.5V. Er kann zwar an seinen Eingaengen bis an 0 V ran aber 
bei positiver Aussteuerung auch nicht an die 5V.

Es sei denn du hast mehr als 5V zu verfuegung.

Gruss Helmi

von Thomas F. (thomasf)


Lesenswert?

Hi,

alles klar dann nehm ich einfach den den du in der schaltung hast:-)

Was meinßt du, wie oofft sollte ich den ADC eingang abfrage um dann 
einen mittel wert zu bilden. denn frage ich genau dann ab wenn alle 
pegel auf null sind ist das ja auch doof :-)

gruß und danke thomas

von Helmi (Gast)


Lesenswert?

Tja das ist die Frage.
Das hängt davon ab wie schnell sich dein Signal ändert.
Ich würde mal sagen das das 10Khz Signal am schnellsten abzutasten ist.
Aber wie gesagt das hängt von deinem Signal ab.
Da du ja sowieso das ganze mit einem AVR machst kann man ja die 
Abtastfrequenz ziemlich schnell ändern, von daher dürfte es das kleinste 
Problem sein.
Ich habe die Tiefpassfilter an den Ausgängen auf 1/10 des übertragung 
Bandes gelegt. Also Einschwingzeit für das 10 Khz Filter ca. 1mS. Von 
daher würde ich sagen taste mal mit 0.5mS ab bei allen Kanälen.

Gruss Helmi

von Thomas (Gast)


Lesenswert?

Hi,

sag mal gibt es einen 4fach op der die oben genannten typen ersetzen 
kann. sind ja doch ein paar stufen.

gruß thomas

von Thomas (Gast)


Lesenswert?

Hi,

noch etwas, bei der schaltung soll der aktive gleichrister beim tiefpass 
einen 2µ2 kondensator haben oder hast du dich da vertan?

gruß thomas

von Helmut L. (helmi1)


Lesenswert?

>noch etwas, bei der schaltung soll der aktive gleichrister beim tiefpass
>einen 2µ2 kondensator haben oder hast du dich da vertan?

Ne das kam da schon so raus. Rechne mal nach:

C = 1/(2*pi*f*R)

R = 30K
f = ca.3.5Hz

C = ca. 2.2uF

Der ist sogar noch ein bisschen klein. Der soll ja die Spannung 
glaetten. Ist halt der nachteil bei tiefen Frequenzen.
Du kannst aber 2. Elkos in reihe schalten ( entweder ++ zusammen oder 
--)


>sag mal gibt es einen 4fach op der die oben genannten typen ersetzen
>kann. sind ja doch ein paar stufen.

Es gibt auch 4 fach (TS914)

http://www.st.com/stonline/books/pdf/docs/4475.pdf
Ist zwar nicht OPA2340 geht aber auch. Gibs bei Reichelt


Gruss Helmi

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.