Signal- und Messdatenverarbeitung


Codes für komplexe, periodische Signalpaare, mit Gewichtung

Python Matlab/Octave
Vorbereitung (Laden von Modulen/Paketen)
from numpy import *
from numpy.random import *
from matplotlib.pyplot import *
Generieren von N komplexen Wertepaaren (xi,yi) mit i=0N1 (harmonisches Signal als Beispiel, mit einem Erwartungswert verschieden von null, ohne Rauschen)
N=100
dt=1.0
t=arange(0,N)*dt
x=3+1j+1.5*exp(0.1j*pi*t)
y=2+1.5j+1*exp(0.1j*pi*t-0.3)
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
show()
N=100;
dt=1.0;
t=(0:N-1)*dt;
x=3+1j+1.5*exp(0.1j*pi*t);
y=2+1.5j+1*exp(0.1j*pi*t-0.3);
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
Überlagerung von Rauschen
x+=normal(0,0.1,N)+1j*normal(0,0.1,N)
y+=normal(0,0.1,N)+1j*normal(0,0.1,N)
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
show()
x=x+0.1*randn(1,N)+1j*0.1*randn(1,N);
y=y+0.1*randn(1,N)+1j*0.1*randn(1,N);
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
Generieren von N reellen Gewichten (gi,hi) mit i=0N1, passend zu den (xi,yi) mit i=0N1 (Kosinusfenster als Beispiel)
g=sin(pi*(arange(0,N)+0.5)/float(N))
h=sin(pi*(arange(0,N)+0.5)/float(N))
plot(t,g,'o',t,h,'o')
show()
g=sin(pi*((0:N-1)+0.5)/N);
h=sin(pi*((0:N-1)+0.5)/N);
plot(t,g,'o',t,h,'o')
Mittelwerte (erwartungstreu) x=i=0N1gixii=0N1gi
y=i=0N1hiyii=0N1hi
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
Varianzen (ohne Rauschen asymptotisch erwartungstreu, da selbst für streng periodische Signale der Mittelwert eine Schätzgröße ist, mit Rauschen systematische Fehler) sx2=i=0N1gi(xix)*(xix)i=0N1gi=i=0N1gi|xix|2i=0N1gi
=i=0N1gixi*xii=0N1gix*x=i=0N1gi|xi|2i=0N1gi|x|2
sy2=i=0N1hi(yiy)*(yiy)i=0N1hi=i=0N1hi|yiy|2i=0N1hi
=i=0N1hiyi*yii=0N1hiy*y=i=0N1hi|yi|2i=0N1hi|y|2
vxe=sum(g*abs(x)**2)/float(sum(g))-abs(sum(g*x)/float(sum(g)))**2
vye=sum(h*abs(y)**2)/float(sum(h))-abs(sum(h*y)/float(sum(h)))**2
vxe=sum(g.*abs(x).^2)/sum(g)-abs(sum(g.*x)/sum(g))^2;
vye=sum(h.*abs(y).^2)/sum(h)-abs(sum(h.*y)/sum(h))^2;
Kreuzkovarianz (asymptotisch erwartungstreu, da selbst für streng periodische Signale der Mittelwert eine Schätzgröße ist) cyx=cxy*=i=0N1gihi(xix)*(yiy)i=0N1gihi
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
sum(g*h*conj(x-mxe)*(y-mye))/float(sum(g*h))
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
sum(g.*h.*conj(x-mxe).*(y-mye))/sum(g.*h)
(Kreuz-)Korrelationskoeffizient (ohne Rauschen asymptotisch erwartungstreu, da selbst für streng periodische Signale der Mittelwert eine Schätzgröße ist, mit Rauschen systematische Fehler) γyx=γxy*=cyxsx2sy2=[i=0N1gihi(xix)*(yiy)](i=0N1gi)(i=0N1hi)(i=0N1gihi)(i=0N1gi|xix|2)(i=0N1hi|yiy|2)
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
sum(g*h*conj(x-mxe)*(y-mye))*sqrt(sum(g)*sum(h))/(sum(g*h)*sqrt(sum(g*abs(x-mxe)**2)*sum(h*abs(y-mye)**2)))
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
sum(g.*h.*conj(x-mxe).*(y-mye))*sqrt(sum(g)*sum(h))/(sum(g.*h)*sqrt(sum(g.*abs(x-mxe).^2)*sum(h.*abs(y-mye).^2)))
(Kreuz-)Korrelationskoeffizient (mit lokaler Normierung, ohne Rauschen asymptotisch erwartungstreu, da selbst für streng periodische Signale der Mittelwert eine Schätzgröße ist, mit Rauschen systematische Fehler) γyx=γxy*=i=0N1gihi(xix)*(yiy)(i=0N1gihi|xix|2)(i=0N1gihi|yiy|2)
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
sum(g*h*conj(x-mxe)*(y-mye))/sqrt(sum(g*h*abs(x-mxe)**2)*sum(g*h*abs(y-mye)**2))
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
sum(g.*h.*conj(x-mxe).*(y-mye))/sqrt(sum(g.*h.*abs(x-mxe).^2)*sum(g.*h.*abs(y-mye).^2))
Kreuzkorrelationsfunktion (erwartungstreu) Ryx,k=Ryx(τk)=Rxy*(τk)=i=0N1gih(i+k)modNxi*y(i+k)modNi=0N1gih(i+k)modN
τk=kΔt
k=
direkte Berechnung:
Ryx=zeros(N)+0j
tau=arange(0,N)*dt
for k in range(0,N):
  sum1=0+0j
  sum0=0
  for i in range(0,N):
    sum1+=g[i]*h[(i+k)%N]*conj(x[i])*y[(i+k)%N]
    sum0+=g[i]*h[(i+k)%N]
  
  Ryx[k]=sum1/float(sum0)

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=arange(0,N)*dt
X1=fft(g*x)
Y1=fft(h*y)
P1=conj(X1)*Y1/N**2
X0=fft(g)
Y0=fft(h)
P0=conj(X0)*Y0/N**2
Ryx=ifft(P1)/ifft(P0)
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
direkte Berechnung:
Ryx=zeros(1,N)+0j;
tau=(0:N-1)*dt;
for k=0:N-1
sum1=0+0j;
sum0=0;
for i=1:N
sum1=sum1+g(i)*h(mod(i+k-1,N)+1)*conj(x(i))*y(mod(i+k-1,N)+1);
sum0=sum0+g(i)*h(mod(i+k-1,N)+1);
end
Ryx(k+1)=sum1/sum0;
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
tau=(0:N-1)*dt;
X1=fft(g.*x);
Y1=fft(h.*y);
P1=conj(X1).*Y1/N^2;
X0=fft(g);
Y0=fft(h);
P0=conj(X0).*Y0/N^2;
Ryx=ifft(P1)./ifft(P0);
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
Berechnung für den Fall, dass die Signallängen Nx bzw. Ny von der anzuwendende Periode des Signals Ñ abweichen (ÑNx, ÑNy) Ryx,k=Ryx(τk)=Rxy*(τk)=i=0Ny1j=0N1jikmodÑxgihjxi*yji=0Nx1j=0Ny1jikmodÑgihj
τk=kΔt
k=
direkte Berechnung:
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
R1=zeros(NT)+0j
R0=zeros(NT)
for i in range(0,Nx):
  for j in range(0,Ny):
    R1[(j-i)%NT]+=g[i]*h[j]*conj(x[i])*y[j]
    R0[(j-i)%NT]+=g[i]*h[j]
  

