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

Signal vom Rauschen befreien mit fft -> gauss filter ->

 

ElBarto85
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2015, 21:00     Titel: Signal vom Rauschen befreien mit fft -> gauss filter ->
  Antworten mit Zitat      
Hallo,

ich habe im Anhang ein Referenzsignal angehängt, welches ich nun sauber darstellen möchte, also ohne das Rauschen.

Dazu erzeuge ich zunächst den Frequenzgang:
Code:


% Daten.txt in Matrix laden
Matrix = tdfread('daten.txt', '\t')


% ---------------------------
% Fast Fourier Transformation
% ---------------------------

fa = 10000000   % Abtastfrequenz
nfft = 10000    % FFT Länge
f = (0:nfft/2-1) * fa/nfft

FFT = fft(Matrix.Referenzmessung, nfft)
FFT = FFT(1:nfft/2)
FFT_Betrag = abs(FFT) % Nur Betrag des FFT-Spektrums auswählen
 


Diesen glätte ich über den Gauss Filter
Code:

bt = .3
o = 8
n = 2
h = gaussfir(bt,n,o)
signal_gefiltert = conv(FFT, h)
 



Dann erzeuge ich den inversen FFT und versuche das Signal nun darzustellen

Code:

y = ifft(signal_gefiltert)

plot(abs(y))
 


Da kommt dann leider nur Quatsch raus.
Das gefilterte Signal befindet sich ebenfalls im Anhang


Wo ist mein Denkfehler?

Ich hoffe ihr könnt mir helfen.

Viele Grüße
Stefan

Gefiltertes Signal.jpg
 Beschreibung:
Gefiltertes Signal

Download
 Dateiname:  Gefiltertes Signal.jpg
 Dateigröße:  35.36 KB
 Heruntergeladen:  760 mal
daten.txt
 Beschreibung:
Die Daten zum Referenzsignal

Download
 Dateiname:  daten.txt
 Dateigröße:  186.11 KB
 Heruntergeladen:  705 mal
Referenzsignal.jpg
 Beschreibung:

Download
 Dateiname:  Referenzsignal.jpg
 Dateigröße:  15.58 KB
 Heruntergeladen:  807 mal
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: 08.05.2015, 12:03     Titel:
  Antworten mit Zitat      
Was genau erzeugt denn die Funktion?

Code:
h = gaussfir(bt,n,o)


Kann sie in der Matlab Doku nicht finden. Ist h die Impulsantwort?

Dann wäre es unnötig das Signal zunächst in den Frequenzbereich zu transfomieren. Die Filterung kann im Zeitbereich erfolgen, durch die Faltungsfunktion

Code:

signal = Matrix.Referenzmessung; % Signal im Zeitbereich?
h = gaussfir(bt,n,o); % Filterimpulsantwort
signal_filt = conv(signal,h); % Faltung von Signal mit Filter
 


Die Faltung im Zeitbereich entspricht einer Multiplikation im Freq. Bereich. Daher ist es auch falsch die conv Funktion im Freq.-bereich anzuwenden. So erfolgt die Faltung im Freq.-bereich:

Code:

function output = FFT_Faltung(sig1, sig2)
% Die Funktion führt eine schnelle Faltung mittels FFT aus
% Input:
% sig1 = Messsignal
% sig2 = Filter-Impulsantwort
% Output:
% output = gefiltertes Messignal
%--------------------------------------------------------------------------

% kopieren der Eingangsvektoren
sig1 = double(sig1(:));
sig2 = double(sig2(:));

% Faltungssatz sig(m) * h(n) = output(m+n-1):
outlength = length(sig1)+length(sig2)-1;
% nächste Zweierpotenz für FFT
fftsize = 2^nextpow2(outlength);

% Messsignal
%mit Nullen auf fftsize auffüllen
sig1 = [sig1; zeros(fftsize-length(sig1),1)];
%Berechnung des Frequenzspektrums
sig1 = fft(sig1,fftsize);

% Filter - Impulsantwort
% mit Nullen auf fftsize auffüllen
sig2 = [sig2; zeros(fftsize-length(sig2),1)];
% Berechnung des Frequenzspektrums
sig2 = fft(sig2,fftsize);
 
% Faltung durch Multiplikation der Spektren
% Rücktransformation in den Zeitbereich
conv_raw = ifft(sig1.*sig2);

% Rückgabe Ergebnis
output = transpose(conv_raw(1:outlength));
 
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto85
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 07.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2015, 22:07     Titel:
  Antworten mit Zitat      
Das funktioniert leider auch nicht. Ich möchte quasi nur den Bereich mit den großen Amplituden haben. Ich weiß ehrlich gesagt gar nicht ob das so funktioniert. Kann es sein, dass ich quasi nur die niedrigen Amplituden heraus filtern müsste?
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: 11.05.2015, 18:18     Titel:
  Antworten mit Zitat      
Dann liegt es wohl am Filter, welches ungeeignet ist. Du brauchst einen entsprechenden Tiefpass. Die richtige Grenzfrequenz für das Filter ermittelt man am Besten über das Frequenzspektrum des Signals.

Ein Filter filter nicht die Amplituden (diese nur indirekt), sondern die Frequanzanteil des Signals je nach Filtereigenschaft. Daher muss man auch die Frequenzbereich von Nutz- und Störsignal kennen.
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto_85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2015, 19:03     Titel: Filter
  Antworten mit Zitat      
Erstmal vielen Dank für die Antwort.

Also ein Tiefpass hilft mir denke ich nicht weiter, weil das Rauschen ja offenbar dieselbe Frequenz hat, wie das Nutzsignal.

