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

Filtern einer Frequenz

 

hboeth
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 65
Anmeldedatum: 01.07.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 05.07.2010, 16:48     Titel: Filtern einer Frequenz
  Antworten mit Zitat      
Hallo,
ich habe folgendes Signal (siehe Anhang) in Zeit- und Frequenzdarstellung.
Ich möchte die mittleren Frequenzen gerne filtern (von ca. 30 bis 90 Hz).

Welchen Filter verwende ich und wie mache ich das überhaupt?

Könnt ihr mir da weiterhelfen?

Danke!!

S1_provo_primär_new.png
 Beschreibung:

Download
 Dateiname:  S1_provo_primär_new.png
 Dateigröße:  32.77 KB
 Heruntergeladen:  1620 mal
Private Nachricht senden Benutzer-Profile anzeigen


Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 06.07.2010, 07:34     Titel:
  Antworten mit Zitat      
Hallo,

ich seh an deinem Spektrum eine Symetrie bei 60 Hz, also nehme ich an deine abtastfrequenz ist 120 Hz. in diesem Fall guckt man sich das spektrum sowieso nur bis fs/2=60. (guck dir abtasttheorem an).

also musst du eigentlich nur noch ab 30 Hz filtern, sprich. Tiefpass mit grenzfrequenz 30 Hz. die ordnung kannst du ändern. x wäre dein Zeitsignal:
Code:

fs=120;
fn=fs/2;                    % Nyquistfrequenz
fg=30/fn;                  % normiert siehe ( doc fir1)
ordnung=20;
% Koeffizienten berechnen
b=fir1(ordnung,fg);
% filtern
y=filter(b,1,x);
 


