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

Fensterung --> FFT

 

hosti
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.09.2009, 15:40     Titel: Fensterung --> FFT
  Antworten mit Zitat      
Hallo!

Ich möchte ein Signal von ein paar Sekunden Länge im Zeitbereich in Blöcke (20 ms) unterteilen (fenstern?, hann?) und dann anschließend jeden dieser Blöcke einer FFT zu unterziehen, um dann im Frequenzbereich weitere Analysen für jeden Block seperat durchführen zu können.

Wie generiere ich hier am Besten diese Blöcke, auch damit keine Information verloren geht?

Bin für jede Hilfe dankbar!

Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Termi3xxl
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 18.12.07
Wohnort: Sorry hat sich geändert... Stuttgart
Version: ---
     Beitrag Verfasst am: 09.09.2009, 15:21     Titel: hab ein änliches Problem....
  Antworten mit Zitat      
Hey wie es aussieht hab ich eine ähnliches Problem!!! Sad

Ich mache folgendes:

habe ein Fig, da Lade ich mein Messsignal. KAnn dann per Hand duch Eingabe eine Fensterung machen -> Signal ausschneiden. Aber ohne wiederholung!!! Nur das eine mal...

Dann lasse ich eine FFT drüber laufen. (Anleitung hier aus den Forum!!!)
Bei der Fensterung musst du wissen was dir wichtiger ist.... Amplitudentreue oder Flächenträue....

->rechteck (rectwin) ist soweit ein recht gutes Fenster

bitte aber nicht festnageln!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.09.2009, 17:08     Titel:
  Antworten mit Zitat      
Ich habe im Anhang ein Bild angehängt, wo man sieht wie ich das meine.

Wenn jemand weiß, wie man sowas in Matlab realisiert wär ich sehr dankbar.

Weiters weiß ich nicht ob ich eine Fensterung mit Overlap (wie im Bild) durchführen soll, oder ich habe mir gedacht nach jedem 20ms Fenster ein 20ms Zero-Padding anzuhängen.
Was wäre geschickter?

Grüße
hosti

windowing.jpg
 Beschreibung:

Download
 Dateiname:  windowing.jpg
 Dateigröße:  56.44 KB
 Heruntergeladen:  1184 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.09.2009, 11:28     Titel:
  Antworten mit Zitat      
So, habe etwas gebastelt und nun folgendes in meinem Code stehen:

Code:

tb = 0.02;      % Zeitbereich für Fenster von 20ms
Nf = tb*fs;     % Samples für Fenster von 20ms

windowHanning = window(@hann,Nf); % erzeugt einen Hanning Window Vektor mit der Länge von 20ms

w1 = w;                                  % w = Eingangssignal
w1 = [w1(1:Nf)];
w1_win = windowHanning.*w1;

tf1 = 0:Ts:(Nf-1)/fs;   % Zeit-Vektor

fig = figure(fig+1);
plot(tf1, w1_win)
xlabel('Zeit (Sek.)')
ylabel('w(t1)')
title('Windowed Signal w1')
grid

w2 = w;
w2 = [w2((Nf+1):2*Nf)];
w2_win = windowHanning.*w2;
tf2 = (Nf-1)/fs:Ts:2*(Nf-1)/fs;   % Zeit-Vektor

fig = figure(fig+1);
plot(tf2, w2_win)
xlabel('Zeit (Sek.)')
ylabel('w(t2)')
title('Windowed Signal w2')
grid


w3 = w;
w3 = [w3(2*Nf+1:3*Nf)];
w3_win = windowHanning.*w3;

tf3 = 2*(Nf-1)/fs:Ts:3*(Nf-1)/fs;   % Zeit-Vektor

fig = figure(fig+1);
plot(tf3, w3_win)
xlabel('Zeit (Sek.)')
ylabel('w(t3)')
title('Windowed Signal w3')
grid

...

 


Somit fenstere ich immer Blöcke (w1, w2, w3, ...) von 20ms des Signals. Die Implementierung so ist aber sehr umständlich. Das geht sicher auch irgendwie, dass ich ihm sagen kann, er soll das Signal alle 20ms fenstern und die Blöcke separat ausgeben, damit ich diese einzeln weiter bearbeiten kann!?! Vor allem ist das Eingangssignal immer unterschiedlich lang und es soll ja immer das ganze Signal unterteilt werden.
Wie kann man sowas realisieren OHNE Schleife!

Grüße
hosti
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 11.09.2009, 11:38     Titel:
  Antworten mit Zitat      
Ohne Schleifen fällt mir da nix kürzeres ein.
Warum willst/sollst/darfst du keine nehmen ?

PS: bei unterschiedlich langen Signalen bist du doch eh auf ne Schleifenart (-> if) angewiesen ?!
PPS: okay, Ansichtssache ob man if nun zur schleife zählt, aber zumindest im ASM müsste man springen... und if & goto Arrow while
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2009, 14:18     Titel:
  Antworten mit Zitat      
Mir wurde gesagt, dass Schleifen in Matlab bei größeren Wav-Signalen (paar Minuten lang) problematisch werden könnte mit der Rechendauer. Vor allem wenn es dann auch noch mehrere sind.

Aber du hast recht. Ohne Schleife fällt mir momentan auch nix ein.

Hab es hier mal mit einer FOR Schleife versucht:

Code:

% w = Eingangssignal

