Signal- und Messdatenverarbeitung


Codes für stochastisch abgetastete, reelle Einzelenergiesignale, ohne Gewichtung

Python Matlab/Octave
Vorbereitung (Laden von Modulen/Paketen)
from numpy import *
from numpy.random import *
from matplotlib.pyplot import *
Generieren von Wertepaaren (ti,xi) mit den Messzeitpunkten ti und den Messwerten xi (Rechteckimpuls)
T=100.0
dr=1.0
t=[]
x=[]
te=0.0
while te<T:
  tp=exponential(1.0/dr)
  te+=tp
  if te<T:
    t.append(te)
    if (te>=10) and (te<90):
        x.append(1.0)
    else:
        x.append(0.0)
    
  

t=array(t)
x=array(x)
plot(t,x,'o')
show()
T=100;
dr=1;
t=[];
x=[];
te=0;
while te<T
tp=-log(1-rand())/dr;
te=te+tp;
if te<T
t(end+1)=te;
if (te>=10) && (te<90)
x(end+1)=1;
else
x(end+1)=0;
end
end
end
plot(t,x,'o')
(Momente verschwinden für Energiesignale)
Autokorrelationsfunktion und Energiedichtespektrum über Slotkorrelation (ohne Selbstprodukte durch bk(0)=0) RE,k=RE(τk)=(T|τk|)i=0N1j=0N1bk(tjti)xixji=0N1j=0N1bk(tjti)
bk(t)={1falls 0<|t|<Δt/20sonst
τk=kΔt
k=K/2(K1)/2
K=[2T/Δt]1
Ej=E(fj)=ΔtFFT{RE,k}=Δtk=K/2(K1)/2RE,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)
R0=zeros(K)
i=1
while i<N:
  j=i-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]+=x[i]*x[j]
    R0[k]+=1.0
    j-=1
  
  i+=1