tau=arange(0,NT)*dt
Ryx=zeros(NT)+0j
for k in range(0,NT):
  Ryx[k]=R1[k]/R0[k]

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
xp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Nx):
  xp[i%NT]+=g[i]*x[i]
  wp[i%NT]+=g[i]

X1=fft(xp)
X0=fft(wp)
yp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Ny):
  yp[i%NT]+=h[i]*y[i]
  wp[i%NT]+=h[i]

Y1=fft(yp)
Y0=fft(wp)
tau=arange(0,NT)*dt
P1=conj(X1)*Y1/NT**2
P0=conj(X0)*Y0/NT**2
Ryx=ifft(P1)/real(ifft(P0))
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
direkte Berechnung:
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
R1=zeros(1,NT)+0j;
R0=zeros(1,NT);
for i=1:Nx
for j=1:Ny
R1(mod(j-i,NT)+1)=R1(mod(j-i,NT)+1)+g(i)*h(j)*conj(x(i))*y(j);
R0(mod(j-i,NT)+1)=R0(mod(j-i,NT)+1)+g(i)*h(j);
end
end
tau=(0:NT-1)*dt;
Ryx=zeros(1,NT)+0j;
for k=1:NT
Ryx(k)=R1(k)/R0(k);
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
xp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Nx
xp(mod(i-1,NT)+1)=xp(mod(i-1,NT)+1)+g(i)*x(i);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+g(i);
end
X1=fft(xp);
X0=fft(wp);
yp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Ny
yp(mod(i-1,NT)+1)=yp(mod(i-1,NT)+1)+h(i)*y(i);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+h(i);
end
Y1=fft(yp);
Y0=fft(wp);
tau=(0:NT-1)*dt;
P1=conj(X1).*Y1/NT^2;
P0=conj(X0).*Y0/NT^2;
Ryx=ifft(P1)./real(ifft(P0));
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
Kreuzkovarianzfunktion (asymptotisch erwartungstreu) Cyx,k=Cyx(τk)=Cxy*(τk)=i=0N1gih(i+k)modN(xix)*[y(i+k)modNy]i=0N1gih(i+k)modN
τk=kΔt
k=
direkte Berechnung:
Cyx=zeros(N)+0j
tau=arange(0,N)*dt
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
for k in range(0,N):
  sum1=0+0j
  sum0=0
  for i in range(0,N):
    sum1+=g[i]*h[(i+k)%N]*conj(x[i]-mxe)*(y[(i+k)%N]-mye)
    sum0+=g[i]*h[(i+k)%N]
  
  Cyx[k]=sum1/float(sum0)

plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
show()
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=arange(0,N)*dt
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
X1=fft(g*(x-mxe))
Y1=fft(h*(y-mye))
P1=conj(X1)*Y1/N**2
X0=fft(g)
Y0=fft(h)
P0=conj(X0)*Y0/N**2
Cyx=ifft(P1)/ifft(P0)
plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
show()
direkte Berechnung:
Cyx=zeros(1,N)+0j;
tau=(0:N-1)*dt;
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
for k=0:N-1
sum1=0+0j;
sum0=0;
for i=1:N
sum1=sum1+g(i)*h(mod(i+k-1,N)+1)*conj(x(i)-mxe)*(y(mod(i+k-1,N)+1)-mye);
sum0=sum0+g(i)*h(mod(i+k-1,N)+1);
end
Cyx(k+1)=sum1/sum0;
end
plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
tau=(0:N-1)*dt;
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
X1=fft(g.*(x-mxe));
Y1=fft(h.*(y-mye));
P1=conj(X1).*Y1/N^2;
X0=fft(g);
Y0=fft(h);
P0=conj(X0).*Y0/N^2;
Cyx=ifft(P1)./ifft(P0);
plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
Berechnung für den Fall, dass die Signallängen Nx bzw. Ny von der anzuwendende Periode des Signals Ñ abweichen (ÑNx, ÑNy) Cyx,k=Cyx(τk)=Cxy*(τk)=i=0Nx1j=0Ny1jikmodÑgihj(xix)*(yjy)i=0Nx1j=0Ny1jikmodÑgihj
τk=kΔt
k=
direkte Berechnung:
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
C1=zeros(NT)+0j
C0=zeros(NT)
for i in range(0,Nx):
  for j in range(0,Ny):
    C1[(j-i)%NT]+=g[i]*h[j]*conj(x[i]-mxe)*(y[j]-mye)
    C0[(j-i)%NT]+=g[i]*h[j]
  