schau dir dann spektrum von y an. ich kanns gerade nicht testen ;(

gruss
Private Nachricht senden Benutzer-Profile anzeigen
 
hboeth
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 65
Anmeldedatum: 01.07.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 06.07.2010, 11:04     Titel:
  Antworten mit Zitat      
Danke erstmal soweit, aber ich habe noch Probleme...
hier siehst du mein Code, das Signal hänge ich zum Teil auch mal an! .csv kann ich leider nicht laden....
Code:

S1_provo_st_1 = Angles-OCST.txt;
S1_provo_st_1_M = provo_right16.csv;
S1_provo_unst_1 = Angles-OCST.txt;
S1_provo_unst_1_M = provo_left19.csv;

fig = figure(1);
subplot(411)
y1=[S1_provo_st_1(:,2)';S1_provo_unst_1(:,2)'];
y2=[S1_provo_st_1_M(11+680:11+1080,141)';S1_provo_unst_1_M(11+536:11+936,114)'];
[AX,H1,H2]=plotyy(S1_provo_st_1(:,1),y1,S1_provo_st_1(:,1),y2);
legend('Marker stable','Marker unstable','stable','unstable','Location','NorthEast');
set(H2,'LineStyle',':');  
set(H2(1),'Color','b');
set(H2(2),'Color','r');
set(H1(1),'Color','b');
set(H1(2),'Color','r');
set(H1,'LineWidth',2);
ylabel('Primary axis')
title('Subject 1, Provokation, first trial')

m=length(S1_provo_st_1(:,2));
Fs=120;
dt=1/Fs;
t=(0:m-1)/Fs;
NFFT=2^nextpow2(m);

subplot(412)
YY=fft(S1_provo_st_1(:,2),NFFT);
YY2=fft(S1_provo_unst_1(:,2),NFFT);
f=(0:NFFT-1)*(Fs/NFFT);
plot(f,20*log(abs(YY)),'b');hold on;
plot(f,20*log(abs(YY2)),'r');
ylim([-50 150])
legend('stable','unstable','Location','North');
xlabel('frequency (Hz)')
title('Spektrum of first trial')

subplot(413)
%lowpass
Fc_low=30;
Wn_low=Fc_low/(Fs/2);
% Koeffizienten berechnen
[b,a] = butter(2,Wn_low,'low');
% Filtern
YY_low = filtfilt(b,a,YY);
YY2_low = filtfilt(b,a,YY2);
plot(f,20*log(abs(YY_low)),'b');hold on;
plot(f,20*log(abs(YY2_low)),'r');
ylim([-50 150])
legend('stable','unstable','Location','North');
title('Tiefgefiltertes Signal')

subplot(414)
% zurück in den Zeitbereich
TT=YY(1:NFFT).*exp(-1i*2*pi*fs*20*dt);
x=ifft(TT,NFFT)*m;
plot(x)
xlabel('time / s')
title('Verschoben um 20 SAMPLES');
 


Wie du in der angehängten .fig sehen kannst, ist es noch nicht zufriednestellend.

Bild 3 und 4 sind wohl falsch. Kannst du mir sagen, wie ich da vorgehen muß?

Danke dir und VG!

Forum.fig
 Beschreibung:

Download
 Dateiname:  Forum.fig
 Dateigröße:  62.76 KB
 Heruntergeladen:  605 mal
Angles-OCST.txt
 Beschreibung:

Download
 Dateiname:  Angles-OCST.txt
 Dateigröße:  26.63 KB
 Heruntergeladen:  487 mal
Angles-OCST.txt
 Beschreibung:

Download
 Dateiname:  Angles-OCST.txt
 Dateigröße:  26.63 KB
 Heruntergeladen:  508 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 06.07.2010, 11:18     Titel:
  Antworten mit Zitat      
Hallo,

ich kann jetzt zwar dein code nicht testen, aber was mir aufgefallen ist:
Code:

YY_low = filtfilt(b,a,YY);
YY2_low = filtfilt(b,a,YY2);
 


YY und YY2 sind spektren, und die function filtfilt wendet man auf zeitsignale.
dh: du musst deine zeitsignale mit filtfilt filtern, und dann transformieren (fft)
und dir dann spektrum anschauen.
Code:


x=randn(500,1);      % zeitsignal
X=fft(x,NFFT).....       % spektrum
plot(f,20log(X)....

y=filtfilt(b,a,x);         % gefiltertes signal
Y=fft(y.....                % spektrum vom gefilterten signal
plot(f,20.log(Y).....
 


gruss
_________________

Ein schlechter General ist besser als zwei gute.
Private Nachricht senden Benutzer-Profile anzeigen
 
hboeth
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 65
Anmeldedatum: 01.07.10
Wohnort: Berlin
Version: ---
     Beitrag Verfasst am: 06.07.2010, 11:53     Titel:
  Antworten mit Zitat      
oK, macht Sinn...aber was mich jetzt wundert, ist, dass nachdem ich einen Tiefpassfilter bei meinem Zeitsignal angewendet habe mit 30 Hz, (vgl. fig Bild 3), sehe ich in dem Frequenzspektrum (vgl. Bild 4) trotzdem noch die hohen Frequenzen...
Das kann doch nicht sein???

Ist noch immer etwas in dem Code falsch?

Code:

fig = figure(1);
subplot(411)
y1=[S1_provo_st_1(:,2)';S1_provo_unst_1(:,2)'];
y2=[S1_provo_st_1_M(11+680:11+1080,141)';S1_provo_unst_1_M(11+536:11+936,114)'];
[AX,H1,H2]=plotyy(S1_provo_st_1(:,1),y1,S1_provo_st_1(:,1),y2);
legend('Marker stable','Marker unstable','stable','unstable','Location','NorthEast');
set(H2,'LineStyle',':');  
set(H2(1),'Color','b');
set(H2(2),'Color','r');
set(H1(1),'Color','b');
set(H1(2),'Color','r');
set(H1,'LineWidth',2);
ylabel('Primary axis')
title('Subject 1, Provokation, first trial')

m=length(S1_provo_st_1(:,2));
Fs=120;
dt=1/Fs;
t=(0:m-1)/Fs;
NFFT=2^nextpow2(m);

subplot(412)
YY=fft(S1_provo_st_1(:,2),NFFT);
YY2=fft(S1_provo_unst_1(:,2),NFFT);
f=(0:NFFT-1)*(Fs/NFFT);
plot(f,20*log(abs(YY)),'b');hold on;
plot(f,20*log(abs(YY2)),'r');
ylim([-50 150])
legend('stable','unstable','Location','North');
xlabel('frequency (Hz)')
title('Spektrum of first trial')

subplot(413)
%lowpass
Fc_low=30;
Wn_low=Fc_low/(Fs/2);
% Koeffizienten berechnen
[b,a] = butter(2,Wn_low,'low');
% Filtern
YY_low = filtfilt(b,a,S1_provo_st_1(:,2));
YY2_low = filtfilt(b,a,S1_provo_unst_1(:,2));
%teifgefiltertes Zeitsignal
plot(YY_low,'b','LineWidth',2);hold on;
plot(YY2_low,'r','LineWidth',2);
title('Tiefgefiltertes Signal im Zeitbereich');

subplot(414)
% zurück in den Zeitbereich
YY_low_fft = fft(YY_low,NFFT);
YY2_low_fft = fft(YY2_low,NFFT);
plot(f,20*log(abs(YY_low_fft)),'b');hold on;
plot(f,20*log(abs(YY2_low_fft)),'r');
ylim([-50 150])
legend('stable','unstable','Location','North');
title('Tiefgefiltertes Signal im Frequenzbereich')
 


Forum.fig
 Beschreibung:

Download
 Dateiname:  Forum.fig
 Dateigröße:  63.28 KB
 Heruntergeladen:  464 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Fourier
Forum-Guru

Forum-Guru


Beiträge: 329
Anmeldedatum: 05.04.10
Wohnort: Karlsruhe
Version: 2009b
     Beitrag Verfasst am: 06.07.2010, 12:07     Titel:
  Antworten mit Zitat      
Hi,

die hohen frequenzen wirst du IMMER sehen, das ist nämlich kein idealer TP.
aber die müssen schon besser gedämpft werden.

erhöhe mal die filter ordnung auf 50 von mir aus (als probe)
oder nutze einen anderen filter ( fir1 zum beispiel)

gruss
_________________

Ein schlechter General ist besser als zwei gute.
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 - 2025 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.