Hi,
Ich habe eine Frage was dem Hamming-Fenster betrifft und zwar:
Ich habe eine 24 Stunden Signal , das Ich auf 20s Segmente die FFT berechnen will.
Ich habe eure codehilfe benutzt:
Code:
%
% Zur Fensterung des Frequenzspektrums % N = Anzahl der Messwerte
N = 20;
% Signal(N) = das abgetastete Signal mit N Messwerten
%BetragX ist mein Signal
Signal(N) = betragX(N);
% Fensterung erfolgt im Zeitbereich
window = Fenster(N,'Hann'); % erstellt ein Hann Fenster mit der Länge N
Signal_win = Signal .* window; % Multiplikation von Signal und Fenster % Frequenzspektrum berechnen
Y = fft(Signal_win,N);
Die Fehlermeldung deutet darauf hin, dass die Funktion Fenster.m nicht existiert. Hast du den file auch ins matlab-work Verzeichnis geladen und es ist auch als 'current directory' ausgewählt?
Für die andere Frage nutze doch bitte einen eigenen Thread im Bereich Signalverarbeitung oder Programmierung. Sie hat ja mit dem Skript nichts zu tun.
Mike1221
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.10.2011, 11:54
Titel:
Hi DSP
wo kann Ich Fenster.m finden?
Danke
Mike1221
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.10.2011, 12:11
Titel:
also unter mathwork ist sie nicht zu finden.
es gibt nur hamming(N) wobei was ich nicht verstehen kann wie soll ich denn das Fenster für meinen Signal machen.
Die musst du dir hier in diesem Thread downloaden und dann in das matlab/work Verzeichnis speichern. Fenster.m ist doch keine matlab eigene Version. Wenn du eh die 'Signal Processing Toolbox' besitzt, brauchst du diese Fensterfunktion doch gar nicht. Dann kannst du sie dir mit der Matlabfkt. erstellen:
Code:
win = hamming(N,'sflag')
Mike1221
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.10.2011, 12:32
Titel:
Vielen Dank für deine Zeit,
aber ich weiss immer noch nicht wie soll ich hamming(N,'sflag') benutzen.
also ich brauche ein hammingfenster mit N=20 für mein Signal: betragX
ist das so dann richtig? : win = hamming(N,betragX)????
@ Moderator: Kann mal bitte jemand die Fragen in einen eigenen Thread im Bereich Signalverarbeitung verschieben...Danke!
Code:
N = length(Signal); % Anzahl Messwerte des Signals
win = hamming(N);
Für 'sflag' kann 'periodic' oder 'symmetric' (=default) angegeben werden. Das brauchst du aber hier nicht. Ansonsten verfährst weiter du wie in deinem Code angegeben. Signal mit Fenster multiplizieren...
Mike1221
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.10.2011, 13:26
Titel:
Danke Dir
Gesplittet: 18.10.2011, 13:46 Uhr von _Peter_ Von Beitrag Fensterfunktion - Hamming, Hann u. Blackman aus dem Forum Script-Ecke
So jetzt ist meine Anfrage in dem richtigen Forum.
Ich habe noch das Problem:
Code:
% Zur Fensterung des Frequenzspektrums % N = Anzahl der Messwerte
N = length(Signal);
% Signal(N) = das abgetastete Signal mit N Messwerten
Signal = betragX;
% Fensterung erfolgt im Zeitbereich
window = hamming(N); % erstellt ein Hamming Fenster mit der Länge N
Signal_win = Signal(1:N) .* window; % Multiplikation von Signal und Fenster % Frequenzspektrum berechnen
Y = fft(Signal_win,N);
plot(Y)
und zwar hier N ist die anzahl der messwerte = 4808025 samples
ich will aber ein fenster auf 20 s .
Wie soll Ich das in 20s Segmente segmentieren? und am Ende die FFT für die ganze 4808025 samples bekommen?
Dazu musst du erstmal wissen, wie viele Messwerte in 20 sek. enthalten sind...es hängt eben von deiner Abtastrate ab. Außerdem solltest du die Fensterlänge N so wählen, dass sich eine 2er Potenz ergibt, damit mit dem schnellen FFT Algorithmus gerechnet wird. Geht das mit den 20 sek. nicht, kannst entweder das Zeitfenster anpassen oder aber durch Zero-padding auf die nächste 2er Potenz erweitern.
Die Segmentierung könnte dann so ablaufen:
Code:
% Länge des Gesamtsignals
N = length(signal);
% Bsp.: 20 sek sind 2^12 = 4096 Messwerte
nfft = 4096;
% Anzahl der Segmente bestimmen
k = round(N/nfft)% hier muss angepasst werden, was passieren soll, wenn k nicht ganzzahlig ist...was passiert mit den restlichen Werten??? % k Segmente der Länge nfft transformieren % pre-allocate
H = zeros(nfft,1);
Hpos0 = zeros(nfft,k);
m = 1;
for i=1:k
% Fensterung mit Hamming window
signal_win = signal(m:nfft+m-1) .* win;
H = fft(signal_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
% nächstes Segement
m = m + nfft;
end
Jetzt musst du dir noch überlegen, wie du die Einzelspektren zu einem Gesamtspektrum zusammenführst...z.B. durch Mittelung aller Segmente.
for i=1:k
% Fensterung mit Hamming window
signal_win = signal(m:nfft+m-1) .* win;
H = fft(signal_win, nfft);
% Betrag bilden und positiven Frequenzbereich speichern
H_pos0(1:(nfft/2)+1,i) = abs(H(1:(nfft/2)+1));
% nächstes Segement
m = m + nfft;
end
sorry aber win muss auch in die for schleife kompensiert sein win(?)
und was ist genau H_pos0(1:(nfft/2)+1,i))???
können Sie mir bitte das erklären?
vielen Dank
Mike1221
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.10.2011, 15:39
Titel:
also Ich bekomme immer die Fehlermeldung:
??? Error using ==> times
Matrix dimensions must agree.
Error in ==> AfBerechnung at 22
signal_win = signal(m:nfft+m-1) .* win;
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
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.