mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: eric (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jorge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für die mühen!!!

Ist der OP auch durch einen LM324 zu ersetzen?

MfG

Thomas

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Fähsing (thomasf)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

gruß thomas

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.