Signal- und Messdatenverarbeitung


Codes für stochastisch und gemeinsam abgetastete, komplexe Energiesignalpaare, mit 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 (Rechteckimpulse)
T=100.0
dr=1.0
t=[]
x=[]
y=[]
te=0.0
while te<T:
  tp=exponential(1.0/dr)
  te+=tp
  if te<T:
    t.append(te)
    xe=0.0+0j
    if (te>=10) and (te<70):
      xe+=1.0
    if (te>=30) and (te<90):
      xe+=1.0j
    ye=0.0+0j
    if (te>=20) and (te<90):
      ye+=1.0
    if (te>=10) and (te<90):
      ye+=1.0j
    x.append(xe)
    y.append(ye)
  

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=100;
dr=1;
t=[];
x=[];
y=[];
te=0;
while te<T
tp=-log(1-rand())/dr;
te=te+tp;
if te<T
t(end+1)=te;
xe=0+0j;
if (te>=10) && (te<70)
xe=xe+1;
end
if (te>=30) && (te<90)
xe=xe+1j;
end
ye=0+0j;
if (te>=20) && (te<90)
ye=ye+1;
end
if (te>=10) && (te<90)
ye=ye+1j;
end
x(end+1)=xe;
y(end+1)=ye;
end
end
plot(t,real(x),'o',t,imag(x),'o',t,real(y),'o',t,imag(y),'o')
Generieren von reellen Gewichten gi passend zu den (ti,xi,yi)(Kosinusfenster als Beispiel)
g=sin(pi*(t/float(T)))
plot(t,g,'o')
show()
g=sin(pi*(t/T));
plot(t,g,'o')
(Momente verschwinden für Energiesignale)
Kreuzkorrelationsfunktion und Kreuzenergiedichtespektrum über Slotkorrelation (ohne koinzidente Produkte) RE,yx,k=RE,yx(τk)=RE,xy*(τk)=(T|τk|)i=0N1j=0N1bk(tjti)gigjxi*yji=0N1j=0N1bk(tjti)gigj
bk(t)={1falls 0<|t|<Δt/20sonst
τk=kΔt
k=K/2(K1)/2
K=[2T/Δt]1
Eyx,j=Eyx(fj)=ΔtFFT{RE,yx,k}=Δtk=K/2(K1)/2RE,yx,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(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
R1=zeros(K)+0j
R0=zeros(K)
i=0
jb=i
while i<N:
  j=jb
  while (jb<N) and (t[jb]<t[i]+((K-1)//2+0.5)*dt):
    jb+=1
  
  j=jb-1
  while (j>=0) and (t[j]>t[i]-(K//2+0.5)*dt):
    k=int(round((t[j]-t[i])/float(dt)))
    R1[k]+=g[i]*g[j]*conj(x[i])*y[j]
    R0[k]+=g[i]*g[j]
    j-=1
  
  i+=1

REyx=zeros(K)+0j
for k in range(-(K//2),(K+1)//2):
  if R0[k]!=0:
    REyx[k]=R1[k]/float(R0[k])*(T-abs(tau[k]))
  

plot(tau,real(REyx),'o',tau,imag(REyx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
N=length(t);
dt=1.0;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
R1=zeros(1,K)+0j;
R0=zeros(1,K);
i=2;
jb=i;
while i<=N
j=jb;
while (jb<=N) && (t(jb)<t(i)+(fix((K-1)/2)+0.5)*dt)
jb=jb+1;
end
j=jb-1;
while (j>0) && (t(j)>t(i)-(fix(K/2)+0.5)*dt)
k=round((t(j)-t(i))/dt);
R1(mod(K+k,K)+1)=R1(mod(K+k,K)+1)+g(i)*g(j)*conj(x(i))*y(j);
R0(mod(K+k,K)+1)=R0(mod(K+k,K)+1)+g(i)*g(j);
j=j-1;
end
i=i+1;
end
REyx=zeros(1,K)+0j;
for k=1:K
if R0(k)~=0
REyx(k)=R1(k)./R0(k).*(T-abs(tau(k)));
end
end
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
(Slotkorrelation mit lokaler Normierung für Energiesignale nicht möglich)
Kreuzkorrelationsfunktion und Kreuzenergiedichtespektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der koinzidenten Produkte, ohne Normierung) Eyx,j=Eyx(fj)=T2Xj*Yji=0N1gi2xi*yi(i=0N1gi)2i=0N1gi2
Xj=i=0N1gixi𝐞2π𝐢fjti
Yj=i=0N1giyi𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J2T/Δt
RE,yx,k=RE,yx(τk)=RE,xy*(τk)=1ΔtIFFT{Eyx,j}=1JΔtj=J/2(J1)/2Eyx,j𝐞2π𝐢fjτk/J
τk=kΔt
k=K/2(K1)/2
K=[2T/Δt]1
Eyx,j=Eyx(fj)=ΔtFFT{RE,yx,k}=Δtk=K/2(K1)/2RE,yx,k𝐞2π𝐢jk/K
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
J=int(ceil(2*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+=g[i]*x[i]*exp(-2j*pi*fp*t[i])
  Y+=g[i]*y[i]*exp(-2j*pi*fp*t[i])

Eyx=T**2*(conj(X)*Y-sum(g**2*conj(x)*y))/float(sum(g)**2-sum(g**2))
REyx=ifft(Eyx)/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
REyx=append(REyx[0:K//2+1],REyx[-(K//2):len(REyx)])
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*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+g(i)*x(i)*exp(-2j*pi*fp*t(i));
Y=Y+g(i)*y(i)*exp(-2j*pi*fp*t(i));
end
Eyx=T^2*(conj(X).*Y-sum(g.^2.*conj(x).*y))/(sum(g)^2-sum(g.^2));
REyx=ifft(Eyx)/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
REyx=[REyx(1:fix(K/2)+1),REyx(fix(K/2)+3:end)];
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
Kreuzkorrelationsfunktion und Kreuzenergiedichtespektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der koinzidenten Produkte, mit Normierung) Eyx,j=Eyx(fj)=T2Xj*Yji=0N1gi2xi*yiX02i=0N1gi2
Eyx,j=Eyx(fj)=T2|Xj|2i=0N1gi2X02i=0N1gi2
Xj=i=0N1gixi𝐞2π𝐢fjti
Yj=i=0N1giyi𝐞2π𝐢fjti
Xj=i=0N1gi𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J2T/Δt
RE,yx,k=RE,yx(τk)=RE,xy*(τ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,yx(τk):=T|τk|RE,yx,kRE,yx,k
τk=kΔt
k=K/2(K1)/2
K=[2T/Δt]1
Eyx,j=Eyx(fj)=ΔtFFT{RE,yx,k}=Δtk=K/2(K1)/2RE,yx,k𝐞2π𝐢jk/K
fj=jKΔt
j=K/2(K1)/2
from numpy.fft import *
N=len(t)
dt=1.0
J=int(ceil(2*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+=g[i]*x[i]*exp(-2j*pi*fp*t[i])
  Y+=g[i]*y[i]*exp(-2j*pi*fp*t[i])
  Xp+=g[i]*exp(-2j*pi*fp*t[i])

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

plot(tau,real(REyx),'o',tau,imag(REyx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*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+g(i)*x(i)*exp(-2j*pi*fp*t(i));
Y=Y+g(i)*y(i)*exp(-2j*pi*fp*t(i));
Xp=Xp+g(i)*exp(-2j*pi*fp*t(i));
end
Eyx=T^2*(conj(X).*Y-sum(g.^2.*conj(x).*y))/(abs(Xp(1))^2-sum(g.^2));
Eyxp=T^2*(abs(Xp).^2-sum(g.^2))/(abs(Xp(1))^2-sum(g.^2));
REyx=ifft(Eyx)/dt;
REyxp=real(ifft(Eyxp))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
REyx=[REyx(1:fix(K/2)+1),REyx(fix(K/2)+3:end)];
REyxp=[REyxp(1:fix(K/2)+1),REyxp(fix(K/2)+3:end)];
for k=1:K
if REyxp(k)~=0
REyx(k)=REyx(k)/REyxp(k)*(T-abs(tau(k)));
end
end
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
(Direkte Spektralschätzung mit lokaler Normierung für Energiesignale nicht möglich)
(keine Lomb-Scargle-Methode für Kreuzspektren in Matlab und Python)
Kreuzkorrelationsfunktion und Kreuzenergiedichtespektrum über Zeitquantisierung (mit Abzug der koinzidenten Produkte, ohne Normierung)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(ceil(2*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]+=g[i]*x[i];
  y1[j]+=g[i]*y[i];

X=fft(x1)
Y=fft(y1)
Eyx=T**2*(conj(X)*Y-sum(g**2*conj(x)*y))/float(sum(g)**2-sum(g**2))
REyx=ifft(Eyx)/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
REyx=append(REyx[0:K//2+1],REyx[-(K//2):len(REyx)])
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*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)+g(i)*x(i);
y1(j)=y1(j)+g(i)*y(i);
end
X=fft(x1);
Y=fft(y1);
Eyx=T^2*(conj(X).*Y-sum(g.^2.*conj(x).*y))/(sum(g)^2-sum(g.^2));
REyx=ifft(Eyx)/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
REyx=[REyx(1:fix(K/2)+1),REyx(fix(K/2)+3:end)];
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
Kreuzkorrelationsfunktion und Kreuzenergiedichtespektrum über Zeitquantisierung (mit Abzug der koinzidenten Produkte, mit Normierung)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(ceil(2*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]+=g[i];
  x1[j]+=g[i]*x[i];
  y1[j]+=g[i]*y[i];

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

plot(tau,real(REyx),'o',tau,imag(REyx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*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)+g(i);
x1(j)=x1(j)+g(i)*x(i);
y1(j)=y1(j)+g(i)*y(i);
end
X=fft(x1);
Y=fft(y1);
Xp=fft(x0);
Eyx=T^2*(conj(X).*Y-sum(g.^2.*conj(x).*y))/(abs(Xp(1))^2-sum(g.^2));
Eyxp=T^2*(abs(Xp).^2-sum(g.^2))/(abs(Xp(1))^2-sum(g.^2));
REyx=ifft(Eyx)/dt;
REyxp=real(ifft(Eyxp))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
REyx=[REyx(1:fix(K/2)+1),REyx(fix(K/2)+3:end)];
REyxp=[REyxp(1:fix(K/2)+1),REyxp(fix(K/2)+3:end)];
for k=1:K
if REyxp(k)~=0
REyx(k)=REyx(k)/REyxp(k)*(T-abs(tau(k)));
end
end
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
(Zeitquantisierung mit lokaler Normierung für Energiesignale nicht möglich)
Kreuzkorrelationsfunktion und Kreuzenergiedichtespektrum über Interpolation (Sample-and-Hold, mit Filterkorrektur, ohne Normierung)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(ceil(2*T/float(dt)))
xp=zeros(J)+0j
yp=zeros(J)+0j
for i in range(0,N):
  for j in range(int(floor(t[i]/float(dt)))+1,int(floor((t[(i+1)%N]+T*((i+1)//N))/float(dt)))+1):
    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(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
REyx=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:
    REyx[k]=REyxp[k]
  else:
    REyx[k]=(2*c+1)*REyxp[k]-c*REyxp[k-1]-c*REyxp[k+1]
  

plot(tau,real(REyx),'o',tau,imag(REyx),'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*T/dt);
xp=zeros([1,J])+0j;
yp=zeros([1,J])+0j;
for i=1:N
for j=fix(t(i)/dt)+2:fix((t(mod(i,N)+1)+T*fix(i/N))/dt)+1
xp(j)=x(i);
yp(j)=y(i);
end
end
Xp=fft(xp);
Yp=fft(yp);
Eyxp=dt^2*conj(Xp).*Yp;
REyxp=ifft(Eyxp)/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
REyx=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
REyx(mod(k+K,K)+1)=REyxp(mod(k+length(REyxp),length(REyxp))+1);
else
REyx(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);
end
end
plot(tau,real(REyx),'o',tau,imag(REyx),'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')