Signal- und Messdatenverarbeitung


Codes für reelle, stochastische Einzelleistungssignale, mit Gewichtung

Python Matlab/Octave
Vorbereitung (Laden von Modulen/Paketen)
from numpy import *
from numpy.random import *
from matplotlib.pyplot import *
Generieren von N Werten xi mit i=0N1 (AR1-Prozess als Beispiel, mit einem Erwartungswert verschieden von null) mit einer vom Wert abhängigen Annahmewahrscheinlichkeit (verschobene Sigmoidfunktion als Beispiel)
N=1000
dt=1.0
t=arange(0,N)*dt
phi=0.95
mxs=3
vxs=1
theta=sqrt((1-phi**2)*vxs)
x=zeros(N)
x[0]=normal(mxs,sqrt(vxs))
while random()>1/(1+exp(-(x[0]-mxs))):
  x[0]=normal(mxs,sqrt(vxs))

for i in range(1,N):
  x[i]=phi*(x[i-1]-mxs)+normal(mxs,theta)
  while random()>1/(1+exp(-(x[i]-mxs))):
    x[i]=phi*(x[i-1]-mxs)+normal(mxs,theta)
  

plot(t,x,'o')
show()
N=1000;
dt=1.0;
t=(0:N-1)*dt;
phi=0.95;
mxs=3;
vxs=1;
theta=sqrt((1-phi^2)*vxs);
x=zeros(1,N);
x(1)=mxs+sqrt(vxs)*randn();
while rand>1/(1+exp(-(x(1)-mxs)))
x(1)=mxs+sqrt(vxs)*randn();
end
for i=2:N
x(i)=phi*(x(i-1)-mxs)+mxs+theta*randn();
while rand>1/(1+exp(-(x(i)-mxs)))
x(i)=phi*(x(i-1)-mxs)+mxs+theta*randn();
end
end
plot(t,x,'o')
Generieren von N Gewichten gi mit i=0N1, passend zu den xi mit i=0N1 (Inverse der verschobenen Sigmoidfunktion)
g=zeros(N)
for i in range(0,N):
  g[i]=(1+exp(-(x[i]-mxs)))**(1+phi)

plot(t,g,'o')
show()
g=zeros(1,N);
for i=1:N
g(i)=(1+exp(-(x(i)-mxs)))^(1+phi);
end
plot(t,g,'o')
Mittelwert x=i=0N1gixii=0N1gi
sum(g*x)/float(sum(g))
sum(g.*x)/sum(g)
Varianz (ohne Bessel-Korrektur, asymptotisch erwartungstreu) s2=i=0N1gi(xix)2i=0N1gi=i=0N1gixi2i=0N1gix2
sum(g*x**2)/float(sum(g))-(sum(g*x)/float(sum(g)))**2
sum(g.*x.^2)/sum(g)-(sum(g.*x)/sum(g))^2
Varianz (mit Bessel-Korrektur für korrelierte Daten, erwartungstreu) s2=i=0N1gi(xix)2i=0N1gi+sx2=i=0N1gixi2i=0N1gix2+sx2
mit der erwartungstreuen Schätzung sx2 der Schätzvarianz des Mittelwertschätzers für korrelierte Daten aus der erwartungstreuen Schätzung der (Auto-)Kovarianzfunktion mit Bessel-Korrektur für korrelierte Daten (s. unten)
from numpy.fft import *
from numpy.linalg import *
Nc=200 #bitte so waehlen, dass die Korrelationsfunktion ausreichend abgeklungen ist, aber deutlich kleiner als N
mxe=sum(g*x)/float(sum(g))
xe=append(g*(x-mxe),zeros(N))
ge=append(g,zeros(N))
X=real(ifft(abs(fft(xe))**2))
Y=real(ifft(abs(fft(ge))**2))
Cp=zeros(2*Nc-1)
for k in range(-(Nc-1),Nc):
  Cp[k]=X[k]/Y[k]

