|
|
Python |
Matlab/Octave |
Vorbereitung (Laden von Modulen/Paketen) |
|
from numpy import *
from numpy.random import *
from matplotlib.pyplot import *
|
|
Generieren von Werten mit und Werten mit (zwei Rechteckimpulse als Beispiel) |
|
Nx=100
Ny=150
dt=1.0
tx=arange(0,Nx)*dt
ty=arange(0,Ny)*dt
x=zeros(Nx)
y=zeros(Ny)
for i in range(10,70):
x[i]=1
for i in range(20,110):
y[i]=1
plot(tx,x,'o',ty,y,'o')
show()
|
Nx=100;
Ny=150;
dt=1.0;
tx=(0:Nx-1)*dt;
ty=(0:Ny-1)*dt;
x=zeros(1,Nx);
y=zeros(1,Ny);
for i=10:69
x(i)=1;
end
for i=20:109
y(i)=1;
end
plot(tx,x,'o',ty,y,'o')
|
(Momente verschwinden für Energiesignale) |
|
|
|
Kreuzkorrelationsfunktion |
(außerhalb dieses Bereichs null)
|
direkte Berechnung:
REyx=zeros(Nx+Ny-1)
tau=zeros(Nx+Ny-1)
for k in range(-(Nx-1),Ny):
tau[k]=k*dt
sum1=0
for i in range(maximum(0,-k),minimum(Nx,Ny-k)):
sum1+=x[i]*y[i+k]
REyx[k]=dt*sum1
plot(tau,REyx,'o')
show()
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
tau=roll(arange(-(Nx-1),Ny)*dt,Ny)
X=fft(append(x,zeros(Ny)))
Y=fft(append(y,zeros(Nx)))
Eyx=dt**2*conj(X)*Y
REyx=real(ifft(Eyx))/float(dt)
REyx=append(REyx[0:Ny],REyx[Ny+1:Nx+Ny])
plot(tau,REyx,'o')
show()
|
direkte Berechnung:
REyx=zeros(1,Nx+Ny-1);
tau=zeros(1,Nx+Ny-1);
for k=-(Nx-1):Ny-1
tau(mod(k,Nx+Ny-1)+1)=k*dt;
sum1=0;
for i=1+max(0,-k):min(Nx-1,Ny-1-k)
sum1=sum1+x(i)*y(i+k);
end
REyx(mod(k,Nx+Ny-1)+1)=dt*sum1;
end
plot(tau,REyx,'o')
Berechnung aus Energiedichtespektrum mittels Wiener-Chintschin-Theorem:
tau=circshift((-(Nx-1):Ny-1)*dt,[0;Ny]);
X=fft([x,zeros(1,Ny)]);
Y=fft([y,zeros(1,Nx)]);
Eyx=dt^2*conj(X).*Y;
REyx=real(ifft(Eyx))/dt;
REyx=[REyx(1:Ny-1),REyx(Ny+1:end)];
plot(tau,REyx,'o')
|
Kreuzenergiedichtespektrum |
(imaginäre Einheit , implizites Zeropadding mit bzw. Werten ergibt Frequenzen)
|
direkte Berechnung:
from numpy.fft import *
f=roll(arange(-((Nx+Ny)//2),(Nx+Ny+1)//2)/float((Nx+Ny)*dt),(Nx+Ny+1)//2)
X=fft(append(x,zeros(Ny)))
Y=fft(append(y,zeros(Nx)))
Eyx=dt**2*conj(X)*Y
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
Berechnung aus Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
from numpy.fft import *
REyx=zeros(Nx+Ny)
for k in range(-Nx,Ny):
sum1=0
for i in range(maximum(0,-k),minimum(Nx,Ny-k)):
sum1+=x[i]*y[i+k]
REyx[k]=dt*sum1
f=roll(arange(-((Nx+Ny)//2),(Nx+Ny+1)//2)/float((Nx+Ny)*dt),(Nx+Ny+1)//2)
Eyx=dt*fft(REyx)
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
show()
|
direkte Berechnung:
f=circshift((-fix((Nx+Ny)/2):fix((Nx+Ny-1)/2))/((Nx+Ny)*dt),[0;fix((Nx+Ny+1)/2)]);
X=fft([x,zeros(1,Ny)]);
Y=fft([y,zeros(1,Nx)]);
Eyx=dt^2*conj(X).*Y;
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
Berechnung aus Korrelationsfunktion mittels Wiener-Chintschin-Theorem:
REyx=zeros(Nx+Ny,1);
for k=-Nx:Ny-1
sum1=0;
for i=1+max(0,-k):min(Nx-1,Ny-1-k)
sum1=sum1+x(i)*y(i+k);
end
REyx(mod(k,Nx+Ny)+1)=dt*sum1;
end
f=circshift((-fix((Nx+Ny)/2):fix((Nx+Ny-1)/2))/((Nx+Ny)*dt),[0;fix((Nx+Ny+1)/2)]);
Eyx=dt*fft(REyx);
plot(f,real(Eyx),'o',f,imag(Eyx),'o')
|