Verfasst am: 18.09.2009, 15:25
Titel: Rauschen eines Messsignals eliminieren
Hallo,
durch ein Experiment mit einem Sensor, der mit 800 Hz abtastet, bekomme ich den in der Grafik erkennbaren Signalverlauf (vergrößerte Version durch Klick auf das Bild).
Die Abszisse stellt dabei die Zeit in Sekunden, die Ordinate den Messwert in Nmm dar. Im Zeitraum von 0 - 100 und 120 - 150 s weiß ich, dass der Messwert 0 sein sollte. Die Ausschläge zwischen ~ 0,3 bis -0,4 Nmm sind also das aufgezeichnete Rauschen des Sensors.
Leider kenne ich mich mit der Signalverarbeitung nicht aus, so dass ich hoffe, hier Hilfe zu finden.
Ich möchte das Rauschen aus dem Signal entfernen -- weiß aber leider nicht wie. In mehreren Büchern hatte ich mich deshalb mit dem Filtern und Fouriertransformation beschäftigt, leider finde ich das aber zu unüberschaubar, wenn man bisher noch nichts davon gehört hat.
Bis jetzt habe ich versucht, eine Fouriertransformation über das Signal laufen zu lassen und damit die für das Hauptsignal, das in dem Fall eine Frequenz von 0 Hz haben dürfte, zu ermitteln und mir einen Filter über die Signal Processing Toolbox zu bauen, der alle Frequenzanteile oberhalb von 0 Hz abschneidet. Damit hatte ich leider nur mäßigen Erfolg.
Kann mir jemand erklären, wie ich zu meinem Ziel komme, das Rauschen von diesem Signal zu entfernen und einen weitestgehend stabilen Messwert um 0 herausbekommen kann?
Wenn das dann einmal geschafft wurde, kann ich die beschriebene Methode dann auch auf die gesamte Messreihe, d.h. Zeitpunkte, zu denen ich den waren Messwert nicht kenne, anwenden?
Ist hierfür eine Fouriertransformation notwendig? Wenn ja, was erkenne ich aus ihr bzgl. der Störungen?
Für Hilfe wäre ich sehr dankbar.
Mit besten Grüßen
saint
verrauschtes-signal_verkleinert.png
Beschreibung:
Plot des Messsignals [Nmm] über die Zeit [s] (verkleinert)
wie gesagt, das Einzige auf das Du aufpassen solltest ist, dass die Eckfrequenz T des Filters ca 10 mal so groß oder besser noch größer als Deine Abastfrequenz dt ist...
und das gefilterte Ergebnis muss erst einschwingen außer Du initialisierst das Filter mit dem Wert auf den es hinschwingen soll...
ich bezweifel das ein PT1 schon wirklich das Maximum eines optimalen Filters für deine Ansprüche ist. Ein PT1 hat gerade mal eine Dämpfung von -20dB/Dekade nach der Grenzfrequenz. Da gibt es deutlich leistungsfähigere Filter.
Allerdings beginnt die Filterauswahl und die Ermittlung der richtigen Filterparameter immer im Frequenzbereich, sprich du benötigst zumindest das Amplitudenspektrum deines Signals. Auf diesen Sachverhalt weise ich beim Thema Filterung immer wieder hin. Es gibt hier im Forum einige Threads zu dem Thema, wo auch immer wieder eine Funktion von mir gepostet wurde, mit der sich das Frequenzspektrum erstellen lässt.
Code:
function[mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa, window, scale) % Input: % Signal im Zeitbereich % nfft = Anzahl Messwerte für fft % wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch % fa = Abtastfreq. % window: 1 = Fensterung mit Hanning window % scale: 0 = keine Impulsantwort als Eingang, 1 = Impulsantwort % Output: % Magnitude des Spektrums linear und dB skaliert % Frequenzvektor fv in [Hz] von 0...fa/2
% un-,gerade Anzahl Messwerte? ifmod(nfft,2) == 0;
k = (nfft/2) + 1;
else
nfft = nfft + 1;
k = (nfft/2) + 1;
end
ich habe jetzt erst gesehen, dies ein alter Thread ist. Zukünftig bitte einen eigenen Thread nutzen, wenn die Frage nicht direkt zum Thread gehört.
Die einfachste Methode der Intialisierung des Filters ist durch Anführen vom Initwert vor dem eigentlichen Signal.
Code:
% Diskretisierung der Übertragungsfunktion mit c2d % auch hier ist die Abtastzeit dt wichtig [num_int, den_int] = tfdata(c2d(PT1,dt));
Filter_order = 1;
% Filter init mit dem Wert 1 % es müssen so viele Werte angeführt werden, wie die Filterordnung
data_init = [ones(Filter_order,1); data];
% Filtern
data_filt = filter(num_int{1},den_int{1}, data_init') % 1er wieder löschen
data_filt = data_filt(Filter_order+1:end);
moin,
danke dir für die hilfe. bei zeiten versuche ich auch nochmal einen besseren filter, allerdings wäre ich momentan schon froh, den PT1 zum laufen zu bekommen.
den filter ohne initialisierung habe ich zum laufen bekommen. nutze ich jedoch deinen zusätzlichen code, gibt er mir den fehler aus, dass die vectoren die selbe länge haben müssen. oder wende ich ihn einfach falsch an?
Code:
A=[x y1 y2 y3 y4 y5 y6 y7 y8 y9 y10 temp];
windowSize = 5;
P = 1;
T = 50 % Vorsicht! Nicht die Abtastzeit T unterschreiten
% Diskretisierung der Übertragungsfunktion mit c2d % auch hier ist die Abtastzeit dt wichtig [num_int, den_int] = tfdata(c2d(PT1,dt));
Filter_order = 1;
% Filter init mit dem Wert 1 % es müssen so viele Werte angeführt werden, wie die Filterordnung
data_init = [ones(Filter_order,1); y1];
% Filtern
data_filt = filter(num_int{1},den_int{1}, data_init');
% 1er wieder löschen
data_filt = data_filt(Filter_order+1:end);
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.