Hi Leute, wurde schon mehrfach angerissen... Ich möchte für meinen DMX-Steuerechner (funktioniert soweit) die Musikansteuerung nun, weg von meinen analogen Bandpassfiltern (die auch super funktionieren), diese im AVR nachbilden. Die Meinungen hierzu sind unterschiedlich: die einen meinen, im Gerät müsste auch was zu finden sein, wenn einer mal reinsieht. Die anderen sagen, da darf nur der Controller und ein Display zu finden sein. Ich will es nun einfach mal probieren. Unter http://iem.kug.ac.at/~majdak/download/mlib/peakfilt.m habe ich eine einfache Implementation für ein Bandpassfilter gefunden. Die Sourcen ist für MathLab geschrieben. Hat wer sowas schonmal gemacht? Kann das jemand umsetzen? Mir ist der(die?) syntax der Quelle nicht ganz einleuchtend. Ich habe den ICC-Compiler, Codevision, FastAVR und/oder Assembler zur Verfügung. Oder lass ich meine Bandpassfilter, wie sie sind? Schafft der AVR das überhaupt? Ich dachte an einen Mega16, davon habe ich noch welche da. Viele Grüße AxelR.
Hi ich wage daran zu zweifeln das ein AVR für jegliche Art von digitalem Filter in Audioanwendungen (44,1kHz 16Bit Stereo) geeignet ist. Matthias
Achso, mein DMX-Kram wird von maximal 800-1000Hz angeblasen. 8Bit reichen, Stereo muss es wohl auch nicht sein. Der Basstakt soll an die Lampen weitergereicht werden. AxelR.
Hi, hab mir mal dein Mathlab Prog angesehen, komme auf anhib aber auch nicht ganz mit. Eine Kurtze Einführng in die Digitale Filter kann ich dir aber trotzdem geben.. Du solltest IIR (infinite impulse response) Filter verwenden, da sie eine wesentlich kürzere Filterstruktur haben ( unlinearitäten usw. stören bei dir vermultich net wirklich!) Aber das ich es richtig verstanden habe, du möchtest ein Bastakt an eine Lampe weitergeben.. Dann benötigst du eigentlich nur einen Tiefpass! Sobald ich weiß ob es so gemeint war können wir überlegen was so ein Filter wir dir designen! Stefan
@Stefan1: gleich... @all ich habe was gefunden, leider polnisch ;-(( http://www.elektroda.pl/rtvforum/topic14925-0-asc-0.html @Stefan1: jetzt ich habe ja nun schon einige Zeit mit dem Zeuchs zu tun, ein Tiefpass war natürlich auch meine erste Idee. leider hat der Tiefpass zu unteren Freuqnzen hin keine nennenswerte Dämpfung der signale zufolge. So kommt es immer wieder, das störende "Subsonics" meinen Taktablauf gestört haben. Ich habe nun dummerweise wening techno im Repertuar(?), sondern eher 80ziger Musik. Da liegt der Bass irgentwie anders, eben (etwas) höher. Ich habe jetzt 4 Bandpässe parallel, dnen ich eine Gleichrichtung und je einen Komparator nachgeschaltet habe. Die liegen an den Portpins und über 4tasten kann ich mich entscheiden, welchen Bandpass ich verwenden möchte. Das geht also wesentlich besser, als mit dem Tiefpass. Wobei ich die 4 Bandpässe garnicht wirklich brauche, bin ich ganz erlich, meist nehm ich das dritte (um 750Hz | gilt nur für meine Musik). BTW: hat jemand Ineresse an der Schaltung? läuft mit 3-5Volt. Ich habe ja schon mal einen Schaltung diesbezüglich gepostet, die ist allerdings mit Transistoren aufgebaut gewesen und braucht 12Volt und ist minimum 20 Jahre alt. http://www.mikrocontroller.net/forum/read-1-66387.html#66584 (Durchstimmbares Bandpassfilter) Zurück zur FFT Ich brauche eine Sinus/Cosinus-Tabelle. soviel weiss ich schon. Und ich weiss, dass ich die Berechnungen möglichst mit Ganzzahlen rechnen sollte, obwohl FastAVR auch float beherrscht. Ich lese mal noch weiter, vielleicht finde ich ja was in einer Sprache, die ich verstehe. Das Mathlab-Script fand ich eigentlich als Grundlage schon ok. Nur eben: len=length(sig)+2; y=zeros(len,1); yh=zeros(len,1); x=zeros(len,1); x(3:len)=sig; 1.was sind die zeros? Sicher ein Funktion in Mathlab vielleicht die anzahl der Nullstellen im Sample? 2. was bedeutet der Doppelpunkt in x(3:len)=sig; Na denn... Viele Grüße AxelR.
Hi, wenn dir ein aktiv Filter der 2. Ordnung ausreicht und es auch mit ein paar externen Bauteilen aufgebaut werden darf. www.aktivfilter.de Mfg Dirk
Hi, y=zeros(len,1); Verwende selber nur SciLap, da ist der Syntax etwas anderes, aber müste so viel wie "fülle y mit len Nullstellen." heißen. Das heißt du hast ein "Feld" y, welches dann mit y(n) ansprechen kannst ( wie es bei c mit y[n] geschehen würde). Stefan ps: der Rest muß ich mir jetzt nochmals in ruhe durchlesen..
"Ich habe jetzt 4 Bandpässe parallel, dnen ich eine Gleichrichtung und je einen Komparator nachgeschaltet habe. Die liegen an den Portpins und über 4tasten kann ich mich entscheiden, welchen Bandpass ich verwenden möchte." Na gut, ich denke die 4 kannst du durch einen Digitalen ersetzen, muste ja nur andere Parameter laden & Fertig.. "Das geht also wesentlich besser, als mit dem Tiefpass." Wäre doch egal was so ein Filter du verwendest ( ob TP oder BP), aber OK, wenn es mit TP nicht geht ist es ja auch kein Problem ein Bandpass zu machen! "Wobei ich die 4 Bandpässe garnicht wirklich brauche, bin ich ganz erlich, meist nehm ich das dritte (um 750Hz | gilt nur für meine Musik)." Wie gesagt, ich deke es wir sowieso ein mehr oder weniger durchstimmbarer BP.. Ob dein MC wirklich genug leistung hat um eine Filterung über FFT zu machen weiß ich net, sehe ich aber Probleme, Würde eher ein Simplen Butterworth oder was auch immer nehmen! Stefan
Ich halte dein Vorhaben fuer unsinn. Fuer 20-20kHz Audio ist ein AVR mit sicherheit zu langsam. Ob es bei 1kHz, also 2kSamples und 8Bit machbar waer muesste man auch noch pruefen, naehert sich aber wohl schon dem machbaren wenn der Proz sonst nichts zutun hast. Wenn du aber nur mit 2k samplen kannst dann musst du am Eingang deines AD-Wandlers einen entsprechenden und guten Tiefpassfilter haben und den willst du dir jetzt ja sparen. Also was solls? Olaf
@Dirk danke für den Link, ich hatte mir die Sache als Excel Makro geschrieben, um die Bandpassfilter berechnen und dimensionieren zu lassen. Sind auch Filter 2ter Ordnung. Das funktioniert ja auch und davon sind ja schon 4 stk für unterschiedliche Frequenzen in Betrieb. Ich beziehe meine Info's übrigend - genau wie ..HanneS.. - aus meiner Literatursammlung des ehem. Militärverlags der DDR. In diesem Fall "Berechnung und Aufbau aktiver RC-Filter" von H.-J. Kowalski. @Olaf einen Tiefpass habe ich sowieso in der Schaltung. allerdings kein ausgesprochenes Anti-aliasing Filter. Dafür wird er wohl nicht steil genug sein (2ter und3ter Grad hintereinander fo mit 1Khz), aber die Bandpässe + Komparatoren könnte man weglassen. Würde mir schon besser gefallen! Objektiv betrachtet hast Du aber Recht, ganz klar. Der AVR muss sich ja nebenher auch noch um die DMX-Sache kümmern, na mal sehn. Grüße Axel
Während meines Studiums gabs die Aufgabe, einen BPM-Counter zu realisieren. Dazu den Analogteil und für das daran angeschlossene µC-Board die Software zu erstellen Anbei mal der Bericht dazu, vielleicht bringt Dir das irgendwas. Die Idee ist, daß das Basedrumsignal das energiereichste ist. Analogteil: Zuerst den Musik-max-Pegel mittels ALC (automatic-level-control) auf Elektronik-internen Referenzpegel 0dB legen. Mittels Tiefpässe das Signal von höheren Frequenzen befreien. Da jedoch die Frequenz der Basedrum nicht bekannt ist, liegt der max-Pegel nun nicht mehr zwangsläufig bei 0dB. Daher wurde nach den Tiefpässen ne zweite ALC-Stufe mit kleinem Regelbereich eingefügt. Das ganze funktioniert sehr zuverlässig bei verschiedenem Musikmaterial und ruhige Stellen ohne Basedrum führen nicht zu Fehlerauslösungen. Gruß Frank
@beta-frank Danke für deine Hinweise und Erläuterungen. genauso (oder so ähnlich) mache ich das bisher. Die Sache mit der AGC hat mir sehr gefallen, die AGC in meiner Schaltung ist weit komplizierter aufgebaut und funktioniert sicher nicht ganz so gut! Noch eine zweite AGC einzubauen, ist natürlich eine feine Sache. Hier bin hgeute mal einen anderen Weg gegangen. Ich habe dem gleichgerichteten Basssignal (ohne Komparator) noch ein hochpassfilter mit 2Hz Eckfrequenz spendiert, damit stehende Gleichspannungen herausgefiltert. diese nun vorliegende Niderfrequente "Hochrequenz" (>2Hz) habe ich widerum verstärkt und gebe sie nun erst via "Komparator"(Portpin) auf meinen AVR. Das habe ich gerade nebenbei fertig gemacht. Funktioniert ganz gut, aber ich wollte schon versuchen, das alles im Prozessor zu erledigen. Ja Gut, mal sehn was wird. Bis denne Vielen Gruß und besten Dank einstweilen AxelR.
Hi ich denke ein einfaches FIR oder IIR Filter sollte man bei 2kHz Abtastfrequenz und 8Bit Auflösung sollte man in einem AVR mit Hardwaremultiplizierer (also ATMega) hinbringen. Problem ist dann halt das Anti-Aliasing Filter vor dem Eingang das wird man nicht umgehen können. Matthias
Guten Morgen, ich habe mich letzte Nacht über google hergemacht und über den Umweg hier im Forum auf diesen Thread gestossen: http://www.mikrocontroller.net/forum/read-1-120131.html#120702 hätt' ich ja mal gleich im Forum nach "FIR" suchen können... nach diversen Recherchen mit Suchbegriffen aus diesem Thread bin ich dann erst auf einen Korrelator gestossen, bei dem die zu auszusiebende Frequenz mit a) dem sin und b) dem cosin einer Referenzfrequenz multipliziert wird, beide ergebnisse addiert und danach wieder radiziert werden. Auf das radizieren könnte man verzichten, las ich. leuchtet auch ein, da ich ja nicht den genauen Wert der Korrelation brauche, sondern nur einen Schwellwert auswerten möchte. Danach bin auf die FIR-Filterei gestossen. die Lösungs-und Designvorschläge lieferten auf Anfrage immer gleich fertige Koeffizenten, die ich im Quelltext eingeben kann. Sehr bequem, leider kann ich die Frequenz nicht durchstimmbar gestalten, sondern müsste vielleicht mehrere Filter mit unterschiedlichen Eckfrequenzen parallel laufen lassen. Vielleicht pack' ich mir die entsprechenden Koeffizienten für einige interessierende Frequenzen/bereiche in den Flash, mal sehen. DFT und FFT habe ich mir ebenso angesehen, bin ich aber - mangels wissen ob der höheren Mathematik - nicht wirklich durchgestiegen. [Naja, dafür versteh' ich mich auf den Gebrauch kyrillischer Schriftzeichen, hilft mir nur hier nicht viel ;-| ] Alles gesamt trotzdem sehr interessant. Mal was wirklich neues! Nochmals vielen Dank für diesen regen Informationsaustausch. Viele Grüße Axel Kann man das Wort "Viele" auf eine F-Taste legen? ich schreib immer "Vile"
kopier dir das Wort doch in die Zwischenablage. Dann brauchst du nur strg-V (wie _v_iele drücken)... Für die FFT braucht man doch auch wieder eine Sinustabelle (oder habe ich da jetzt wieder was vergessen?) Irgendwo in meinen TI-Unterlagen hab ich da noch einen Algorithmus mit Quasi-Code. Das war mal eine Programmieraufgabe in VB für die Leute im Semester unter mir... Kann ich mal nach suchen, wenn Interesse besteht. Der Algorithmus kommt aus irgendeiner Formelsammlung, frag mich jetzt bloß nicht aus welcher (da wäre Suchen/googlen sinnvoller). Gruß Rahul
Hallo, ich bin jetzt der mit Sicherheit unerfahrenste in diesem Thema, aber eine Ideen habe ich auch dazu, falls es nur um die Musiktakt-Lampenansteuerung geht. Mit einem Schmitt-Trigger aus den Sinussignalen ein Rechtecksignal machen und dann mittels dem Timer die Länge der einzelnen Flankenwechsel messen dadurch kann man doch auf die Frequenz schließen und die Lampen schalten. Evtl. könnte man noch den A/D-Wandler benutzen um die Pegelspitzen festzustellen dieser filtert ja durch seine "Langsamkeit" bei Audiosignalen sowieso die höchsten Frequenzen raus gerade wenn man seinen Taktteiler höher setzt.
<Zitat> dieser ..(ADC).. filtert ja durch seine "Langsamkeit" bei Audiosignalen sowieso die höchsten Frequenzen raus </Zitat> nunja, die hohen Frequenzen werden nicht einfach unterdrückt, sondern sozusagen zu tieferen Frquenzen hin gespiegelt. Diese wiederum würden mir dann einen Frequenz im für mich interessanten Bereich vorgaukeln. Daher muss ja auch ein steiler Tiefpass davor. So wie oben schon eindringlich hingewiesen wurde. Das es aber mit dem Trigger gehen müsste, zeigt mein SSTV-"Modem". Dieses besteht auch nur aus einem Komparator, der aus dem SSTV-Signal ein Rechteck für die serielle Schnittstelle macht. Aber bei diesem Signal liegt zum Zeitpunkt t immer genau eine Frequenz vor und keine Gemisch. Wenn ich also einen weit lautere tiefere Frequenz habe, wird "meine" Frequenz nur auf diese aufmoduliert und ich habe keinen Nulldurchgang... Gruß Axel
Da isser wieder! Mit 99Zeilen QuellCode (mehr gibt mir Herr Invancic mit seiner Demo nicht) hab ich das hinbekommen! Allerdigens nur die FFT und ist auch nicht auf meinem Mist gewachsen. Ich habe eben nochmal rausgesucht, denn ich bin in einem anderen Forum drauf gestossen: http://forum.electronicwerkstatt.de/phpBB/topic20460_f28_bxtopic_timexDESC_by1_bz0_bs15.html#id104662 Das das FastAVR das so kann, hätte ich nicht gedacht! Selbst Sinus und Cosinus, hmmm. Bei Interesse kannich ja den ASM-Quelltext (Jahaa FastAVR spuckt den aus) anhängen. Mit dem FIR-Filter bin ich auch weitergekommen: einem Buffer mit den gesampelten Signalen einen gleichgrossen Buffer mit Konstanten gegenüberstellen und die Werte miteinenader multiplizieren, summe bilden, fertich! Ganz einfach. Nur die Koeffizienten(also die Konstanten im "gegenüberliegenden" Buffer) sind klitzeklein 0,00145678irgentwas , jeh mehr Samples, umso kleiner werden die Dinger. Klar, wenn nachher alles aufaddiert wird... Nur zur Berechnung der Konstanten zu Fuß habe ich nicht durchgesehen, fertige Designprogramme gibt es ja(hab jetzt auch eines). Das FIR-Filter hebe ich mir für die nächsten Wochen auf. Jetz spiel' ich erstmal mit dem FFT-Codegeschnipsel. Nochmal schönen Dank für die Anregungen Axel Rühl
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.