for k in range(1,(K+1)//2):
  R1[k]=R1[-k]
  R0[k]=R0[-k]

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

plot(tau,RE,'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
E=dt*real(fft(RE))
plot(f,E,'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);
R0=zeros(1,K);
i=2;
while i<=N
j=i-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)+x(i)*x(j);
R0(mod(K+k,K)+1)=R0(mod(K+k,K)+1)+1;
j=j-1;
end
i=i+1;
end
for k=2:fix((K+1)/2)
R1(k)=R1(K-k+2);
R0(k)=R0(K-k+2);
end
RE=zeros(1,K);
for k=1:K
if R0(k)~=0
RE(k)=R1(k)./R0(k).*(T-abs(tau(k)));
end
end
plot(tau,RE,'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
E=dt*real(fft(RE));
plot(f,E,'o')
(Slotkorrelation mit lokaler Normierung für Energiesignale nicht möglich)
Autokorrelationsfunktion und Energiedichtespektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der Selbstprodukte, ohne Normierung) Ej=E(fj)=T2N(N1){|Xj|2i=0N1xi2}
Xj=i=0N1xi𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J2T/Δt
RE,k=RE(τk)=1ΔtIFFT{Ej}=1JΔtj=J/2(J1)/2Ej𝐞2π𝐢fjτk/J
τk=kΔt
k=K/2(K1)/2
K=[2T/Δt]1
Ej=E(fj)=ΔtFFT{RE,k}=Δtk=K/2(K1)/2RE,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=arange(0,J//2+1)/float(J*dt)
X=zeros(size(fp))+0j
for i in range(0,N):
  X+=x[i]*exp(-2j*pi*fp*t[i])

E=zeros(J)
for k in range(0,J//2+1):
  E[k]=T**2*(abs(X[k])**2-sum(x**2))/float(N**2-N)

for k in range(-(J//2-1),0):
  E[k]=E[-k]

RE=real(ifft(E))/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
RE=append(RE[0:K//2+1],RE[-(K//2):len(RE)])
plot(tau,RE,'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
E=dt*real(fft(RE))
plot(f,E,'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*T/dt);
fp=(0:fix(J/2))/(J*dt);
X=zeros(size(fp))+0j;
for i=1:N
X=X+x(i)*exp(-2j*pi*fp*t(i));
end
E=zeros([1,J]);
for k=1:fix(J/2)+1
E(k)=T^2*(abs(X(k)).^2-sum(x.^2))/(N^2-N);
end
for k=fix(J/2)+2:J
E(k)=E(J-k+2);
end
RE=real(ifft(E))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
RE=[RE(1:fix(K/2)+1),RE(fix(K/2)+3:end)];
plot(tau,RE,'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
E=dt*real(fft(RE));
plot(f,E,'o')
Autokorrelationsfunktion und Energiedichtespektrum über direkte Spektralschätzung (Fourier-Transformation, mit Abzug der Selbstprodukte, mit Normierung) Ej=E(fj)=T2N(N1){|Xj|2i=0N1xi2}
Ej=E(fj)=T2N(N1){|Xj|2N}
Xj=i=0N1xi𝐞2π𝐢fjti
Xj=i=0N1𝐞2π𝐢fjti
(imaginäre Einheit 𝐢)
fj=jJΔt
j=J/2(J1)/2
J2T/Δt
RE,k=RE(τk)=1ΔtIFFT{Ej}=1JΔtj=J/2(J1)/2Ej𝐞2π𝐢fjτk/J
RE,k=RE(τk)=1ΔtIFFT{Ej}=1JΔtj=J/2(J1)/2Ej𝐞2π𝐢fjτk/J
RE,k=RE(τk):=T|τk|RE,kRE,k
τk=kΔt
k=K/2(K1)/2
K=[2T/Δt]1
Ej=E(fj)=ΔtFFT{RE,k}=Δtk=K/2(K1)/2RE,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=arange(0,J//2+1)/float(J*dt)
X=zeros(size(fp))+0j
Xp=zeros(size(fp))+0j
for i in range(0,N):
  X+=x[i]*exp(-2j*pi*fp*t[i])
  Xp+=exp(-2j*pi*fp*t[i])

E=zeros(J)
Ep=zeros(J)
for k in range(0,J//2+1):
  E[k]=T**2*(abs(X[k])**2-sum(x**2))/float(N**2-N)
  Ep[k]=T**2*(abs(Xp[k])**2-N)/float(N**2-N)

for k in range(-(J//2-1),0):
  E[k]=E[-k]
  Ep[k]=Ep[-k]

RE=real(ifft(E))/float(dt)
REp=real(ifft(Ep))/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
RE=append(RE[0:K//2+1],RE[-(K//2):len(RE)])
REp=append(REp[0:K//2+1],REp[-(K//2):len(REp)])
for k in range(-(K//2),(K+1)//2):
  if REp[k]!=0:
    RE[k]/=float(REp[k])
    RE[k]*=T-abs(tau[k])
  

plot(tau,RE,'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
E=dt*real(fft(RE))
plot(f,E,'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*T/dt);
fp=(0:fix(J/2))/(J*dt);
X=zeros(size(fp))+0j;
Xp=zeros(size(fp))+0j;
for i=1:N
X=X+x(i)*exp(-2j*pi*fp*t(i));
Xp=Xp+exp(-2j*pi*fp*t(i));
end
E=zeros([1,J]);
Ep=zeros([1,J]);
for k=1:fix(J/2)+1
E(k)=T^2*(abs(X(k)).^2-sum(x.^2))/(N^2-N);
Ep(k)=T^2*(abs(Xp(k)).^2-N)/(N^2-N);
end
for k=fix(J/2)+2:J
E(k)=E(J-k+2);
Ep(k)=Ep(J-k+2);
end
RE=real(ifft(E))/dt;
REp=real(ifft(Ep))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
RE=[RE(1:fix(K/2)+1),RE(fix(K/2)+3:end)];
REp=[REp(1:fix(K/2)+1),REp(fix(K/2)+3:end)];
for k=1:K
if REp(k)~=0
RE(k)=RE(k)/REp(k)*(T-abs(tau(k)));
end
end
plot(tau,RE,'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
E=dt*real(fft(RE));
plot(f,E,'o')
(Direkte Spektralschätzung mit lokaler Normierung für Energiesignale nicht möglich)
(Lomb-Scargle-Methode in Matlab und Python nur für mittelwertfreie Daten; s. The generalised Lomb-Scargle periodogram.)
Autokorrelationsfunktion und Energiedichtespektrum über Zeitquantisierung (mit Abzug der Selbstprodukte, ohne Normierung)
from numpy.fft import *
N=len(t)
dt=1.0
J=int(ceil(2*T/float(dt)))
x1=zeros(J)
for i in range(0,N):
  j=int(floor((t[i]-T*floor(t[i]/float(T)))/float(dt)))
  x1[j]+=x[i];

X=fft(x1)
E=T**2*(abs(X)**2-sum(x**2))/float(N**2-N)
RE=real(ifft(E))/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
RE=append(RE[0:K//2+1],RE[-(K//2):len(RE)])
plot(tau,RE,'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
E=dt*real(fft(RE))
plot(f,E,'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*T/dt);
x1=zeros([1,J]);
for i=1:N
j=fix((t(i)-T*fix(t(i)/T))/dt)+1;
x1(j)=x1(j)+x(i);
end
X=fft(x1);
E=T^2*(abs(X).^2-sum(x.^2))/(N^2-N);
RE=real(ifft(E))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
RE=[RE(1:fix(K/2)+1),RE(fix(K/2)+3:end)];
plot(tau,RE,'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
E=dt*real(fft(RE));
plot(f,E,'o')
Autokorrelationsfunktion und Energiedichtespektrum über Zeitquantisierung (mit Abzug der Selbstprodukte, 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)
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];

X=fft(x1)
Xp=fft(x0)
E=T**2*(abs(X)**2-sum(x**2))/float(N**2-N)
Ep=T**2*(abs(Xp)**2-N)/float(N**2-N)
RE=real(ifft(E))/float(dt)
REp=real(ifft(Ep))/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
RE=append(RE[0:K//2+1],RE[-(K//2):len(RE)])
REp=append(REp[0:K//2+1],REp[-(K//2):len(REp)])
for k in range(-(K//2),(K+1)//2):
  if REp[k]!=0:
    RE[k]/=float(REp[k])
    RE[k]*=T-abs(tau[k])
  

plot(tau,RE,'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
E=dt*real(fft(RE))
plot(f,E,'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*T/dt);
x0=zeros([1,J]);
x1=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);
end
X=fft(x1);
Xp=fft(x0);
E=T^2*(abs(X).^2-sum(x.^2))/(N^2-N);
Ep=T^2*(abs(Xp).^2-N)/(N^2-N);
RE=real(ifft(E))/dt;
REp=real(ifft(Ep))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
RE=[RE(1:fix(K/2)+1),RE(fix(K/2)+3:end)];
REp=[REp(1:fix(K/2)+1),REp(fix(K/2)+3:end)];
for k=1:K
if REp(k)~=0
RE(k)=RE(k)/REp(k)*(T-abs(tau(k)));
end
end
plot(tau,RE,'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
E=dt*real(fft(RE));
plot(f,E,'o')
(Zeitquantisierung mit lokaler Normierung für Energiesignale nicht möglich)
Autokorrelationsfunktion und Energiedichtespektrum ü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)
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]
  

Xp=fft(xp)
Ep=dt**2*abs(Xp)**2
REp=real(ifft(Ep))/float(dt)
K=int(round(2*T/float(dt)))-1
tau=roll(arange(-(K//2),(K+1)//2)*dt,(K+1)//2)
RE=zeros(K)
c=exp(-dd/float(dt))/(1-exp(-dd/float(dt)))**2
for k in range(-(K//2),(K+1)//2):
  if k==0:
    RE[k]=REp[k]
  else:
    RE[k]=(2*c+1)*REp[k]-c*REp[k-1]-c*REp[k+1]
  

plot(tau,RE,'o')
show()
f=roll(arange(-(K//2),(K+1)//2)/float(K*dt),(K+1)//2)
E=dt*real(fft(RE))
plot(f,E,'o')
show()
N=length(t);
dt=1.0;
J=ceil(2*T/dt);
xp=zeros([1,J]);
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);
end
end
Xp=fft(xp);
Ep=dt^2*abs(Xp).^2;
REp=real(ifft(Ep))/dt;
K=round(2*T/dt)-1;
tau=circshift((-fix(K/2):fix((K-1)/2))*dt,[0;fix((K+1)/2)]);
RE=zeros([1,K]);
c=exp(-dd/dt)/(1-exp(-dd/dt))^2;
RE(1)=REp(1);
for k=2:fix(K/2)+1
RE(k)=((2*c+1)*REp(k)-c*REp(k-1)-c*REp(k+1));
end
for k=fix(K/2)+2:K
RE(k)=RE(K-k+2);
end
plot(tau,RE,'o')
f=circshift((-fix(K/2):fix((K-1)/2))/(K*dt),[0;fix((K+1)/2)]);
E=dt*real(fft(RE));
plot(f,E,'o')