WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rauschen eines Messsignals eliminieren

 

saint
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2009, 16:25     Titel: Rauschen eines Messsignals eliminieren
  Antworten mit Zitat      
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)

Download
 Dateiname:  verrauschtes-signal_verkleinert.png
 Dateigröße:  27.17 KB
 Heruntergeladen:  1582 mal
verrauschtes-signal.png
 Beschreibung:
Plot des Messsignals [Nmm] über die Zeit [s]

Download
 Dateiname:  verrauschtes-signal.png
 Dateigröße:  16.99 KB
 Heruntergeladen:  1534 mal
Private Nachricht senden Benutzer-Profile anzeigen


Idefix_1024
Forum-Century

Forum-Century


Beiträge: 230
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2009, 17:20     Titel:
  Antworten mit Zitat      
ehrlich gesagt sieht das Signal schon recht schlimm aus...

aber vielleicht hilft ja auch ein einfaches Filter... quasi in der Art hier

Code:

% Erzeuge Beispiel-Datensatz
data    = rand(100000,1);
dt      = 10E-3;
t       = (0:1:length(data)-1).*dt;
% -------------------------------------


% Beispiel: Filterung der Daten durch PT1
P                   = 1;
T                   = 100E-3; % Vorsicht! Nicht die Abtastzeit T unterschreiten

% Definition der Übertragungsfunktion P/(Ts + 1)
PT1                 = tf([P],[T 1])

% Diskretisierung der Übertragungsfunktion mit c2d
% auch hier ist die Abtastzeit dt wichtig
[num_int, den_int]  = tfdata(c2d(PT1,dt));


figure()
hold on
plot(t,data,'r')
plot(t,filter(num_int{1},den_int{1}, data'),'m')
xlim([0 1.2])
ylim([0 1.2])
legend('Daten','PT1 als Filter',4)
grid on
 


man kann sich selbst eine Transferfunktion erstellen... die sollte dann eben auf das jeweilige Vorhaben angepasst werden...

aber weil Du ja nen recht langen Zeitverlauf hast und eigentlich nur einen Gleichanteil willst... sollte mein Beispiel schonmal ganz ordentlich wirken
Private Nachricht senden Benutzer-Profile anzeigen
 
saint
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 18.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2009, 21:28     Titel:
  Antworten mit Zitat      
Hallo,


vielen vielen Dank für Deine Hilfe! Very Happy Hier ist der vergleichende Plot zwischen verrauschten und gefilterten Messwerten (zum Vergößern anklicken):




Jetzt musst Du mir noch noch erklären, wie das im Detail funktioniert Rolling Eyes

verrauschtes-signal-filtered-pt1_small.png
 Beschreibung:
Plot des verrauschten Signals im Vergleich zum gefilterten Signal (verkleinert)

Download
 Dateiname:  verrauschtes-signal-filtered-pt1_small.png
 Dateigröße:  17.08 KB
 Heruntergeladen:  1551 mal
verrauschtes-signal-filtered-pt1.png
 Beschreibung:
Plot des verrauschten Signals im Vergleich zum gefilterten Signal

Download
 Dateiname:  verrauschtes-signal-filtered-pt1.png
 Dateigröße:  12.86 KB
 Heruntergeladen:  1567 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Idefix_1024
Forum-Century

Forum-Century


Beiträge: 230
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2009, 10:18     Titel:
  Antworten mit Zitat      
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...

freut mich wenn mein Code was hilft...
Private Nachricht senden Benutzer-Profile anzeigen
 
hackhuebi
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 28.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2015, 10:24     Titel:
  Antworten mit Zitat      
hallo,
wie initiaisiere ich den filter beispielsweise auf den wert 1?

vielen dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 25.07.2015, 08:05     Titel:
  Antworten mit Zitat      
Hallo,

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?
if mod(nfft,2) == 0;
    k = (nfft/2) + 1;
else
    nfft = nfft + 1;
    k = (nfft/2) + 1;
end

fn = fa/2; % Nyquistfreq.
df = fa/nfft; % Frequenzauflösung des Spektrums
% Frequenzvektor: Darstellung bis Nyquistfreq.
fv = 0: df : fn;

sig = signal(:);

% Fensterung
if window == 1
    win = hann(nfft); % Hanning Fensterfunktion
    sig_win = sig .* win * nfft / sum(win); % Fensterung mit Amplitudenkorrektur
    sig = sig_win;
end

% Signal transformieren
Fy = fft(sig,nfft);
 
%   Betrag - nur positives Freq.spektrum
if scale == 0
    Fy_pos0 = abs(Fy(1:k));

    %   Skalierung  
    mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];
else % nicht durch nfft teilen bei Impulsantwort
    mag = abs(Fy(1:k));
end

% Umrechnung in dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
 


Schau dich einfach mal nach diesem Thema hier im Forum um und dann werden wohl schon viele deine Fragen beantwortet.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 25.07.2015, 08:36     Titel:
  Antworten mit Zitat      
Sorry,

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);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
hackhuebi
Forum-Anfänger

Forum-Anfänger


Beiträge: 24
Anmeldedatum: 28.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.07.2015, 10:24     Titel:
  Antworten mit Zitat      
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

% Definition der Übertragungsfunktion P/(Ts + 1)
PT1                 = tf([P],[T 1])

% 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);


f1=filter(num_int{1},den_int{1},y1');
f2=filter(num_int{1},den_int{1},data_init');

figure('NumberTitle','off','Name','Kraft-Zeit','units','normalized','outerposition',[0 0 1 1]);

[hAx,H1,H11] = plotyy(x,y1,x,temp);
H2=line(x,f1,'Parent',hAx(1),'LineWidth',1,'LineStyle','-','Color','r');
H3=line(x,f2,'Parent',hAx(1),'LineWidth',1,'LineStyle','-','Color','g');
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.