FFT in C für einfache Analyse

Gast #768010
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
Gast #768109
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
Gast #768183
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
Gast #768226
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
Gast #768242
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
Gast #768244
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
Gast #771403
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
Gast #773704
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
Gast #773806
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
Gast #773963
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
#774076
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
Angehängte Dateien:
#774730
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
Gast #774774
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
#775290
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren