Forum: Digitale Signalverarbeitung / DSP / Machine Learning Bandpass Filter programmieren


von Michi (Gast)


Lesenswert?

Guten Tag,

ich habe eine Frage. Ich muss im Rahmen meiner Bachelor Thesis eine 
Frequenzanalyse eines Gitarrensignals durchführen. Ich habe dies bereits 
mit einer FFT gemacht. Jetzt ist es daran dies mit einem digitalen 
Bandpass Filter (FIR) zu machen. Um ein vergleich der Lösungen zu 
ziehen.

Jetzt zu meiner Frage. Ich steige nicht so ganz dahinter wie ich auf die 
Filterkoeffizienten komme. Ich habe zwar einige Internetseiten gefunden, 
die mir diese Berechnen aber ich soll auch wissen woher diese kommen.

Eine weitere Frage ist, wie soll der Filter aussehen, ich will immer nur 
ein kleinen Frequenzbereich filtern. So z.B. 128Hz bis 132Hz.

Wieviel Koeffizenten brauche ich dazu?

Zusatzinfos:

Abtastfrequenz 8Khz
Hamming Fensterung 512ms (Wenn weniger gehn, dann umso besser)

Ich schreibe das Programm in Java.

Ich danke für eure Hilfe. Ich bin total neu auf dem Gebiet. ich versuch 
mir das ganze Thema beizubringen.

Mfg

Michi

von Gim (Gast)


Lesenswert?

Die Anzahl deiner Koeffizienten haengt von der Ordnung Deines Filters 
ab. Die Ordnung Deines Filters hängt von Deinen Vorgaben ab (dazu zählen 
nicht nur obere und untere Grenzfrequenz sondern auch Angaben darüber, 
wie steil der Übergang zw. Sperr- und Durchlassbereich sein soll, und 
wie das Signal im Durchlassbereich aussehen soll.) - Dazu gibt es 
verschiedene Filtermodelle mit jeweiligen Eigenschaften. Du suchst Dir 
den Filtertyp raus, der Deiner Aufgabenstellung am besten entspricht und 
berechnest anhand der vorhandenen Formel fuer die Koeffizienten des 
Filters diese, oder lässt das erledigen von einem 
Filter-Berechnungstool.

von gamon (Gast)


Lesenswert?

Hi also die IIR Filter werden durch Bilineare Approximations und FIR 
durch Fourierreihe berechnet.
Die steilenn Flanken der Filter lassen sich vielbesser oder eher 
einfacher mit IIR Filter berechnen. Und noch etwas FFT ist kein Filter 
damit stellt man nur Spektrum dar.

von Michi (Gast)


Lesenswert?

Zur FFT: ich weiß das dies das Frequenzspektrum darstellt und ich habe 
dies schin umgesetzt.

Jetzt soll ich das ganze mit Filtern machen zum Verglecih.

Also woran erkenne ich das ein Filter geeignet ist für mich?

Und wie definiere ich wie das Signal aussehen soll?

Meine Vision ist, das ich 36 Filter habe(jeweils einen für jeden 
Frequenzbereich des Gitarrenhalses) an denen ich sehen kann wie stark 
dieser Bereich vertreten ist.

Dann pick ich mir die mit dem stärksten Ausschlag raus und dann weiß ich 
aus welchen Noten es besteht.

MFG

Michi

von max (Gast)


Lesenswert?

ahmmmm die Koeffizienten würde ich mir mit Matlab generiere.... Simulink 
oder so! das geht ziemlich schnell und die Koeffs kannst du dir als .dat 
File exportieren.

lg

von Olaf (Gast)


Lesenswert?

> Und wie definiere ich wie das Signal aussehen soll?

Das definierst du, und zwar durch goettlich ingenieurmaessige Eingebung.

Soll heissen du zeichnest dir den Durchlassbereich deines Filters 
einfach auf. Dabei kannst du dich natuerlich von gewissen Annahmen 
leiten lassen. Zum Beispiel der Frage wie stark du dein Signal im 
Stopband fuer eine einwandfreie Funktion deiner Schaltung absenken 
musst.

Dann kannst du eventuell noch ein paar Zusatzueberlungen anstellen. Zum 
Beispiel wie wellig dein Durchlassbereich sein darf. Danach ueberlegst 
du dir dann welcher Filtertyp von welcher Ordnung da reinpasst. Und wenn 
du das hast, dann kannst du dir Gedanken ueber die Koeffizienten machen.

Olaf

von gamon (Gast)


Lesenswert?

>Das definierst du, und zwar durch goettlich ingenieurmaessige Eingebung.

hehehehe,

finde ich echt gut :-)

Wie schon gesagt schaue dir das Thema Filter-Approximation an.

von Michi (Gast)


Lesenswert?

Hey danke für die Antworten. ich werd es mir mal anschauen! Hab jetzt 
mal ein FIR Filter 
gebaut.(http://upload.wikimedia.org/wikipedia/commons/c/ca/Fir_filter_df2.png) 
Hab mal ne Ordnung von 40 genommen. Jedoch weiß ich jetzt nicht wie ich 
die Ergebnisse Interpretieren soll.

Hier ein beispiel:
Cosinus 16 Abgetastwerte x[1,0,-1,0,1,0-1,...]

Koeffizienten für Bandpas 128 bis 132Hz Ordnung 8:

Ko0: -0.005102130524710351
Ko1: -0.015190777612156531
Ko2: 0.04261212710787802
Ko3: 0.2643917172251824
Ko4: 0.4155
Ko5: 0.2643917172251824
Ko6: 0.04261212710787802
Ko7: -0.015190777612156531
Ko8: -0.005102130524710351


Als Ergebnis bekomme ich nach FIR Filter:
y0: -0.005102130524710351
y1: -0.015190777612156531
y2: 0.04771425763258837
y3: 0.27958249483733894
y4: 0.36778574236741157
y5: -0.015190777612156531
y6: -0.32517361525953353
y7: -5.204170427930421E-18
y8: 0.3200714847348232
y9: 5.204170427930421E-18
y10: -0.3200714847348232
y11: -5.204170427930421E-18
y12: 0.3200714847348232
y13: 5.204170427930421E-18
y14: -0.3200714847348232
y15: -5.204170427930421E-18
Was sagt mir das Ergebnis über die Frequenz aus:
Sollte noch etwas fehlen dann werde ich dies nachreichen.

Folgende Formeln wurden benutzt:

w0 = 0.5 * Math.PI * (m_FreqLow + m_FreqHigh) / m_Abtastrate;
w1 = 0.5 * Math.PI * (m_FreqHigh - m_FreqLow + filterband) / 
m_Abtastrate;

coeff[m-i]=Math.sin(i*w1)*Math.cos(i*w0)*hamming[i]/(i*Math.PI);

Gefenstert wurde mit einem Hamming Fenster. Ich habe diese Formeln aus 
einem Beispielprogramm jedoch kann ich diese keinem Filtertyp zuordnen. 
Kann mir da jemand helfen?

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
Noch kein Account? Hier anmelden.