tb = 0.02;      % Zeitbereich für Fenster von 20ms
Nf = tb*fs;     % Samples für Fenster von 20ms

windowHanning = window(@hann,Nf); % erzeugt einen Hanning Window Vektor mit der Länge von 20ms

w_div = zeros(Nf,ceil(N/Nf));  % aquirieren von Speicherplatz für Matrix w_div
w_win = zeros(Nf,ceil(N/Nf));  % aquirieren von Speicherplatz für Matrix w_win

for k = 1:fix(N/Nf)-1
    w_div(1:Nf,k) = w(k*Nf:k*Nf+Nf-1);         % Unterteilung der Signals w in Blöcke von 20ms
    w_win(:,k) = windowHanning.*w_div(:,k);    % Fensterung der einzelnen Blöcke
end
 


Das (kleine) Problem welches ich jetzt noch habe ist, dass mir hier jetzt die ersten 20ms vom Signal wegfallen wegen w(k*Nf:k*Nf+Nf-1). Bin noch nicht dahinter gekommen wie ich auch diesen ersten Block in die Matrix schreiben kann. Der Start für die erste Spalte in der Matrix hier erst nach den ersten 20ms bei k=1.
Ansonsten würde ich annehmen dass es so mit der Schleife passt.

Mal schauen ob ich/wir auch auf eine Nicht-Schleifen-Lösung kommen.

Grüße
hosti


edit:

Das Problemchen mit dem Start der Schleife hab ich gleub ich hin bekommen:

Code:

tb = 0.02;      % Zeitbereich für Fenster von 20ms
Nf = tb*fs;     % Samples für Fenster von 20ms

windowHanning = window(@hann,Nf); % erzeugt einen Hanning Window Vektor mit der Länge von 20ms

w_div = zeros(Nf,ceil(N/Nf));  % aquirieren von Speicherplatz für Matrix w_div
w_win = zeros(Nf,ceil(N/Nf));  % aquirieren von Speicherplatz für Matrix w_win

for k = 0:fix(N/Nf)-1
    w_div(1:Nf,k+1) = w(k*Nf+1:k*Nf+Nf);         % Unterteilung der Signals w in Blöcke von 20ms
    w_win(:,k+1) = windowHanning.*w_div(:,k+1);    % Fensterung der einzelnen Blöcke
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 12.09.2009, 14:09     Titel:
  Antworten mit Zitat      
so müsste es stimmen.

Allgemein "Schleifen sind böse" kann man nicht sagen.
Das gilt eher für Matrixoperationen, die vektorisierbar sind... zb: anstelle
Code:

for i=1:100
    x[i]=x[i]+1;
end

lieber
Code:
schreiben.
Aber sobald man Copy&Paste machen würde, kann man auch ne Schleife nehmen. Dachte, es ist irgendne lustige Informatikeraufgabe oder so...
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2009, 12:57     Titel:
  Antworten mit Zitat      
Ok, danke Andy.

Jetzt habe ich mein Signal im Zeitbereich in Blöcke unterteilt.
Von jedem Block mach ich jetzt die FFT. Nun muss ich auch im Frequenzbereich in Frequenzblöcke unterteilen. Wie kann man sich das vorstellen bzw. realisieren, oder ist das sowieso schon mit der FFT passiert?
Da Blick ich noch nicht so ganz durch.

Grüße
hosti
Private Nachricht senden Benutzer-Profile anzeigen
 
Andy386
Forum-Guru

Forum-Guru


Beiträge: 485
Anmeldedatum: 24.06.09
Wohnort: ---
Version: 7.1/8
     Beitrag Verfasst am: 15.09.2009, 11:45     Titel:
  Antworten mit Zitat      
was willst du denn genau für Blöcke rausbekommen ?
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2009, 12:45     Titel:
  Antworten mit Zitat      
Prinzipiell würde es mir darum gehen, wie ich im Frequenzbereich in Blöcke unterteilen kann. In weitere Folge wahrscheinlich in Bezug auf die kritischen Frequenzbandbreiten.
http://de.wikipedia.org/wiki/Frequenzgruppe
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 15.09.2009, 14:23     Titel:
  Antworten mit Zitat      
Hallo,

Fensterung geht auch ohne Schleife und ist dann wirklich viel schneller:

Code:

%% Fenster framen ohne For Schleife:

d=1:1000;
hsize=100;

number = fix((length(d))/hsize); % number of frames
d(number*hsize+1:end)=[]; % cut off rest (maybe other possibility?)
E = reshape(d(1:number*hsize),hsize,number); % framing
S=E.*repmat(hamming(hsize),1, number); % for example multiplication with hamming window
 


Habe ich aber vor einem Jahr selbst auch noch mit For Schleifen gemacht.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2009, 20:26     Titel:
  Antworten mit Zitat      
Ja, ok.

Hab jetzt folgendes statt der Schleife.

Code:

tb = 0.02;      % Zeitbereich für Fenster von 20ms
Nf = tb*fs;     % Samples für Fenster von 20ms

windowHanning = window(@hann,Nf); % erzeugt einen Hanning Window Vektor mit der Länge von 20ms


wb = buffer(w,Nf);      % Unterteilung der Signals w in Blöcke von 20ms
wb_win = wb.*repmat(windowHanning,1,size(wb,2));    % Fensterung der einzelnen Blöcke
 


Diese Methode ist um ca. da 4-fache schneller als in der Schleife.

Grüße
hosti
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.