D=sum(g)
A=zeros([2*Nc-1,2*Nc-1])
for k in range(-(Nc-1),Nc):
  Gk=real(ifft(conj(fft(ge*roll(ge,-k)))*fft(ge)))
  Hk=real(ifft(conj(fft(ge))*fft(ge*roll(ge,k))))
  for j in range(-(Nc-1),Nc):
    A[k,j]=int(k==j)-(Gk[j]+Hk[j])/float(Y[k]*D)+Y[j]/float(D**2)
  

Ainv=inv(A)
Ce=dot(Ainv,Cp)
sC=0
for k in range(-(Nc-1),Nc):
  sC+=(N-abs(k))*Ce[k]

sum(g*x**2)/float(sum(g))-(sum(g*x)/float(sum(g)))**2+sC/float(N**2)
Nc=200; %bitte so waehlen, dass die Korrelationsfunktion ausreichend abgeklungen ist, aber deutlich kleiner als N
mxe=sum(g.*x)/sum(g);
xe=[g.*(x-mxe),zeros(1,N)];
ge=[g,zeros(1,N)];
X=real(ifft(abs(fft(xe)).^2));
Y=real(ifft(abs(fft(ge)).^2));
Cp=zeros(1,2*Nc-1);
for k=-(Nc-1):Nc-1
Cp(mod(k,2*Nc-1)+1)=X(mod(k,2*N)+1)/Y(mod(k,2*N)+1);
end
D=sum(g);
A=zeros(2*Nc-1,2*Nc-1);
for k=-(Nc-1):Nc-1
Gk=real(ifft(conj(fft(ge.*circshift(ge,[0;-k]))).*fft(ge)));
Hk=real(ifft(conj(fft(ge)).*fft(ge.*circshift(ge,[0;k]))));
for j=-(Nc-1):Nc-1
A(mod(k,2*Nc-1)+1,mod(j,2*Nc-1)+1)=(k==j)-(Gk(mod(j,2*N)+1)+Hk(mod(j,2*N)+1))/(Y(mod(k,2*N)+1)*D)+Y(mod(j,2*N)+1)/(D^2);
end
end
Ainv=inv(A);
Ce=Ainv*Cp';
sC=0;
for k=-(Nc-1):Nc-1
sC=sC+(N-abs(k))*Ce(mod(k,2*Nc-1)+1);
end
sum(g.*x.^2)/sum(g)-(sum(g.*x)/sum(g))^2+sC/(N^2)
(Auto-)Korrelationsfunktion (erwartungstreu) Rk=R(τk)=i=0N1|k|gigi+|k|xixi+|k|i=0N1|k|gigi+|k|
τk=kΔt
k=(N1)N1
(außerhalb dieses Bereichs nicht bekannt)
direkte Berechnung:
R=zeros(2*N-1)
tau=zeros(2*N-1)
for k in range(-(N-1),N):
  tau[k]=k*dt
  sum1=0
  sum0=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*x[i]*x[i+abs(k)]
    sum0+=g[i]*g[i+abs(k)]
  
  R[k]=sum1/float(sum0)

