LabVIEWForum.de
Filter selbst erstellen - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Filter selbst erstellen (/Thread-Filter-selbst-erstellen)

Seiten: 1 2


Filter selbst erstellen - creo_123 - 18.04.2013 12:27

Hallo,

ich möchte einen Filter selbst erstellen. Grund: Das Filter-Vi in Labview sperrt Frequenzen komplett.. ich möchte bestimmte Frequenzen aber nur
abschwächen. Habe mal einen Screenshot angehängt, wie ich mir das vorstelle. Zuerst wandel ich mein Signal-Array mit einer FFT in den Frequenzbereich
um. Dann multipliziere ich die Frequenzen, die kleiner als ein bestimmter Wert sind in einem Case mit 0,5, um diese abzuschwächen, alle anderen lasse
ich unverändert durch. Anschließend möchte ich mit einer inversen FFT wieder in den Zeitbereich.

Habe aber irgendwie ein Problem mit den Datentypen. Also hatte eigentlich gehofft, dass mir der FFT Block dann auch wieder ein normales Array ausgibt mit dem
ich weiterarbeiten könnte.

Schonmal im Vorraus Danke für Tipps oder AnregungenSmile


RE: Filter selbst erstellen - Kasi - 18.04.2013 13:02

Ich erklär's mal in Worten, weil ich gerade nichts zu programmieren da habe, ich hoffe, es ist nachvollziehbar (sehr viel detailierter findest du das auch hier):

Versuch mal ohne das Express-VI mit den Grundfunktionen auszukommen (Signal Processing => Transforms ==> FFT bzw. inverse FFT)
Hier bekommst du direkt die komplexe FFT geliefert, wobei die einzelnen Punkte einen Frequenzabstand von "Sampling Rate / Samples" haben.
Das ganze ist dann ein um die Mitte gespiegeltes komplexes Frequenzspektrum. Dich interessiert nur die Amplitude, also kannnt du über Numeric => Complex => Complex to polar an den Radius rankommen.
Hier willst du jetzt alle Frequenz unter einem bestimmten Bereich abschwächen, also gehst du den Array-Radius durch und solange "Frequenzabstand * Laufindex < Highpassfrequenz" wendest du deinen Faktor an. Das gleiche musst du am Ende machen, wobei dann "Frequenzabstand * Laufindex > (Array-Länge - 1)* Frequenzabstand - Highpassfrequenz" sein muss.
Nachdem du den Radius-Array so korrigiert hast kannst du ihn wieder mit dem Winkel -Array über "Polar to complex" als komplexe Funktion zusammenfügen und mittels inverse FFT rücktransformieren. Wahrscheinlich wird der harte Sprung bei der Highpassfrequenz für ein paar unschöne Nebeneffekte sorgen.


RE: Filter selbst erstellen - GerdW - 18.04.2013 16:13

Noch eine Erklärung:
Kontexthilfe öffnen und mit dem Mauszeiger auf den Draht gehen. dann siehst du nämlich, welcher Datentyp im Draht steckt...


RE: Filter selbst erstellen - Lucki - 19.04.2013 09:03

Der Datentyp ist ein Cluster, enthaltend fo, df und den Daten-Array. Wenn du mit dem Datenarray etwas machen willst, mußt Du ihn aus dem Cluster selektieren. Danach kannst Du ihn wieder in den Cluster reintun:
[attachment=44401]
Ob Du allerdingss mit Deinem Vorhaben glücklich werden wirst, steht auf einem anderen Blatt. Aber das war ja nicht Deine Frage...


RE: Filter selbst erstellen - creo_123 - 19.04.2013 10:00

Hey, danke für die Antworten..

wieso könnte ich denn damit nicht glücklich werden, bzw. gibt es eine sinnvollere Lösung?

Ich versuche das Rastmoment von Motoren zu bestimmen. Das Problem dabei ist, dass dem eigentlichen
Signal ein Sinus unterlagert ist, der sich durch eine leicht außermittige Einspannung des Motors
erklärt. Ich habe bis jetzt noch nicht viel mit Filtern gearbeitet. Mit einem normalen Hochpass, der
die unteren Frequenzen komplett blockiert, funktioniert es nicht, weil mir auf diesem Weg das ganze
Signal verfälscht wird. Deshalb wollte ich mir jetzt selbst einen Filter "bauen", der diese Frequenzen nur
abschwächt, also nicht ganz blockiert.

Ein anderes Verständnisproblem habe ich noch mit dem Array an sich.. da stehen ja jetzt nur die Y-Werte, also
das Moment drin. Darauf wende ich den Filter an. Der Filter hat aber ja so gar keine Informationen über die X-Achse.
Ich plotte mein Signal auch nicht über die Zeit sondern über die Position (0 bis 360°). Kann das dann
überhaupt funktionieren oder würde es etwas bringen zusätzlich die Zeit während der Messung mit aufzunehmen?


RE: Filter selbst erstellen - creo_123 - 22.04.2013 08:29

(18.04.2013 13:02 )Kasi schrieb:  Ich erklär's mal in Worten, weil ich gerade nichts zu programmieren da habe, ich hoffe, es ist nachvollziehbar (sehr viel detailierter findest du das auch hier):

