Signal- und Messdatenverarbeitung


Codes für stochastisch und gemeinsam abgetastete, komplexe, periodische Signalpaare, ohne Gewichtung

Python Matlab/Octave
Vorbereitung (Laden von Modulen/Paketen)
from numpy import *
from numpy.random import *
from matplotlib.pyplot import *
Generieren von Wertetripeln (ti,xi,yi) mit den Messzeitpunkten ti und den komplexen Messwerten xi und yi (zwei harmonische Signale als Beispiel, mit einem Erwartungswert verschieden von null)
T=1000.0
dr=5.0
mxs=3.0+1.5j
mys=2.0+0.5j
axs=1.5
ays=2.0
t=[]
x=[]
y=[]
te=0.0
while te<T:
  tp=exponential(1.0/dr)
  te+=tp
  if te<T:
    t.append(te)
    x.append(axs*exp(0.05j*pi*te)+mxs)
    y.append(ays*exp(0.05j*pi*te+0.5)+mys)
  

t=array(t)
x=array(x)
y=array(y)
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
show()
T=1000;
dr=5;
mxs=3+1.5j;
mys=2+0.5j;
axs=1.5;
ays=2;
t=[];
x=[];
y=[];
te=0;
while te<T
tp=-log(1-rand())/dr;
te=te+tp;
if te<T
t(end+1)=te;
x(end+1)=axs*exp(0.05j*pi*te)+mxs;
y(end+1)=ays*exp(0.05j*pi*te+0.5)+mys;
end
end
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
Mittelwerte x=1Ni=0N1xi
y=1Ni=0N1yi
mxe=mean(x)
mye=mean(y)
mxe=mean(x)
mye=mean(y)
Varianzen (ohne Bessel-Korrektur, asymptotisch erwartungstreu) sx2=1Ni=0N1(xix)*(xix)=1Ni=0N1|xix|2
=(1Ni=0N1xi*xi)x*x=(1Ni=0N1|xi|2)|x|2
sy2=1Ni=0N1(yiy)*(yiy)=1Ni=0N1|yiy|2
=(1Ni=0N1yi*yi)y*y=(1Ni=0N1|yi|2)|y|2
vxe=var(x)
vye=var(y)
vxe=var(x,1)
vye=var(y,1)
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über Slotkorrelation (ohne koinzidente Produkte, auch für den Fall, dass die anzuwendende Periode kleiner als das Beobachtungsintervall ist) Ryx,k=Ryx(τk)=Rxy*(τk)=i=0N1j=0N1bk(tjti)xi*yji=0N1j=0N1bk(tjti)
bk(t)={1falls 0<|t+cT|<Δt/2 für irgendein ganzes c0sonst
τk=kΔt
k=K/2(K1)/2
K=[T/Δt]
Pyx,j=Pyx(fj)=1KFFT{Ryx,k}=1Kk=K/2(K1)/2Ryx,k𝐞2π𝐢jk/K
(imaginäre Einheit 𝐢)
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
R1=zeros(K)+0j
R0=zeros(K)
for i in range(0,N):
  for j in range(0,N):
    if j!=i:
      k=int(round((t[j]-t[i]-T*round((t[j]-t[i])/float(T)))/float(dt)))
      R1[k]+=conj(x[i])*y[j]
      R0[k]+=1.0
    
  

Ryx=R1/R0
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
R1=zeros(1,K)+0j;
R0=zeros(1,K);
for i=1:N
for j=1:N
if i~=j
k=round((t(j)-t(i)-T*round((t(j)-t(i))/T))/dt);
R1(mod(K+k,K)+1)=R1(mod(K+k,K)+1)+conj(x(i))*y(j);
R0(mod(K+k,K)+1)=R0(mod(K+k,K)+1)+1;
end
end
end
Ryx=R1./R0;
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über Slotkorrelation (ohne koinzidente Produkte, mit lokaler Normierung, auch für den Fall, dass die anzuwendende Periode kleiner als das Beobachtungsintervall ist) Ryx,k=Ryx(τk)=Rxy*(τk)=[i=0N1j=0N1bk(tjti)(xix)*(yjy)]sx2sy2[i=0N1j=0N1bk(tjti)|xix|2][i=0N1j=0N1bk(tjti)|yjy|2]+x*y
bk(t)={1falls 0<|t+cT|<Δt/2 für irgendein ganzes c0sonst
τk=kΔt
k=K/2(K1)/2
K=[T/Δt]
Pyx,j=Pyx(fj)=1KFFT{Ryx,k}=1Kk=K/2(K1)/2Ryx,k𝐞2π𝐢jk/K
(imaginäre Einheit 𝐢)
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
mxe=mean(x)
mye=mean(y)
vxe=var(x)
vye=var(y)
R1=zeros(K)+0j
R2=zeros(K)
R3=zeros(K)
for i in range(0,N):
  for j in range(0,N):
    if j!=i:
      k=int(round((t[j]-t[i]-T*round((t[j]-t[i])/float(T)))/float(dt)))
      R1[k]+=conj(x[i]-mxe)*(y[j]-mye)
      R2[k]+=abs(x[i]-mxe)**2
      R3[k]+=abs(y[j]-mye)**2
    
  

Ryx=sqrt(vxe*vye)*R1/sqrt(R2*R3)+conj(mxe)*mye
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
mxe=mean(x);
mye=mean(y);
vxe=var(x,1);
vye=var(y,1);
R1=zeros(1,K)+0j;
R2=zeros(1,K);
R3=zeros(1,K);
for i=1:N
for j=1:N
if i~=j
k=round((t(j)-t(i)-T*round((t(j)-t(i))/T))/dt);
R1(mod(K+k,K)+1)=R1(mod(K+k,K)+1)+conj(x(i)-mxe)*(y(j)-mye);
R2(mod(K+k,K)+1)=R2(mod(K+k,K)+1)+abs(x(i)-mxe)^2;
R3(mod(K+k,K)+1)=R3(mod(K+k,K)+1)+abs(y(j)-mye)^2;
end
end
end
Ryx=sqrt(vxe*vye)*R1./sqrt(R2.*R3)+conj(mxe)*mye;
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der koinzidenten Produkte, ohne Normierung) Eyx,j=Eyx(fj)=T2N(N1){Xj*Yji=0N1xi*yi}
Xj=i=0N1xi𝐞2π𝐢fjti
Yj=i=0N1yi𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J=[T/Δt]
RE,yx,k=RE,yx(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
Ryx,k=Ryx(τk)=Rxy*(τk)=1TRE,yx,k
τk=kΔt
k=K/2(K1)/2
K=J=[T/Δt]
Pyx,j=Pyx(fj)=1KFFT{Ryx,k}=1Kk=K/2(K1)/2Ryx,k𝐞2π𝐢jk/K
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
J=int(round(T/float(dt)))
fp=roll(arange(-(J//2),(J+1)//2)/float(J*dt),(J+1)//2)
X=zeros(size(fp))+0j
Y=zeros(size(fp))+0j
for i in range(0,N):
  X+=x[i]*exp(-2j*pi*fp*t[i])
  Y+=y[i]*exp(-2j*pi*fp*t[i])

Eyx=T**2*(conj(X)*Y-sum(conj(x)*y))/float(N**2-N)
REyx=ifft(Eyx)/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  Ryx[k]=REyx[k]/float(T)

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
J=round(T/dt);
fp=circshift((-fix(J/2):fix((J-1)/2))/(J*dt),[0;fix((J+1)/2)]);
X=zeros(size(fp))+0j;
Y=zeros(size(fp))+0j;
for i=1:N
X=X+x(i)*exp(-2j*pi*fp*t(i));
Y=Y+y(i)*exp(-2j*pi*fp*t(i));
end
Eyx=T^2*(conj(X).*Y-sum(conj(x).*y))/(N^2-N);
REyx=ifft(Eyx)/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
for k=-fix(K/2):fix((K-1)/2)
Ryx(mod(k+K,K)+1)=REyx(mod(k+length(REyx),length(REyx))+1)/T;
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der koinzidenten Produkte, mit Normierung, auch für den Fall, dass die anzuwendende Periode kleiner als das Beobachtungsintervall ist) Eyx,j=Eyx(fj)=T2N(N1){Xj*Yji=0N1xi*yi}
Eyx,j=Eyx(fj)=T2N(N1){|Xj|2N}
Xj=i=0N1xi𝐞2π𝐢fjti
Yj=i=0N1yi𝐞2π𝐢fjti
Xj=i=0N1𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J=[T/Δt]
RE,yx,k=RE,yx(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
RE,yx,k=RE,yx(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
Ryx,k=Ryx(τk)=Rxy*(τk)=RE,yx,kRE,yx,k
τk=kΔt
k=K/2(K1)/2
K=J=[T/Δt]
Pyx,j=Pyx(fj)=1KFFT{Ryx,k}=1Kk=K/2(K1)/2Ryx,k𝐞2π𝐢jk/K
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
J=int(round(T/float(dt)))
fp=roll(arange(-(J//2),(J+1)//2)/float(J*dt),(J+1)//2)
X=zeros(size(fp))+0j
Y=zeros(size(fp))+0j
Xp=zeros(size(fp))+0j
for i in range(0,N):
  X+=x[i]*exp(-2j*pi*fp*t[i])
  Y+=y[i]*exp(-2j*pi*fp*t[i])
  Xp+=exp(-2j*pi*fp*t[i])

Eyx=T**2*(conj(X)*Y-sum(conj(x)*y))/float(N**2-N)
Eyxp=T**2*(abs(Xp)**2-N)/float(N**2-N)
REyx=ifft(Eyx)/float(dt)
REyxp=real(ifft(Eyxp))/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  Ryx[k]=REyx[k]/float(REyxp[k])

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
J=round(T/dt);
fp=circshift((-fix(J/2):fix((J-1)/2))/(J*dt),[0;fix((J+1)/2)]);
X=zeros(size(fp))+0j;
Y=zeros(size(fp))+0j;
Xp=zeros(size(fp))+0j;
for i=1:N
X=X+x(i)*exp(-2j*pi*fp*t(i));
Y=Y+y(i)*exp(-2j*pi*fp*t(i));
Xp=Xp+exp(-2j*pi*fp*t(i));
end
Eyx=T^2*(conj(X).*Y-sum(conj(x).*y))/(N^2-N);
Eyxp=T^2*(abs(Xp).^2-N)/(N^2-N);
REyx=ifft(Eyx)/dt;
REyxp=real(ifft(Eyxp))/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
for k=-fix(K/2):fix((K-1)/2)
Ryx(mod(k+K,K)+1)=REyx(mod(k+length(REyx),length(REyx))+1)/REyxp(mod(k+length(REyxp),length(REyxp))+1);
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der koinzidenten Produkte, mit lokaler Normierung, auch für den Fall, dass die anzuwendende Periode kleiner als das Beobachtungsintervall ist) Eyx,j=Eyx(fj)=T2N(N1){Xj*Yji=0N1(xix)*(yiy)}
Eyx,j=Eyx(fj)=T2N(N1){Xj*Xji=0N1|xix|2}
Eyx,j=Eyx(fj)=T2N(N1){Xj*Yji=0N1|yiy|2}
Xj=i=0N1(xix)𝐞2π𝐢fjti
Yj=i=0N1(yiy)𝐞2π𝐢fjti
Xj=i=0N1𝐞2π𝐢fjti
Xj=i=0N1|xix|2𝐞2π𝐢fjti
Yj=i=0N1|yiy|2𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J=[T/Δt]
RE,yx,k=RE,yx(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
RE,yx,k=RE,yx(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
RE,yx,k=RE(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
Ryx,k=Ryx(τk)=Rxy*(τk)=RE,yx,ksx2sy2RE,yx,kRE,yx,k+x*y
τk=kΔt
k=K/2(K1)/2
K=J=[T/Δt]
Pyx,j=Pyx(fj)=1KFFT{Ryx,k}=1Kk=K/2(K1)/2Ryx,k𝐞2π𝐢jk/K
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
mxe=mean(x)
mye=mean(y)
vxe=var(x)
vye=var(y)
J=int(round(T/float(dt)))
fp=roll(arange(-(J//2),(J+1)//2)/float(J*dt),(J+1)//2)
X=zeros(size(fp))+0j
Y=zeros(size(fp))+0j
Xp=zeros(size(fp))+0j
Xpp=zeros(size(fp))+0j
Ypp=zeros(size(fp))+0j
for i in range(0,N):
  X+=(x[i]-mxe)*exp(-2j*pi*fp*t[i])
  Y+=(y[i]-mye)*exp(-2j*pi*fp*t[i])
  Xp+=exp(-2j*pi*fp*t[i])
  Xpp+=abs(x[i]-mxe)**2*exp(-2j*pi*fp*t[i])
  Ypp+=abs(y[i]-mye)**2*exp(-2j*pi*fp*t[i])

Eyx=T**2*(conj(X)*Y-sum(conj(x-mxe)*(y-mye)))/float(N**2-N)
Eyxp=T**2*(conj(Xpp)*Xp-sum(abs(x-mxe)**2))/float(N**2-N)
Eyxpp=T**2*(conj(Xp)*Ypp-sum(abs(x-mxe)**2))/float(N**2-N)
REyx=ifft(Eyx)/float(dt)
REyxp=real(ifft(Eyxp))/float(dt)
REyxpp=real(ifft(Eyxpp))/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  Ryx[k]=sqrt(vxe*vye)*REyx[k]/sqrt(REyxp[k]*REyxpp[k])+conj(mxe)*mye

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
mxe=mean(x);
mye=mean(y);
vxe=var(x,1);
vye=var(y,1);
J=round(T/dt);
fp=circshift((-fix(J/2):fix((J-1)/2))/(J*dt),[0;fix((J+1)/2)]);
X=zeros(size(fp))+0j;
Y=zeros(size(fp))+0j;
Xp=zeros(size(fp))+0j;
Xpp=zeros(size(fp))+0j;
Ypp=zeros(size(fp))+0j;
for i=1:N
X=X+(x(i)-mxe)*exp(-2j*pi*fp*t(i));
Y=Y+(y(i)-mye)*exp(-2j*pi*fp*t(i));
Xp=Xp+exp(-2j*pi*fp*t(i));
Xpp=Xpp+abs(x(i)-mxe)^2*exp(-2j*pi*fp*t(i));
Ypp=Ypp+abs(y(i)-mye)^2*exp(-2j*pi*fp*t(i));
end
Eyx=T^2*(conj(X).*Y-sum(conj(x-mxe).*(y-mye)))/(N^2-N);
Eyxp=T^2*(conj(Xpp).*Xp-sum(abs(x-mxe).^2))/(N^2-N);
Eyxpp=T^2*(conj(Xp).*Ypp-sum(abs(y-mye).^2))/(N^2-N);
REyx=ifft(Eyx)/dt;
REyxp=real(ifft(Eyxp))/dt;
REyxpp=real(ifft(Eyxpp))/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
for k=-fix(K/2):fix((K-1)/2)
Ryx(mod(k+K,K)+1)=sqrt(vxe*vye)*REyx(mod(k+length(REyx),length(REyx))+1)/sqrt(REyxp(mod(k+length(REyxp),length(REyxp))+1)*REyxpp(mod(k+length(REyxpp),length(REyxpp))+1))+conj(mxe)*mye;
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
(keine Lomb-Scargle-Methode für Kreuzspektren in Matlab und Python)
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über Zeitquantisierung (mit Abzug der koinzidenten Produkte, ohne Normierung)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(round(T/float(dt)))
x1=zeros(J)+0j
y1=zeros(J)+0j
for i in range(0,N):
  j=int(floor((t[i]-T*floor(t[i]/float(T)))/float(dt)))
  x1[j]+=x[i];
  y1[j]+=y[i];

X=fft(x1)
Y=fft(y1)
Eyx=T**2*(conj(X)*Y-sum(conj(x)*y))/float(N**2-N)
REyx=ifft(Eyx)/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  Ryx[k]=REyx[k]/float(T)

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
J=round(T/dt);
x1=zeros([1,J])+0j;
y1=zeros([1,J])+0j;
for i=1:N
j=fix((t(i)-T*fix(t(i)/T))/dt)+1;
x1(j)=x1(j)+x(i);
y1(j)=y1(j)+y(i);
end
X=fft(x1);
Y=fft(y1);
Eyx=T^2*(conj(X).*Y-sum(conj(x).*y))/(N^2-N);
REyx=ifft(Eyx)/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
for k=-fix(K/2):fix((K-1)/2)
Ryx(mod(k+K,K)+1)=REyx(mod(k+length(REyx),length(REyx))+1)/T;
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über Zeitquantisierung (mit Abzug der koinzidenten Produkte, mit Normierung, auch für den Fall, dass die anzuwendende Periode kleiner als das Beobachtungsintervall ist)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(round(T/float(dt)))
x0=zeros(J)
x1=zeros(J)+0j
y1=zeros(J)+0j
for i in range(0,N):
  j=int(floor((t[i]-T*floor(t[i]/float(T)))/float(dt)))
  x0[j]+=1.0;
  x1[j]+=x[i];
  y1[j]+=y[i];

X=fft(x1)
Y=fft(y1)
Xp=fft(x0)
Eyx=T**2*(conj(X)*Y-sum(conj(x)*y))/float(N**2-N)
Eyxp=T**2*(abs(Xp)**2-N)/float(N**2-N)
REyx=ifft(Eyx)/float(dt)
REyxp=real(ifft(Eyxp))/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  Ryx[k]=REyx[k]/float(REyxp[k])

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
J=round(T/dt);
x0=zeros([1,J]);
x1=zeros([1,J])+0j;
y1=zeros([1,J])+0j;
for i=1:N
j=fix((t(i)-T*fix(t(i)/T))/dt)+1;
x0(j)=x0(j)+1;
x1(j)=x1(j)+x(i);
y1(j)=y1(j)+y(i);
end
X=fft(x1);
Y=fft(y1);
Xp=fft(x0);
Eyx=T^2*(conj(X).*Y-sum(conj(x).*y))/(N^2-N);
Eyxp=T^2*(abs(Xp).^2-N)/(N^2-N);
REyx=ifft(Eyx)/dt;
REyxp=real(ifft(Eyxp))/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
for k=-fix(K/2):fix((K-1)/2)
Ryx(mod(k+K,K)+1)=REyx(mod(k+length(REyx),length(REyx))+1)/REyxp(mod(k+length(REyxp),length(REyxp))+1);
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über Zeitquantisierung (mit Abzug der koinzidenten Produkte, mit lokaler Normierung, auch für den Fall, dass die anzuwendende Periode kleiner als das Beobachtungsintervall ist)
from numpy.fft import *
N=len(t)
dt=1.0
mxe=mean(x)
mye=mean(y)
vxe=var(x)
vye=var(y)
J=int(round(T/float(dt)))
x0=zeros(J)
x1=zeros(J)+0j
y1=zeros(J)+0j
x2=zeros(J)
y2=zeros(J)
for i in range(0,N):
  j=int(floor((t[i]-T*floor(t[i]/float(T)))/float(dt)))
  x0[j]+=1.0;
  x1[j]+=x[i]-mxe;
  y1[j]+=y[i]-mye;
  x2[j]+=abs(x[i]-mxe)**2;
  y2[j]+=abs(y[i]-mye)**2;

X=fft(x1)
Y=fft(y1)
Xp=fft(x0)
Xpp=fft(x2)
Ypp=fft(y2)
Eyx=T**2*(conj(X)*Y-sum(conj(x-mxe)*(y-mye)))/float(N**2-N)
Eyxp=T**2*(conj(Xpp)*Xp-sum(abs(x-mxe)**2))/float(N**2-N)
Eyxpp=T**2*(conj(Xp)*Ypp-sum(abs(y-mye)**2))/float(N**2-N)
REyx=ifft(Eyx)/float(dt)
REyxp=real(ifft(Eyxp))/float(dt)
REyxpp=real(ifft(Eyxpp))/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  Ryx[k]=sqrt(vxe*vye)*REyx[k]/sqrt(REyxp[k]*REyxpp[k])+conj(mxe)*mye

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
mxe=mean(x);
mye=mean(y);
vxe=var(x,1);
vye=var(y,1);
J=round(T/dt);
x0=zeros([1,J]);
x1=zeros([1,J])+0j;
y1=zeros([1,J])+0j;
x2=zeros([1,J]);
y2=zeros([1,J]);
for i=1:N
j=fix((t(i)-T*fix(t(i)/T))/dt)+1;
x0(j)=x0(j)+1;
x1(j)=x1(j)+x(i)-mxe;
y1(j)=y1(j)+y(i)-mye;
x2(j)=x2(j)+abs(x(i)-mxe)^2;
y2(j)=y2(j)+abs(y(i)-mye)^2;
end
X=fft(x1);
Y=fft(y1);
Xp=fft(x0);
Xpp=fft(x2);
Ypp=fft(y2);
Eyx=T^2*(conj(X).*Y-sum(conj(x-mxe).*(y-mye)))/(N^2-N);
Eyxp=T^2*(conj(Xpp).*Xp-sum(abs(x-mxe).^2))/(N^2-N);
Eyxpp=T^2*(conj(Xp).*Ypp-sum(abs(y-mye).^2))/(N^2-N);
REyx=ifft(Eyx)/dt;
REyxp=real(ifft(Eyxp))/dt;
REyxpp=real(ifft(Eyxpp))/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
for k=-fix(K/2):fix((K-1)/2)
Ryx(mod(k+K,K)+1)=sqrt(vxe*vye)*REyx(mod(k+length(REyx),length(REyx))+1)/sqrt(REyxp(mod(k+length(REyxp),length(REyxp))+1)*REyxpp(mod(k+length(REyxpp),length(REyxpp))+1))+conj(mxe)*mye;
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
Kreuzkorrelationsfunktion und Kreuzleistungsspektrum über Interpolation (Sample-and-Hold, mit Filterkorrektur, ohne Normierung)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(round(T/float(dt)))
xp=x[N-1]*ones(J)
yp=y[N-1]*ones(J)
for i in range(0,N-1):
  for j in range(int(floor(t[i]/float(dt)))+1,int(floor(t[i+1]/float(dt)))+1):
    if j<J:
      xp[j]=x[i]
      yp[j]=y[i]
    
  

Xp=fft(xp)
Yp=fft(yp)
Eyxp=dt**2*conj(Xp)*Yp
REyxp=ifft(Eyxp)/float(dt)
K=int(round(T/float(dt)))
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
Ryx=zeros(K)+0j
c=exp(-dd/float(dt))/(1-exp(-dd/float(dt)))**2
for k in range(-(K//2),(K+1)//2):
  if k==0:
    Ryx[k]=REyxp[k]/float(T)
  else:
    Ryx[k]=((2*c+1)*REyxp[k]-c*REyxp[k-1]-c*REyxp[k+1])/float(T)
  

plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Pyx=fft(Ryx)/float(K)
plot(f,real(Pyx),'o',f,imag(Pyx),'o')
show()
N=length(t);
dt=1.0;
J=round(T/dt);
xp=x(N)*ones([1,J]);
yp=y(N)*ones([1,J]);
for i=1:N-1
for j=fix(t(i)/dt)+2:fix(t(i+1)/dt)+1
if j<=J
xp(j)=x(i);
yp(j)=y(i);
end
end
end
Xp=fft(xp);
Yp=fft(yp);
Eyxp=dt^2*conj(Xp).*Yp;
REyxp=ifft(Eyxp)/dt;
K=round(T/dt);
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
Ryx=zeros([1,K])+0j;
c=exp(-dd/dt)/(1-exp(-dd/dt))^2;
for k=-fix(K/2):fix((K-1)/2)
if k==0
Ryx(mod(k+K,K)+1)=REyxp(mod(k+length(REyxp),length(REyxp))+1)/T;
else
Ryx(mod(k+K,K)+1)=((2*c+1)*REyxp(mod(k+length(REyxp),length(REyxp))+1)-c*REyxp(mod(k-1+length(REyxp),length(REyxp))+1)-c*REyxp(mod(k+1+length(REyxp),length(REyxp))+1))/T;
end
end
plot(tau,real(Ryx),'o',tau,imag(Ryx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Pyx=fft(Ryx)/K;
plot(f,real(Pyx),'o',f,imag(Pyx),'o')