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

Offline tiefpassfiltern eines periodischen Signals

 

mifs
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 04.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2019, 17:42     Titel: Offline tiefpassfiltern eines periodischen Signals
  Antworten mit Zitat      
Hallo zusammen,

ich brauche eure Hilfe bezüglich des Tiefpassfilterns eines Signals, da mein Problem meine Fähigkeiten deutlich übersteigt. Von Hause aus bringe ich leider kein Wissen zur digitalen Filterung mit.

Zum Problem:
Eine geschlossene Kurve ist in Polarkoordinaten definiert, also habe ich einen Radius (r) als Funktion des Winkels (beta). Definiert ist beta für dem Intervall [0 360[ Grad.
Was ich nun machen möchte ist prinzipiell eine "einfache" Tiefpassfilterung des Radius, also die Anteile kurzer Wellenlänge aus der Kurve entfernen. Dazu verwende ich in meinem Code die Variable nCutoff. Sie beschreibt die praktisch den n-ten Fourierkoeffizienten ab dem die Filterung einsetzen soll, wenn man eine Fourierreihenzerlegung durchführt.


Meine Anforderung sind:
- Im Durchlassbereich möglichst eine Verstärkung von 1
- Negative Werte für den Radius r sind nicht zulässig, da nichtphysikalisch
- Ein möglicher Phasenverzug muss kompensiert werden. Sollte durchführbar sein, da ich die Daten offline verarbeiten möchte


Was ich bereits probiert habe:
- Fourierkoeffizienten bestimmen (manuelles berechnen der Fourierreihe) und zu Nullsetzen aller Koeffizienten die zur höheren Ordnungen gehören. Mittlweile weiß ich, dass das nicht funktionert, da ich damit einen "Brick Filter" implementiert habe, vgl. Gibbs'sche Phänomen.
- Verwenden von Fensterfunktionen. Hier habe ich leider keine Ahnung, wie ich meine Amplituden im Bereich hoher Wellenlängen (niederfrequenten Bereich) beeinflusse.
- Butterworth Tiefpass mittles filtfilt zum kompensieren der Phase. Hier habe ich das Problem, dass die gefilterte Funktion negative Werte für den Radius aufweist.
- Centered moving average (movmean). Hier scheint die Amplitude im Bereich langer Wellenlängen deutlich reduziert zu werden, was meiner Anforderung widerspricht.


Habt ihr eine Idee, wie ich mein Problem am Besten in den Griff bekomme? Oder sind meine Anforderung nicht alle Gleichzeitig umzusetzen?


Mein Code mit den verschiedenen Methoden sieht bisland so aus:

Code:
load('data.mat')
nCutoff= 30;

% with Hanning windows
L=numel(r);
YwearDepth=fft(r);
P2=abs(r/L);
spectrum_r=P2(1:L/2+1);
spectrum_r(2:end-1)=2*spectrum_r(2:end-1);

windowHann=hann(2*nCutoff+1,'symmetric');
window=zeros(size(YwearDepth));
window(1:nCutoff+1)=windowHann(nCutoff+1:end);
window(end-nCutoff+1:end)=windowHann(1:nCutoff);
YFiltered=YwearDepth.*window;
r_windowed=ifft(YFiltered);

%Low Pass IIR filter design
anglesPerRevolution=numel(beta);
fs=anglesPerRevolution;
fc=nCutoff;
[b,a] = butter(10,fc/(fs/2));
r_filtered = filtfilt(b,a,r);
h1 = fvtool(b,a);

% moving mean
windowWidth=5;      % in degree
windowLength=windowWidth/360*anglesPerRevolution;
r_mean= movmean(r,windowLength);



%% plots
figure()
plot([beta beta+360],[r, r])
hold on
plot([beta beta+360],[r_windowed,r_windowed])
plot([beta beta+360],[r_filtered,r_filtered])
plot([beta beta+360],[r_mean,r_mean])
xlabel('Winkel in Grad')
ylabel('Radius in m')
legend('original','hann window','Butterworthfilter','Moving mean')
 


Ich bedanke mich für alle Anregungen und Hinweise
Grüße
Martin

EDIT: Es waren noch ein paar Fehler drin im Code.

data.mat
 Beschreibung:
enthält den radius r und den Winkelvektor beta

Download
 Dateiname:  data.mat
 Dateigröße:  6.57 KB
 Heruntergeladen:  300 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.