Verfasst am: 19.03.2015, 11:28
Titel: FIR Filter: Zeitachse und Amplitude nicht wie erwartet
Hallo Community,
nachdem ich meine letzten drei Threads alle wieder nach kurzer Zeit löschen konnte, habe ich nun ein Programm stehen und würde gerne wissen, ob ich irgendwo einen Fehler übersehen habe.
Grundsätzlich habe ich eine verrauschte Stufenfunktion und möchte diese so filtern, dass ich am Ende eine definierte Stufe habe. Das alles soll im Zeitbereich geschehen. Dies ist mir auch soweit gelungen. Allerdings hadere ich dabei noch etwas mit der Amplitude und warum das Ergebnis verschoben ist. Bin mir nicht ganz sicher, ob das so stimmen kann.
Es würde mich sehr freuen wenn Ihr mal einen blick drauf werft und mir verratet, ob alles soweit passt oder es noch korrekturen geben muss.
Die Zeitachse ist mir gerade gelungen, lediglich die Zeitverschiebung ist mir noch nicht ganz klar. Und natürlich das Amplitudenproblem..
Gelöst habe ich das indem ich in den Faltungsbefehl noch den Zusatz 'same'
reingebracht habe dank der Matlab-Hilfe. Dadurch gibt Matlab nur den Hauptteil der Faltung zurück mit der selben Grösse wie u:
wenn ich deinen Code richtig verstehe, wandelst du die Impulsantwort eines Filters in den Frequenzbereich und dividierst ihn mit dem Signalspektrum. Aber was soll das bewirken? Würde hier eine Multiplikation statfinden, entspräche dies einer Faltung (= Filterung des Signal als Äquivalent zu conv im Zeitbereich)
Zur Amplitude...ich würde den Faktor 1/cut_nfft einfach weglassen. Und zwar sowohl bei fft als auch bei ifft.
Die Verschiebung kommt durch das Filter. Jedes Filter hat ein Delay, um den das Ausgangsignal um den Delay nach rechts verschoben ist. Bei einem FIR ist das Delay einfach die Filterlänge, weshalb du bei dem fir1 9. Ordnung einfach um 9 Messwerte wieder nach links verschieben musst. Oder du nutzt statt conv, filtfilt. Das macht den delay rückgängig in dem das Signal bei einer 2. Filterung einfach rückwärts ins Filter geladen wird. Das wäre natürlich auch mit conv möglich. Filtfilt macht es aber automatisch und hat auch nicht den Output der Faltung:
output[m+n-1] = signal[m] * impuls_filter[n]
So lautet nämlich das Faltungstheorem in Bezug auf die Länge des Outputvektors.
Das mit dem 1/cut_nfft hab ich auch jetzt weggelassen und mir ist jetzt auch klar das die Verschiebung durch den Filter natürlich kommt. Ich probiere mal filtfilt und schaue was bei rumkommt, oder verschiebe es einfach.
Aber jetzt darf ich das ganze in C/C++ umprogrammieren und leider habe ich kaum Erfahrung darin. Naja, das ist ein anderes Thema
Nachdem ich nun meinen obiges Skript mit dem gesamten Signal testen wollte, also nicht mehr nur Laenge von 351 Stellen, sondern 1000,
zerschiesst sich mein Filter totat bzw macht nicht mehr das was er soll.
Ich wäre sehr sehr froh, wenn mir jemand sagen kann, warum das passiert.. ich sitze schon den ganzen morgen dran und habe leider gerade keine Ahnung. Normalerweise sollte doch mindestens Ansatzweise das Rechtecksignal rauskommen..
Wie schon gesagt ist eine Multiplikation mit der Impulsantwort des Filters im Frequenzbereich = eine Faltung im Zeitbereich.
Eine Division ist dann eigentlich die Umkehrfunktion (Deconvolution). Teile ich z.B. die Sprungantwort eines Filters durch dessen Impulsantwort, erhält man das Eingangssprungsignal. Somit wurde die Faltung rückgängig gemacht. Wenn das gewünscht ist, warum wird dann anschließend nochmal eine Faltung im Zeitbereich durchgeführt?
Allerdings muss man bei Conv/Deconv unbedingt die Längen des Faltungstheorems berücksichtigen, ansonsten führt man eine zyklische statt einer linearen Faltung durch und das Ergebnis ist damit falsch.
Den Faktor 1/k würde ich definitiv bei FFT/IFFT weglassen.
Ansonsten kann ich dir nicht weiterhelfen, ohne genauere Erklärung deines Codes. Ausführen kann ich ihn leider nicht, da mit die Daten fehlen.
Wobei mir schon klar ist, was du bis zu der Division im Freq.-bereich machst.
Ich bin gerade nochmal was Theorie durchgegangen und
ich denke meine Entfaltung ist zu naiv.
Aber zuerst versuche ich mal zu erklären, was ich damit bewirken will bzw. was ich mit meinem Programm anstellen will:
Ich benötige lediglich einen simplen Tiefpassfilter, wie im Programm zu sehen ist, um das Rauschen aus meinem Signal zu bekommen.
Das ganze soll später im Zeitbereich passieren. Da es hier um Messrauschen geht, also Rauschen welches dem Messinstrument inne ist, will ich eine Correction-Funktion erstellen, womit ich später jedes Signal, welches durch die Messeinrichtung kommt, vom Rauschen befreien kann (Alles im Zeitbereich, deshalb ist die Faltung im Programm, nur damit ich sehe obs klappt oder nicht. Später soll nur noch die Faltung im Zeitbereich mit der Correction_Funktion im Programm sein).
Dafür ist die Entfaltung gedacht.
Jedoch verstärke ich hiermit nur mein Rauschen und bekomme dadurch wahrscheinlich ein falsches Ergebniss, wenn ich mein Signal mit der Correction_Funktion im Zeitbereich falte.
Ich hoffe ich konnte mein Vorhaben einigermassen rüberbringen.
Da es hier um Messrauschen geht, also Rauschen welches dem Messinstrument inne ist, will ich eine Correction-Funktion erstellen, womit ich später jedes Signal, welches durch die Messeinrichtung kommt, vom Rauschen befreien kann
Sorry, aber das verstehe ich immer noch nicht. Wozu die Correction-Funktion wenn es das Filter zum Entrauschen gibt?
Mal ein kleines Bsp. für die Faltung und Inverse Faltung
Du musst also VOR der FFT schon das Eingangsignal und die Filter_Impulsantwort auf die Länge m+n-1 durch Anhängen von Nullen bringen. Nur dann entspricht die Multiplikation im Freq.-bereich der linearen Faltung im Zeitbereich.
Inverse Faltung: Auch hier muss die Länge der Vektoren beachtet werden. Das Eingangsignal (der Sprung) hat 1000 Messwerte. Damit bei der inv. Faltung ebenso diese 1000 Messwerte herauskommen, muss also das Ausgangsignal und die Impulsantwort schon die Länge m+n-1 haben. Wieder durch Anhängen von Nullen.
Leider hab ich gerade selber die Idee hinter meiner "Correction_Funktion" verloren und muss da nochmal genauer drüber nachdenken.
Jedenfalls werde ich jetzt erstmal versuchen die genannten Hinweise umzusetzen und nachzuvollziehen.
Mal sehen ob ich es so hinbekomme wie ich es gern haben würde
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.