www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik peakfilter im AVR?


Autor: AxelR. (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: AxelR. (Gast)
Datum:

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

Autor: Stefan1 (Gast)
Datum:

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

Autor: AxelR. (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

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

Autor: Stefan1 (Gast)
Datum:

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

Autor: Stefan1 (Gast)
Datum:

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

Autor: Olaf (Gast)
Datum:

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

Autor: AxelR. (Gast)
Datum:

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

Autor: beta-frank (Gast)
Datum:
Angehängte Dateien:

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

Autor: AxelR. (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: AxelR. (Gast)
Datum:

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

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"

Autor: Rahul (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: AxelR. (Gast)
Datum:

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

Autor: AxelR. (Gast)
Datum:
Angehängte Dateien:

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

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

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.