plot(tau,R,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=roll(arange(-(N-1),N)*dt,N)
X1=fft(append(g*x,zeros(N)))
E1=dt**2*abs(X1)**2
X0=fft(append(g,zeros(N)))
E0=dt**2*abs(X0)**2
R=real(ifft(E1))/real(ifft(E0))
R=append(R[0:N],R[N+1:2*N])
plot(tau,R,'o')
show()
direkte Berechnung:
R=zeros(1,2*N-1);
tau=zeros(1,2*N-1);
for k=-(N-1):N-1
tau(mod(k,2*N-1)+1)=k*dt;
sum1=0;
sum0=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*x(i)*x(i+abs(k));
sum0=sum0+g(i)*g(i+abs(k));
end
R(mod(k,2*N-1)+1)=sum1/sum0;
end
plot(tau,R,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
tau=circshift((-(N-1):N-1)*dt,[0;N]);
X1=fft([g.*x,zeros(1,N)]);
E1=dt^2*abs(X1).^2;
X0=fft([g,zeros(1,N)]);
E0=dt^2*abs(X0).^2;
R=real(ifft(E1))./real(ifft(E0));
R=[R(1:N),R(N+2:end)];
plot(tau,R,'o')
(Auto-)Kovarianzfunktion (asymptotisch erwartungstreu) Ck=C(τk)=i=0N1|k|gigi+|k|(xix)(xi+|k|x)i=0N1|k|gigi+|k|
τk=kΔt
k=(N1)N1
(außerhalb dieses Bereichs nicht bekannt)
direkte Berechnung:
C=zeros(2*N-1)
tau=zeros(2*N-1)
mxe=sum(g*x)/float(sum(g))
for k in range(-(N-1),N):
  tau[k]=k*dt
  sum1=0
  sum0=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*(x[i]-mxe)*(x[i+abs(k)]-mxe)
    sum0+=g[i]*g[i+abs(k)]
  
  C[k]=sum1/float(sum0)

plot(tau,C,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=roll(arange(-(N-1),N)*dt,N)
mxe=sum(g*x)/float(sum(g))
X1=fft(append(g*(x-mxe),zeros(N)))
E1=dt**2*abs(X1)**2
X0=fft(append(g,zeros(N)))
E0=dt**2*abs(X0)**2
C=real(ifft(E1))/real(ifft(E0))
C=append(C[0:N],C[N+1:2*N])
plot(tau,C,'o')
show()
direkte Berechnung:
C=zeros(1,2*N-1);
tau=zeros(1,2*N-1);
mxe=sum(g.*x)/sum(g);
for k=-(N-1):N-1
tau(mod(k,2*N-1)+1)=k*dt;
sum1=0;
sum0=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*(x(i)-mxe)*(x(i+abs(k))-mxe);
sum0=sum0+g(i)*g(i+abs(k));
end
C(mod(k,2*N-1)+1)=sum1/sum0;
end
plot(tau,C,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
tau=circshift((-(N-1):N-1)*dt,[0;N]);
mxe=sum(g.*x)/sum(g);
X1=fft([g.*(x-mxe),zeros(1,N)]);
E1=dt^2*abs(X1).^2;
X0=fft([g,zeros(1,N)]);
E0=dt^2*abs(X0).^2;
C=real(ifft(E1))./real(ifft(E0));
C=[C(1:N),C(N+2:end)];
plot(tau,C,'o')
(Auto-)Kovarianzfunktion (mit Bessel-Korrektur für korrelierte Daten, erwartungstreu) s. H. Nobach: Practical Realization of Bessel's Correction for a Bias-Free Estimation of the Auto-Covariance and the Cross-Covariance Functions direkte Berechnung:
from numpy.linalg import *
Nc=200 #bitte so waehlen, dass die Korrelationsfunktion ausreichend abgeklungen ist, aber deutlich kleiner als N
Cp=zeros(2*Nc-1)
S=zeros(2*Nc-1)
tau=zeros(2*Nc-1)
mxe=sum(g*x)/float(sum(g))
for k in range(-(Nc-1),Nc):
  tau[k]=k*dt
  sum1=0
  sum0=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*(x[i]-mxe)*(x[i+abs(k)]-mxe)
    sum0+=g[i]*g[i+abs(k)]
  
  Cp[k]=sum1/float(sum0)
  S[k]=sum0

D=sum(g)
A=zeros([2*Nc-1,2*Nc-1])
for k in range(-(Nc-1),Nc):
  for j in range(-(Nc-1),Nc):
    s=0
    for i in range(maximum(0,maximum(-j,-k)),minimum(N,minimum(N-j,N-k))):
      s+=g[i]*g[i+j]*g[i+k]
    for i in range(maximum(0,maximum(-j,k-j)),minimum(N,minimum(N-j,N+k-j))):
      s+=g[i]*g[i+j]*g[i+j-k]
    A[k,j]=int(k==j)-s/float(S[k]*D)+S[j]/float(D**2)
  

Ainv=inv(A)
C=dot(Ainv,Cp)
plot(tau,C,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
from numpy.linalg import *
Nc=200 #bitte so waehlen, dass die Korrelationsfunktion ausreichend abgeklungen ist, aber deutlich kleiner als N
tau=roll(arange(-(Nc-1),Nc)*dt,Nc)
mxe=sum(g*x)/float(sum(g))
xe=append(g*(x-mxe),zeros(N))
ge=append(g,zeros(N))
X=real(ifft(abs(fft(xe))**2))
Y=real(ifft(abs(fft(ge))**2))
Cp=zeros(2*Nc-1)
for k in range(-(Nc-1),Nc):
  Cp[k]=X[k]/Y[k]

D=sum(g)
A=zeros([2*Nc-1,2*Nc-1])
for k in range(-(Nc-1),Nc):
  Gk=real(ifft(conj(fft(ge*roll(ge,-k)))*fft(ge)))
  Hk=real(ifft(conj(fft(ge))*fft(ge*roll(ge,k))))
  for j in range(-(Nc-1),Nc):
    A[k,j]=int(k==j)-(Gk[j]+Hk[j])/float(Y[k]*D)+Y[j]/float(D**2)
  

Ainv=inv(A)
C=dot(Ainv,Cp)
plot(tau,C,'o')
show()
direkte Berechnung:
Nc=200; %bitte so waehlen, dass die Korrelationsfunktion ausreichend abgeklungen ist, aber deutlich kleiner als N
Cp=zeros(1,2*Nc-1);
S=zeros(1,2*Nc-1);
tau=zeros(1,2*Nc-1);
mxe=sum(g.*x)/sum(g);
for k=-(Nc-1):Nc-1
tau(mod(k,2*Nc-1)+1)=k*dt;
sum1=0;
sum0=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*(x(i)-mxe)*(x(i+abs(k))-mxe);
sum0=sum0+g(i)*g(i+abs(k));
end
Cp(mod(k,2*Nc-1)+1)=sum1/sum0;
S(mod(k,2*Nc-1)+1)=sum0;
end
D=sum(g);
A=zeros(2*Nc-1,2*Nc-1);
for k=-(Nc-1):Nc-1
for j=-(Nc-1):Nc-1
s=0;
for i=max(0,max(-j,-k))+1:min(N,min(N-j,N-k))
s=s+g(i)*g(i+j)*g(i+k);
end
for i=max(0,max(-j,k-j))+1:min(N,min(N-j,N+k-j))
s=s+g(i)*g(i+j)*g(i+j-k);
end
A(mod(k,2*Nc-1)+1,mod(j,2*Nc-1)+1)=(k==j)-s/(S(mod(k,2*Nc-1)+1)*D)+S(mod(j,2*Nc-1)+1)/(D^2);
end
end
Ainv=inv(A);
C=Ainv*Cp';
plot(tau,C,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
Nc=200; %bitte so waehlen, dass die Korrelationsfunktion ausreichend abgeklungen ist, aber deutlich kleiner als N
tau=circshift((-(Nc-1):Nc-1)*dt,[0;Nc]);
mxe=sum(g.*x)/sum(g);
xe=[g.*(x-mxe),zeros(1,N)];
ge=[g,zeros(1,N)];
X=real(ifft(abs(fft(xe)).^2));
Y=real(ifft(abs(fft(ge)).^2));
Cp=zeros(1,2*Nc-1);
for k=-(Nc-1):Nc-1
Cp(mod(k,2*Nc-1)+1)=X(mod(k,2*N)+1)/Y(mod(k,2*N)+1);
end
D=sum(g);
A=zeros(2*Nc-1,2*Nc-1);
for k=-(Nc-1):Nc-1
Gk=real(ifft(conj(fft(ge.*circshift(ge,[0;-k]))).*fft(ge)));
Hk=real(ifft(conj(fft(ge)).*fft(ge.*circshift(ge,[0;k]))));
for j=-(Nc-1):Nc-1
A(mod(k,2*Nc-1)+1,mod(j,2*Nc-1)+1)=(k==j)-(Gk(mod(j,2*N)+1)+Hk(mod(j,2*N)+1))/(Y(mod(k,2*N)+1)*D)+Y(mod(j,2*N)+1)/(D^2);
end
end
Ainv=inv(A);
C=Ainv*Cp';
plot(tau,C,'o')
(Auto-)Kovarianzfunktion (mit lokaler Normierung, asymptotisch erwartungstreu) Ck=C(τk)=s2i=0N1|k|gigi+|k|(xix)(xi+|k|x)[i=0N1|k|gigi+|k|(xix)2][i=0N1|k|gigi+|k|(xi+|k|x)2]
τk=kΔt
k=(N1)N1
(außerhalb dieses Bereichs nicht bekannt)
direkte Berechnung:
C=zeros(2*N-1)
tau=zeros(2*N-1)
mxe=sum(g*x)/float(sum(g))
vxe=sum(g*x**2)/float(sum(g))-(sum(g*x)/float(sum(g)))**2
for k in range(-(N-1),N):
  tau[k]=k*dt
  sum1=0
  sum2=0
  sum3=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*(x[i]-mxe)*(x[i+abs(k)]-mxe)
    sum2+=g[i]*g[i+abs(k)]*(x[i]-mxe)**2
    sum3+=g[i]*g[i+abs(k)]*(x[i+abs(k)]-mxe)**2
  
  C[k]=vxe*sum1/sqrt(sum2*sum3)

plot(tau,C,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=roll(arange(-(N-1),N)*dt,N)
mxe=sum(g*x)/float(sum(g))
vxe=sum(g*x**2)/float(sum(g))-(sum(g*x)/float(sum(g)))**2
X=fft(append(g*(x-mxe),zeros(N)))
Q=fft(append(g*(x-mxe)**2,zeros(N)))
O=fft(append(g,zeros(N)))
EX=dt**2*abs(X)**2
EA=dt**2*conj(Q)*O
EB=dt**2*conj(O)*Q
CEX=real(ifft(EX))/float(dt)
CEA=real(ifft(EA))/float(dt)
CEB=real(ifft(EB))/float(dt)
C=vxe*CEX/sqrt(CEA*CEB)
C=append(C[0:N],C[N+1:2*N])
plot(tau,C,'o')
show()
direkte Berechnung:
C=zeros(1,2*N-1);
tau=zeros(1,2*N-1);
mxe=sum(g.*x)/sum(g);
vxe=sum(g.*x.^2)/sum(g)-(sum(g.*x)/sum(g))^2;
for k=-(N-1):N-1
tau(mod(k,2*N-1)+1)=k*dt;
sum1=0;
sum2=0;
sum3=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*(x(i)-mxe)*(x(i+abs(k))-mxe);
sum2=sum2+g(i)*g(i+abs(k))*(x(i)-mxe)^2;
sum3=sum3+g(i)*g(i+abs(k))*(x(i+abs(k))-mxe)^2;
end
C(mod(k,2*N-1)+1)=vxe*sum1/sqrt(sum2*sum3);
end
plot(tau,C,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
tau=circshift((-(N-1):N-1)*dt,[0;N]);
mxe=sum(g.*x)/sum(g);
vxe=sum(g.*x.^2)/sum(g)-(sum(g.*x)/sum(g))^2;
X=fft([g.*(x-mxe),zeros(1,N)]);
Q=fft([g.*(x-mxe).^2,zeros(1,N)]);
O=fft([g,zeros(1,N)]);
EX=dt^2*abs(X).^2;
EA=dt^2*conj(Q).*O;
EB=dt^2*conj(O).*Q;
CEX=real(ifft(EX))/dt;
CEA=real(ifft(EA))/dt;
CEB=real(ifft(EB))/dt;
C=vxe*CEX./sqrt(CEA.*CEB);
C=[C(1:N),C(N+2:end)];
plot(tau,C,'o')
(Auto-)Korrelationskoeffizientenfunktion (asymptotisch erwartungstreu) ρk=ρ(τk)=i=0N1|k|gigi+|k|(xix)(xi+|k|x)s2i=0N1|k|gigi+|k|
τk=kΔt
k=(N1)N1
(außerhalb dieses Bereichs nicht bekannt)
direkte Berechnung:
rho=zeros(2*N-1)
tau=zeros(2*N-1)
mxe=sum(g*x)/float(sum(g))
vxe=sum(g*x**2)/float(sum(g))-(sum(g*x)/float(sum(g)))**2
for k in range(-(N-1),N):
  tau[k]=k*dt
  sum1=0
  sum0=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*(x[i]-mxe)*(x[i+abs(k)]-mxe)
    sum0+=g[i]*g[i+abs(k)]
  
  rho[k]=sum1/sum0/vxe

plot(tau,rho,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=roll(arange(-(N-1),N)*dt,N)
mxe=sum(g*x)/float(sum(g))
vxe=sum(g*x**2)/float(sum(g))-(sum(g*x)/float(sum(g)))**2
X1=fft(append(g*(x-mxe),zeros(N)))
E1=dt**2*abs(X1)**2
X0=fft(append(g,zeros(N)))
E0=dt**2*abs(X0)**2
rho=real(ifft(E1))/real(ifft(E0))/vxe
rho=append(rho[0:N],rho[N+1:2*N])
plot(tau,rho,'o')
show()
direkte Berechnung:
rho=zeros(1,2*N-1);
tau=zeros(1,2*N-1);
mxe=sum(g.*x)/sum(g);
vxe=sum(g.*x.^2)/sum(g)-(sum(g.*x)/sum(g))^2;
for k=-(N-1):N-1
tau(mod(k,2*N-1)+1)=k*dt;
sum1=0;
sum0=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*(x(i)-mxe)*(x(i+abs(k))-mxe);
sum0=sum0+g(i)*g(i+abs(k));
end
rho(mod(k,2*N-1)+1)=sum1/sum0/vxe;
end
plot(tau,rho,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
tau=circshift((-(N-1):N-1)*dt,[0;N]);
mxe=sum(g.*x)/sum(g);
vxe=sum(g.*x.^2)/sum(g)-(sum(g.*x)/sum(g))^2;
X1=fft([g.*(x-mxe),zeros(1,N)]);
E1=dt^2*abs(X1).^2;
X0=fft([g,zeros(1,N)]);
E0=dt^2*abs(X0).^2;
rho=real(ifft(E1))./real(ifft(E0))/vxe;
rho=[rho(1:N),rho(N+2:end)];
plot(tau,rho,'o')
(Auto-)Korrelationskoeffizientenfunktion (mit lokaler Normierung, asymptotisch erwartungstreu) ρk=ρ(τk)=i=0N1|k|gigi+|k|(xix)(xi+|k|x)[i=0N1|k|gigi+|k|(xix)2][i=0N1|k|gigi+|k|(xi+|k|x)2]
τk=kΔt
k=(N1)N1
(außerhalb dieses Bereichs nicht bekannt)
direkte Berechnung:
rho=zeros(2*N-1)
tau=zeros(2*N-1)
mxe=sum(g*x)/float(sum(g))
for k in range(-(N-1),N):
  tau[k]=k*dt
  sum1=0
  sum2=0
  sum3=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*(x[i]-mxe)*(x[i+abs(k)]-mxe)
    sum2+=g[i]*g[i+abs(k)]*(x[i]-mxe)**2
    sum3+=g[i]*g[i+abs(k)]*(x[i+abs(k)]-mxe)**2
  
  rho[k]=sum1/sqrt(sum2*sum3)

plot(tau,rho,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=roll(arange(-(N-1),N)*dt,N)
mxe=sum(g*x)/float(sum(g))
X=fft(append(g*(x-mxe),zeros(N)))
Q=fft(append(g*(x-mxe)**2,zeros(N)))
O=fft(append(g,zeros(N)))
EX=dt**2*abs(X)**2
EA=dt**2*conj(Q)*O
EB=dt**2*conj(O)*Q
CEX=real(ifft(EX))/float(dt)
CEA=real(ifft(EA))/float(dt)
CEB=real(ifft(EB))/float(dt)
rho=CEX/sqrt(CEA*CEB)
rho=append(rho[0:N],rho[N+1:2*N])
plot(tau,rho,'o')
show()
direkte Berechnung:
rho=zeros(1,2*N-1);
tau=zeros(1,2*N-1);
mxe=sum(g.*x)/sum(g);
for k=-(N-1):N-1
tau(mod(k,2*N-1)+1)=k*dt;
sum1=0;
sum2=0;
sum3=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*(x(i)-mxe)*(x(i+abs(k))-mxe);
sum2=sum2+g(i)*g(i+abs(k))*(x(i)-mxe)^2;
sum3=sum3+g(i)*g(i+abs(k))*(x(i+abs(k))-mxe)^2;
end
rho(mod(k,2*N-1)+1)=sum1/sqrt(sum2*sum3);
end
plot(tau,rho,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
tau=circshift((-(N-1):N-1)*dt,[0;N]);
mxe=sum(g.*x)/sum(g);
X=fft([g.*(x-mxe),zeros(1,N)]);
Q=fft([g.*(x-mxe).^2,zeros(1,N)]);
O=fft([g,zeros(1,N)]);
EX=dt^2*abs(X).^2;
EA=dt^2*conj(Q).*O;
EB=dt^2*conj(O).*Q;
CEX=real(ifft(EX))/dt;
CEA=real(ifft(EA))/dt;
CEB=real(ifft(EB))/dt;
rho=REX./sqrt(CEA.*CEB);
rho=[rho(1:N),rho(N+2:end)];
plot(tau,rho,'o')
(Auto-)Leistungsdichtespektrum (erwartungstreu) (wegen der nötigen Normierung nur über die Korrelationsfunktion, evtl. Einschränkung des verwendeten Bereichs der Korrelationsfunktion zur Reduktion der Schätzvarianz des Leistungsdichtespektrums, K2N1)
Sj=S(fj)=ΔtFFT{Rk}=Δtk=K/2(K1)/2Rk𝐞2π𝐢jk/K
(imaginäre Einheit 𝐢)
fj=jKΔt
j=K/2(K1)/2
Berechnung aus Korrelationsfunktion mittels zweifacher Anwendung des Wiener-Chintschin-Theorems, direkte Bestimmung der primären Spektren:
from numpy.fft import *
X1=fft(append(g*x,zeros(N)))
E1=dt**2*abs(X1)**2
X0=fft(append(g,zeros(N)))
E0=dt**2*abs(X0)**2
RA=real(ifft(E1))/real(ifft(E0))
K=100
K=minimum(2*N-1,K)
R=zeros(K)
for k in range(-(K//2),(K-1)//2+1):
  R[k]=RA[k]

f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
S=dt*real(fft(R))
plot(f,S,'o')
show()
Berechnung aus direkt bestimmter Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
K=100
K=minimum(2*N-1,K)
R=zeros(K)
for k in range(-(K//2),(K-1)//2+1):
  sum1=0
  sum0=0
  for i in range(0,N-abs(k)):
    sum1+=g[i]*g[i+abs(k)]*x[i]*x[i+abs(k)]
    sum0+=g[i]*g[i+abs(k)]
  
  R[k]=sum1/float(sum0)

f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
S=dt*real(fft(R))
plot(f,S,'o')
show()
Berechnung aus Korrelationsfunktion mittels zweifacher Anwendung des Wiener-Chintschin-Theorems, direkte Bestimmung der primären Spektren:
X1=fft([g.*x,zeros(1,N)]);
E1=dt^2*abs(X1).^2;
X0=fft([g,zeros(1,N)]);
E0=dt^2*abs(X0).^2;
RA=real(ifft(E1))./real(ifft(E0));
K=100;
K=min(2*N-1,K);
R=zeros(1,K);
for k=-floor(K/2):floor((K-1)/2)
R(mod(k,K)+1)=RA(mod(k,2*N)+1);
end
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
S=dt*real(fft(R));
plot(f,S,'o')
Berechnung aus direkt bestimmter Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
K=100;
K=min(2*N-1,K);
R=zeros(1,K);
for k=-floor(K/2):floor((K-1)/2)
sum1=0;
sum0=0;
for i=1:N-abs(k)
sum1=sum1+g(i)*g(i+abs(k))*x(i)*x(i+abs(k));
sum0=sum0+g(i)*g(i+abs(k));
end
R(mod(k,K)+1)=sum1/sum0;
end
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
S=dt*real(fft(R));
plot(f,S,'o')