tau=arange(0,NT)*dt
Cyx=zeros(NT)+0j
for k in range(0,NT):
  Cyx[k]=C1[k]/C0[k]

plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
show()
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
xp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Nx):
  xp[i%NT]+=g[i]*(x[i]-mxe)
  wp[i%NT]+=g[i]

X1=fft(xp)
X0=fft(wp)
yp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Ny):
  yp[i%NT]+=h[i]*(y[i]-mye)
  wp[i%NT]+=h[i]

Y1=fft(yp)
Y0=fft(wp)
tau=arange(0,NT)*dt
P1=conj(X1)*Y1/NT**2
P0=conj(X0)*Y0/NT**2
Cyx=ifft(P1)/real(ifft(P0))
plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
show()
direkte Berechnung:
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
C1=zeros(1,NT)+0j;
C0=zeros(1,NT);
for i=1:Nx
for j=1:Ny
C1(mod(j-i,NT)+1)=C1(mod(j-i,NT)+1)+g(i)*h(j)*conj(x(i)-mxe)*(y(j)-mye);
C0(mod(j-i,NT)+1)=C0(mod(j-i,NT)+1)+g(i)*h(j);
end
end
tau=(0:NT-1)*dt;
Cyx=zeros(1,NT)+0j;
for k=1:NT
Cyx(k)=C1(k)/C0(k);
end
plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
xp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Nx
xp(mod(i-1,NT)+1)=xp(mod(i-1,NT)+1)+g(i)*(x(i)-mxe);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+g(i);
end
X1=fft(xp);
X0=fft(wp);
yp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Ny
yp(mod(i-1,NT)+1)=yp(mod(i-1,NT)+1)+h(i)*(y(i)-mye);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+h(i);
end
Y1=fft(yp);
Y0=fft(wp);
tau=(0:NT-1)*dt;
P1=conj(X1).*Y1/NT^2;
P0=conj(X0).*Y0/NT^2;
Cyx=ifft(P1)./real(ifft(P0));
plot(tau,real(Cyx),'o',tau,imag(Cyx),'o')
Kreuzkorrelationskoeffizientenfunktion (ohne Rauschen asymptotisch erwartungstreu, mit Rauschen systematische Fehler) ρyx,k=ρyx(τk)=ρxy*(τk)=Cyx,ksx2sy2=i=0N1gih(i+k)modN(xix)*[y(i+k)modNy]sx2sy2i=0N1gih(i+k)modN
τk=kΔt
k=
direkte Berechnung:
rhoyx=zeros(N)+0j
tau=arange(0,N)*dt
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
vxe=sum(g*abs(x)**2)/float(sum(g))-abs(sum(g*x)/float(sum(g)))**2
vye=sum(h*abs(y)**2)/float(sum(h))-abs(sum(h*y)/float(sum(h)))**2
for k in range(0,N):
  sum1=0+0j
  sum0=0
  for i in range(0,N):
    sum1+=g[i]*h[(i+k)%N]*conj(x[i]-mxe)*(y[(i+k)%N]-mye)
    sum0+=g[i]*h[(i+k)%N]
  
  rhoyx[k]=sum1/float(sum0)/sqrt(vxe*vye)

plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
show()
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=arange(0,N)*dt
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
vxe=sum(g*abs(x)**2)/float(sum(g))-abs(sum(g*x)/float(sum(g)))**2
vye=sum(h*abs(y)**2)/float(sum(h))-abs(sum(h*y)/float(sum(h)))**2
X1=fft(g*(x-mxe))
Y1=fft(h*(y-mye))
P1=conj(X1)*Y1/N**2
X0=fft(g)
Y0=fft(h)
P0=conj(X0)*Y0/N**2
rhoyx=ifft(P1)/ifft(P0)/sqrt(vxe*vye)
plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
show()
direkte Berechnung:
rhoyx=zeros(1,N)+0j;
tau=(0:N-1)*dt;
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
vxe=sum(g.*abs(x).^2)/sum(g)-abs(sum(g.*x)/sum(g))^2;
vye=sum(h.*abs(y).^2)/sum(h)-abs(sum(h.*y)/sum(h))^2;
for k=0:N-1
sum1=0+0j;
sum0=0;
for i=1:N
sum1=sum1+g(i)*h(mod(i+k-1,N)+1)*conj(x(i)-mxe)*(y(mod(i+k-1,N)+1)-mye);
sum0=sum0+g(i)*h(mod(i+k-1,N)+1);
end
rhoyx(k+1)=sum1/sum0/sqrt(vxe*vye);
end
plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
tau=(0:N-1)*dt;
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
vxe=sum(g.*abs(x).^2)/sum(g)-abs(sum(g.*x)/sum(g))^2;
vye=sum(h.*abs(y).^2)/sum(h)-abs(sum(h.*y)/sum(h))^2;
X1=fft(g.*(x-mxe));
Y1=fft(h.*(y-mye));
P1=conj(X1).*Y1/N^2;
X0=fft(g);
Y0=fft(h);
P0=conj(X0).*Y0/N^2;
rhoyx=ifft(P1)./ifft(P0)/sqrt(vxe*vye);
plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
Berechnung für den Fall, dass die Signallängen Nx bzw. Ny von der anzuwendende Periode des Signals Ñ abweichen (ÑNx, ÑNy) ρyx,k=ρyx(τk)=ρxy*(τk)=Cyx,ksx2sy2=i=0Nx1j=0Ny1jikmodÑgihj(xix)*(yjy)sx2sy2i=0Nx1j=0Ny1jikmodÑgihj
τk=kΔt
k=
direkte Berechnung:
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
vxe=sum(g*abs(x)**2)/float(sum(g))-abs(sum(g*x)/float(sum(g)))**2
vye=sum(h*abs(y)**2)/float(sum(h))-abs(sum(h*y)/float(sum(h)))**2
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
C1=zeros(NT)+0j
C0=zeros(NT)
for i in range(0,Nx):
  for j in range(0,Ny):
    C1[(j-i)%NT]+=g[i]*h[j]*conj(x[i]-mxe)*(y[j]-mye)
    C0[(j-i)%NT]+=g[i]*h[j]
  

tau=arange(0,NT)*dt
rhoyx=zeros(NT)+0j
for k in range(0,NT):
  rhoyx[k]=C1[k]/C0[k]/sqrt(vxe*vye)

plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
show()
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
mxe=sum(g*x)/float(sum(g))
mye=sum(h*y)/float(sum(h))
vxe=sum(g*abs(x)**2)/float(sum(g))-abs(sum(g*x)/float(sum(g)))**2
vye=sum(h*abs(y)**2)/float(sum(h))-abs(sum(h*y)/float(sum(h)))**2
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
xp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Nx):
  xp[i%NT]+=g[i]*(x[i]-mxe)
  wp[i%NT]+=g[i]

X1=fft(xp)
X0=fft(wp)
yp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Ny):
  yp[i%NT]+=h[i]*(y[i]-mye)
  wp[i%NT]+=h[i]

