git-svn-id: http://moon:8086/svn/matlab/trunk@153 801c6759-fa7c-4059-a304-17956f83a07c
46 lines
2.1 KiB
Matlab
Executable File
46 lines
2.1 KiB
Matlab
Executable File
% ##################################################################################
|
|
% ## Funktion: lwelch.m; Welch- bzw. Bartlettverfahren ##
|
|
% ##################################################################################
|
|
%
|
|
% function Sxx = lwelch(x,K,windowtype[,NFFT[,overlap]])
|
|
%
|
|
% Schaetzung der spektralen Leistungsdichte nach dem Welch-Ansatz
|
|
% x Datenfolge (Zeilenvektor)
|
|
% K Anzahl der zu mittelnden Periodogramme = #Teilfolgen
|
|
% windowtype Fensterfunktion (z.B. 'hamming'=> Welch-Verfahren,
|
|
% 'boxcar' => Bartlett-Verfahren).
|
|
% [NFFT] FFT-Laenge (optional)
|
|
% [overlap] zusaetzliche Mittelung mit den Periodogrammen der
|
|
% um fix(L/2) verschobenen Teilfolgen (falls das
|
|
% optionale Argument vorhanden ist)
|
|
% Beispiel: Sxx = lwelch(x,4,'boxcar',1024);
|
|
|
|
function Sxx = lwelch(x,K,windowtype,NFFT,overlap)
|
|
|
|
L = floor(length(x)/K);
|
|
if nargin<4, NFFT=nextpow2(L); end;
|
|
% Fensterfunktion der Laenge
|
|
eval(['fenster =',windowtype,'(L);']); % L berechnen (Spaltenvektor)
|
|
AL = fenster.'*fenster; % Normierungskonstante
|
|
Sxx = zeros(1,NFFT);
|
|
kk = (1:L);
|
|
|
|
for i = 0:K-1 % Addition der Periodogramme
|
|
yi = fenster.' .* x(kk+i*L); % der nicht-ueberlappenden
|
|
Yi = fft(yi,NFFT); % Teilfolgen von x
|
|
Sxx = Sxx + abs(Yi).^2;
|
|
end
|
|
|
|
if nargin > 4 % zusaetzliche Addition der
|
|
kk = (1:L) + fix(L/2); % Periodogramme der ueber-
|
|
for i = 0:K-2 % lappenden Teilfolgen von x
|
|
yi = fenster' .* x(kk+i*L);
|
|
Yi = fft(yi,NFFT);
|
|
Sxx = Sxx + abs(Yi).^2;
|
|
end
|
|
Sxx = Sxx/AL/(2*K-1); % Normierung auf AL und
|
|
else % Anzahl der Mittelungen (=2K-1)
|
|
Sxx = Sxx/AL/K; % Normierung auf AL und
|
|
end % Anzahl der Mittelungen (=K)
|
|
% ##### EOF #####
|