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
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
Hi, was meinst du mit digitalen filtern, das wäre wohl das beste dafür. hast du da mal mehr infos zu. danke thomas
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
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
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
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
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
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
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
@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
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
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
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
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
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
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
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
Hi, sag mal gibt es einen 4fach op der die oben genannten typen ersetzen kann. sind ja doch ein paar stufen. gruß thomas
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.