Y1=fft(yp)
Y0=fft(wp)
tau=arange(0,NT)*dt
P1=conj(X1)*Y1/NT**2
P0=conj(X0)*Y0/NT**2
rhoyx=ifft(P1)/real(ifft(P0))/sqrt(vxe*vye)
plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
show()
direkte Berechnung:
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
vxe=sum(g.*abs(x).^2)/sum(g)-abs(sum(g.*x)/sum(g))^2;
vye=sum(h.*abs(y).^2)/sum(h)-abs(sum(h.*y)/sum(h))^2;
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
C1=zeros(1,NT)+0j;
C0=zeros(1,NT);
for i=1:Nx
for j=1:Ny
C1(mod(j-i,NT)+1)=C1(mod(j-i,NT)+1)+g(i)*h(j)*conj(x(i)-mxe)*(y(j)-mye);
C0(mod(j-i,NT)+1)=C0(mod(j-i,NT)+1)+g(i)*h(j);
end
end
tau=(0:NT-1)*dt;
rhoyx=zeros(1,NT)+0j;
for k=1:NT
rhoyx(k)=C1(k)/C0(k)/sqrt(vxe*vye);
end
plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
Berechnung aus Leistungsspektrum mittels Wiener-Chintschin-Theorem:
mxe=sum(g.*x)/sum(g);
mye=sum(h.*y)/sum(h);
vxe=sum(g.*abs(x).^2)/sum(g)-abs(sum(g.*x)/sum(g))^2;
vye=sum(h.*abs(y).^2)/sum(h)-abs(sum(h.*y)/sum(h))^2;
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
xp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Nx
xp(mod(i-1,NT)+1)=xp(mod(i-1,NT)+1)+g(i)*(x(i)-mxe);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+g(i);
end
X1=fft(xp);
X0=fft(wp);
yp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Ny
yp(mod(i-1,NT)+1)=yp(mod(i-1,NT)+1)+h(i)*(y(i)-mye);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+h(i);
end
Y1=fft(yp);
Y0=fft(wp);
tau=(0:NT-1)*dt;
P1=conj(X1).*Y1/NT^2;
P0=conj(X0).*Y0/NT^2;
rhoyx=ifft(P1)./real(ifft(P0))/sqrt(vxe*vye);
plot(tau,real(rhoyx),'o',tau,imag(rhoyx),'o')
Kreuzleistungsspektrum (erwartungstreu) (wegen der nötigen Entfaltung mit dem Leistungsspektrum der Gewichte nur über die Korrelationsfunktion)
Pyx,j=Pyx(fj)=1NFFT{Ryx,k}=1Nk=0N1Ryx,k𝐞2π𝐢jk/N
(imaginäre Einheit 𝐢)
fj=jNΔt
j=N/2(N1)/2
Berechnung aus Korrelationsfunktion mittels zweifacher Anwendung des Wiener-Chintschin-Theorems, direkte Bestimmung der primären Spektren:
from numpy.fft import *
X1=fft(g*x)
Y1=fft(h*y)
P1=conj(X1)*Y1/N**2
X0=fft(g)
Y0=fft(h)
P0=conj(X0)*Y0/N**2
Ryx=ifft(P1)/ifft(P0)
f=roll(arange(-(N//2),N-(N//2))/float(N*dt),N-(N//2))
Pyx=fft(Ryx)/float(N)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
Berechnung aus direkt bestimmter Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
Ryx=zeros(N)+0j
for k in range(0,N):
  sum1=0+0j
  sum0=0
  for i in range(0,N):
    sum1+=g[i]*h[(i+k)%N]*conj(x[i])*y[(i+k)%N]
    sum0+=g[i]*h[(i+k)%N]
  
  Ryx[k]=sum1/float(sum0)

f=roll(arange(-(N//2),N-(N//2))/float(N*dt),N-(N//2))
Pyx=fft(Ryx)/float(N)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
Berechnung aus Korrelationsfunktion mittels zweifacher Anwendung des Wiener-Chintschin-Theorems, direkte Bestimmung der primären Spektren:
X1=fft(g.*x);
Y1=fft(h.*y);
P1=conj(X1).*Y1/N^2;
X0=fft(g);
Y0=fft(h);
P0=conj(X0).*Y0/N^2;
Ryx=ifft(P1)./ifft(P0);
f=circshift(((-N/2:N-N/2-1))/(N*dt),[0;N/2]);
Pyx=fft(Ryx)/N;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Berechnung aus direkt bestimmter Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
Ryx=zeros(1,N)+0j;
for k=0:N-1
sum1=0+0j;
sum0=0;
for i=1:N
sum1=sum1+g(i)*h(mod(i+k-1,N)+1)*conj(x(i))*y(mod(i+k-1,N)+1);
sum0=sum0+g(i)*h(mod(i+k-1,N)+1);
end
Ryx(k+1)=sum1/sum0;
end
f=circshift(((-N/2:N-N/2-1))/(N*dt),[0;N/2]);
Pyx=fft(Ryx)/N;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Berechnung für den Fall, dass die Signallängen Nx bzw. Ny von der anzuwendende Periode des Signals Ñ abweichen (ÑNx, ÑNy) (wegen der nötigen Entfaltung mit dem Leistungsspektrum der Gewichte nur über die Korrelationsfunktion)
Pyx,j=Pyx(fj)=1ÑFFT{Ryx,k}=1Ñk=0Ñ1Ryx,k𝐞2π𝐢jk/Ñ
(imaginäre Einheit 𝐢)
fj=jÑΔt
j=Ñ/2(Ñ1)/2
Berechnung aus Korrelationsfunktion mittels zweifacher Anwendung des Wiener-Chintschin-Theorems, direkte Bestimmung der primären Spektren:
from numpy.fft import *
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
xp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Nx):
  xp[i%NT]+=g[i]*x[i]
  wp[i%NT]+=g[i]

X1=fft(xp)
X0=fft(wp)
yp=zeros(NT)+0j
wp=zeros(NT)
for i in range(0,Ny):
  yp[i%NT]+=h[i]*y[i]
  wp[i%NT]+=h[i]

Y1=fft(yp)
Y0=fft(wp)
P1=conj(X1)*Y1/NT**2
P0=conj(X0)*Y0/NT**2
Ryx=ifft(P1)/real(ifft(P0))
f=roll(arange(-(NT//2),(NT+1)//2)/float(NT*dt),(NT+1)//2)
Pyx=fft(Ryx)/float(NT)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
Berechnung aus direkt bestimmter Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
NT=60 #Periodenlänge NT≤N
Nx=len(x)
Ny=len(y)
R1=zeros(NT)+0j
R0=zeros(NT)
for i in range(0,Nx):
  for j in range(0,Ny):
    R1[(j-i)%NT]+=g[i]*h[j]*conj(x[i])*y[j]
    R0[(j-i)%NT]+=g[i]*h[j]
  

Ryx=zeros(NT)+0j
for k in range(0,NT):
  Ryx[k]=R1[k]/R0[k]

f=roll(arange(-(NT//2),(NT+1)//2)/float(NT*dt),(NT+1)//2)
Pyx=fft(Ryx)/float(NT)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
Berechnung aus Korrelationsfunktion mittels zweifacher Anwendung des Wiener-Chintschin-Theorems, direkte Bestimmung der primären Spektren:
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
xp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Nx
xp(mod(i-1,NT)+1)=xp(mod(i-1,NT)+1)+g(i)*x(i);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+g(i);
end
X1=fft(xp);
X0=fft(wp);
yp=zeros(1,NT)+0j;
wp=zeros(1,NT);
for i=1:Ny
yp(mod(i-1,NT)+1)=yp(mod(i-1,NT)+1)+h(i)*y(i);
wp(mod(i-1,NT)+1)=wp(mod(i-1,NT)+1)+h(i);
end
Y1=fft(yp);
Y0=fft(wp);
P1=conj(X1).*Y1/NT^2;
P0=conj(X0).*Y0/NT^2;
Ryx=ifft(P1)./real(ifft(P0));
f=circshift((-fix(NT/2):fix((NT-1)/2))/(NT*dt),[0;fix((NT+1)/2)]);
Pyx=fft(Ryx)/NT;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Berechnung aus direkt bestimmter Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
NT=60; %Periodenlänge NT≤N
Nx=length(x);
Ny=length(y);
R1=zeros(1,NT)+0j;
R0=zeros(1,NT);
for i=1:Nx
for j=1:Ny
R1(mod(j-i,NT)+1)=R1(mod(j-i,NT)+1)+g(i)*h(j)*conj(x(i))*y(j);
R0(mod(j-i,NT)+1)=R0(mod(j-i,NT)+1)+g(i)*h(j);
end
end
Ryx=zeros(1,NT)+0j;
for k=1:NT
Ryx(k)=R1(k)/R0(k);
end
f=circshift((-fix(NT/2):fix((NT-1)/2))/(NT*dt),[0;fix((NT+1)/2)]);
Pyx=fft(Ryx)/NT;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')