Mir wurde von meinem Betreuer gesagt, dass ich das Nutz-Signal mit einer Faltung erhalten würde und die Wichtungsfunktion einer Gauß-Kurve entspricht.

Mittlerweile bin ich mir da aber echt unsicher..
Habe jetzt schon so vieles ausprobiert und ich erhalte einfach nicht das saubere Nutzsignal...

Gruß
ElBarto
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 11.05.2015, 19:54     Titel:
  Antworten mit Zitat      
Ich bezweifel das hier der selbe Frequenzbereich vorliegt. Aber das lässt sich ganz einfach mit folgender Funktion überprüfen:

Code:

function [mag, mag_dB, fv] = FFT_betragsspektrum( signal, nfft, fa) ;
% Input:
% Signal im Zeitbereich
% nfft = Anzahl Messwerte für fft
% wenn nfft > length(sig) -> fft(sig,nfft) führt Zeropadding durch
% fa = Abtastfreq.
% 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(:);

% Signal transformieren
Fy = fft(sig,nfft);
 
%   Betrag - nur positives Freq.spektrum  
Fy_pos0 = abs(Fy(1:k));
 
%   Skalierung  
mag = [Fy_pos0(1)/nfft ;Fy_pos0(2:k-1)/(nfft/2);Fy_pos0(k)/nfft];
% dB
mag_dB = 20*log10(mag + eps); % eps = kleine Konstante zur Vermeidung von log(0)
 


Damit erstellst dann aus dem Ergebnisvektoren der Funktion das Frequenzspektrum deines Signals:

Code:

plot(fv,mag) % lineare Skalierung der Magnitude
plot(fv,mag_dB) % log. Skalierung der Magnitude
 


Bitte mal dieses dann hier posten.

Deine angegebene Abtastfrequenz ist vollkommen falsch. Laut dem Zeitvektor in der Textdatei ist Ta = 0.01 -> somit fa = 100Hz. Das hier stimmt also nicht.

Code:

fa = 10000000   % Abtastfrequenz
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto_85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2015, 20:38     Titel: Okay
  Antworten mit Zitat      
Danke. Ich werde es jetzt mal ausprobieren.

Also die Messpunkte liegen zwar nur 10^-2 auseinander. Die echte Größenordnung ist aber 10^-12. Daher die hohe Abtastfrequenz.


Ich bin euch vor allem dankbar, dass ihr mit mir nicht die Geduld verliert. Smile

Grüße
ElBarto
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.05.2015, 02:04     Titel: Re: Okay
  Antworten mit Zitat      
ElBarto_85 hat Folgendes geschrieben:
Also die Messpunkte liegen zwar nur 10^-2 auseinander. Die echte Größenordnung ist aber 10^-12. Daher die hohe Abtastfrequenz.


Wenn die Messwerte jeweils ein dt von 0.01s haben, dann kann man nicht einfach eine andere Abtastfrequenz verwenden. Es sind 100Hz, denn wo sind denn sonst die fehlenden Messwerte bei einem dt von 10^-12? Mir kommt diese Schrittweite doch etwas arg klein und unrealistisch vor.

Du musst nach dem Zeitvektor des Messignals gehen, denn die daraus resultierende Abtastfreq. hat nachher einen Einfluss auf das digitale Filter.
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto_85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2015, 10:27     Titel: Okay
  Antworten mit Zitat      
Okay,
aber die Abtastfrequenz muss aber dann doch trotzdem doppelt so hoch sein, wie die Signalfrequenz. Also 200Hz oder?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.05.2015, 18:15     Titel:
  Antworten mit Zitat      
Das Signal ist doch aber schon abgetastet worden. Da kann man nichts mehr an fa ändern. Es dürfen daher keine Signalanteile >= 50Hz sein, ansonsten kann man das Messsignal gleich in den Papierkorb werfen.
Private Nachricht senden Benutzer-Profile anzeigen
 
ElBarto_85

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.05.2015, 21:51     Titel: Okay
  Antworten mit Zitat      
Ja, stimmt. Da hatte ich irgendwie ein Brett vorm Kopf.

Also es geht bei dem Signal darum lediglich den hinteren verrauschten Teil irgendwie zu Null zu bekommen. Mit Gauß funktioniert es leider nicht.

Gibt es andere Ansätze? Vielleicht unkonventionellere Wege ohne einen Filter, sondern eher eine Art Schwellwertbearbeitung?
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 13.05.2015, 07:16     Titel:
  Antworten mit Zitat      
Ich habe dir bereits in diesem Thread die weitere Vorgehensweise beschrieben, samt ausführbarem Code. Wenn du dir nicht mal die Mühe machst diesen auch zu nutzen, kann ich nicht mehr für dich tun.
Private Nachricht senden Benutzer-Profile anzeigen
 
Malle91
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 01.06.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2016, 16:40     Titel:
  Antworten mit Zitat      
DSP hat Folgendes geschrieben:
Dann liegt es wohl am Filter, welches ungeeignet ist. Du brauchst einen entsprechenden Tiefpass. Die richtige Grenzfrequenz für das Filter ermittelt man am Besten über das Frequenzspektrum des Signals.

Ein Filter filter nicht die Amplituden (diese nur indirekt), sondern die Frequanzanteil des Signals je nach Filtereigenschaft. Daher muss man auch die Frequenzbereich von Nutz- und Störsignal kennen.


Hey, ich hol den Thread mal wieder hervor. Wie würde man denn wenn das Frequenzspektrum des Signals bestimmt ist, nun die richtie Grenzfrequenz bestimmen?

fftdb.png
 Beschreibung:

Download
 Dateiname:  fftdb.png
 Dateigröße:  15.62 KB
 Heruntergeladen:  530 mal
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.