Versuch mal ohne das Express-VI mit den Grundfunktionen auszukommen (Signal Processing => Transforms ==> FFT bzw. inverse FFT)
Hier bekommst du direkt die komplexe FFT geliefert, wobei die einzelnen Punkte einen Frequenzabstand von "Sampling Rate / Samples" haben.
Das ganze ist dann ein um die Mitte gespiegeltes komplexes Frequenzspektrum. Dich interessiert nur die Amplitude, also kannnt du über Numeric => Complex => Complex to polar an den Radius rankommen.
Hier willst du jetzt alle Frequenz unter einem bestimmten Bereich abschwächen, also gehst du den Array-Radius durch und solange "Frequenzabstand * Laufindex < Highpassfrequenz" wendest du deinen Faktor an. Das gleiche musst du am Ende machen, wobei dann "Frequenzabstand * Laufindex > (Array-Länge - 1)* Frequenzabstand - Highpassfrequenz" sein muss.
Nachdem du den Radius-Array so korrigiert hast kannst du ihn wieder mit dem Winkel -Array über "Polar to complex" als komplexe Funktion zusammenfügen und mittels inverse FFT rücktransformieren. Wahrscheinlich wird der harte Sprung bei der Highpassfrequenz für ein paar unschöne Nebeneffekte sorgen.

Danke für die Ausführliche ErklärungSmile Ich versuche das gerade nachzubauen.. allerdings verstehe ich das mit dem Frequenzabstand und "Sampling Rate / Samples" nicht.. dachte, dass ich die irgendwo in dem FFT-Block vorgeben kann, aber da ist kein entsprechender Eingang..
In meinem Programm selbst habe ich keine vorgegebene Sampling Rate, weil ich meine Messwerte nicht zu bestimmten Zeiten, sondern an bestimmten Positionen aufnehme.. und die Zeit die zwischen zwei Messpunkten liegt, spielt für mich ja auch keine Rolle.. also mein Signal sieht genau gleich aus, egal, ob ich alle 2 Sekunden oder alle 10 Minuten einen Messwert aufnehme, da ich messe wenn der Rotationstisch steht.


RE: Filter selbst erstellen - Kasi - 22.04.2013 14:04

(22.04.2013 08:29 )creo_123 schrieb:  allerdings verstehe ich das mit dem Frequenzabstand und "Sampling Rate / Samples" nicht.. dachte, dass ich die irgendwo in dem FFT-Block vorgeben kann, aber da ist kein entsprechender Eingang..

Sorry wegen der entstandenen Verwirrung, ich hatte das direkt auf Zeit <-> Frequenz Information umgemünzt, bei der man ein kontinuierliches Signal mit einer festen Frequenz aufnimmt. Aber trotzdem musst du auch in deinem Fall "selbst wissen", was der Abstand des späteren FFT-Arrays ist. Im einfachsten Fall ist das dann sowas wie ... Geschwindigkeit? Impuls?... den du aus der reziproken Position bekommst. Gedanklich steige ich da leider immer recht schnell nach dem ersten "das ist was inverses"-Gedanken aus.


RE: Filter selbst erstellen - creo_123 - 23.04.2013 06:46

Die Verwirrung wäre so oder so entstandenWink hast mir echt sehr geholfen mit deiner ausführlichen Antwort!!

Nochmal zur Sample Rate.. ich nehme alle 0,3° einen Messwert auf.. eine Messung geht über eine komplette Umdrehung,
also 360°. Am Ende der Messung habe ich dann ein Array mit 1200 Messwerten.

Die Zeit spielt wie gesagt, meiner Meinung nach, keine Rolle. Nur verstehe ich halt einfach nicht wie ich ohne Zeitbezug auf die
Sample Rate, die ja eigentlich eine Frequenz ist, komme.

Vielleicht hat ja noch jemand eine Idee, wie ich mir das sinnvoll berechnen kann.. wäre für etwas Hilfe sehr dankbar..


RE: Filter selbst erstellen - GerdW - 23.04.2013 08:22

Hallo creo,

du nimmst nicht zeitbasiert Samples, sondern positionsbasiert...

Du hast folgende Optionen:
- zu jedem Sample eine Zeit speichern...
- mit einer mittleren Samplefrequenz arbeiten (und Drehunförmigkeiten ignorieren/tolerieren): f=1200/(Zeit für eine Umdrehung)...


RE: Filter selbst erstellen - creo_123 - 23.04.2013 11:47

Hallo Gerd,

zu jedem Sample eine Zeit speichern, würde ich mit relativ wenig Aufwand hinbekommen..

Ich habe mal einen Screenshot von meinem Filter, den ich nach Kasi's Anleitung erstellt habe, angehängt. Zur Zeit
ist die Sample Rate noch als Bedienelement ausgeführt. Zustäzlich habe ich auch noch das eigentliche Signal und
das dazugehörige, mit der FFT erstellte Spektrum angehängt.

Mein Problem ist, dass ich bei dem Spektrum keinen Frequenz Bezug habe. Die Werte auf der x-Achse (0 bis 1200) entsprechen
der Anzahl der Messungen. Laut Kasi müsste ich Laufindex*Sample Rate rechnen, um die Frequenzen zu erhalten. Aber wie
kann ich das einbauen, wenn ich nicht von einer konstanten Sample Rate (ich nehme ca. alle 0,2 Sekunden einen Wert auf)
ausgehe, sondern die Zeit für jedes Sample zusätzlich speichere?