Files
matlab/common/buch/lrader2.m
T
2022-06-30 13:32:40 +02:00

51 lines
1.7 KiB
Matlab
Executable File

% ##################################################################################
% ## Funktion: lrader.m ; AKF-Schaetzung mit Raderverfahren ##
% ##################################################################################
%
% function rxx = lrader(M,x)
%
% Nicht erwartungstreue AKF-Schaetzung nach dem Rader-Verfahren laut
% Kammeyer/Kroschel "Digitale Signalverarbeitung", S. 240-247.
% Der Parameter M muss eine Zweierpotenz sein und entspricht dem
% (Maximalwert+1) fuer lambda. Der Vektor x mit den Signalwerten
% darf eine beliebige Dimension annehmen und kann als Spalten- oder
% Zeilenvektor uebergeben werden. Die Ausgabe erfolgt als Spalten-
% vektor der Dimension M sowie nur fuer positive lambda-Werte:
% rxx = [rxx(0), ..., rxx(M-1)].
% Fuer negative lambda ist eine konj. gerade Ergaenzung vorzunehmen.
function rxx = lrader2(M,x,y)
x = x(:); % Spaltenvektoren erzeugen
y = y(:); % Spaltenvektoren erzeugen
N = length(x);
u = zeros(2*M,1);
u(1:M) = x(1:M);
U = fft(u);
w = zeros(2*M,1);
w(1:M) = y(1:M);
W = fft(w);
K = floor(N/M);
v = zeros(2*M,1);
Sxx = zeros(2*M,1);
pm = (-1).^(0:(2*M-1)).';
for ii = 1:(K-1) % Iteration und Akkumulation
v(1:M) = y((ii*M+1):((ii+1)*M));
V = fft(v);
Sxx = Sxx + (conj(U) .*(W + (pm .*V)));
W = V;
u(1:M) = x((ii*M+1):((ii+1)*M));
U = fft(u);
end;
if K < N/M
b = N - K*M;
v = zeros(2*M,1);
v(1:b) = y((K*M+1):N);
V = fft(v);
Sxx = Sxx + (conj(U) .*(W + (pm .*V)));
end;
Sxx = Sxx + 0*abs(V.^2);
rxx = ifft(Sxx)/N;
rxx = rxx(1:M);
% ##### EOF #####