Signal- und Messdatenverarbeitung


Testcodes für Kapitel 12: Filter

systematische Zusammenstellung von kombinierbaren Programmabschnitten zur Signal- und Messdatenverarbeitung

Python Matlab/Octave
Vorbereitung (Laden von Modulen/Paketen)
#python -m pip install --upgrade numpy
#python -m pip install --upgrade matplotlib
#pip install --upgrade numpy
#pip install --upgrade matplotlib
from numpy import *
from numpy.fft import *
from matplotlib.pyplot import *
Rechteckfenster …
N=1000
dt=1.0
t=arange(0,N)*dt
M=100
w=ones(M)
w=append(zeros((N-M)//2),append(w,zeros((N-M+1)//2)))
plot(t,w)
show()
N=1000;
dt=1;
t=(0:N-1)*dt;
M=100;
w=ones(1,M);
w=[zeros(1,fix((N-M)/2)),w,zeros(1,fix((N-M+1)/2))];
plot(t,w)
… und das Fourier-Spektrum
f=roll(arange(-(N//2),(N+1)//2)/float(N)*dt,N//2)
W=fft(w)
semilogy(roll(f,N//2),roll(abs(W),N//2))
show()
f=circshift((-fix(N/2):fix((N-1)/2))/N*dt,fix(N/2));
W=fft(w);
semilogy(circshift(f,fix(N/2)),circshift(abs(W),fix(N/2)))
Anwendung eines idealen Tiefpasses
Wp0=fft(w)
for i in range(11,N-10):
  Wp0[i]=0

semilogy(roll(f,N//2),roll(abs(W),N//2),roll(f,N//2),roll(abs(Wp0),N//2))
show()
Wp0=fft(w);
for i=12:N-10
Wp0(i)=0;
end
semilogy(circshift(f,fix(N/2)),circshift(abs(W),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp0),fix(N/2)))
Rücktransformation des Fourier-Spektrums in ein Zeitsignal (überschwingend und verschliffen)
wp0=real(ifft(Wp0))
plot(t,w,t,wp0)
show()
wp0=real(ifft(Wp0));
plot(t,w,t,wp0)
Erfassen benachbarter Nebenzipfel
Wp1=fft(w)
for i in range(21,N-20):
  Wp1[i]=0

semilogy(roll(f,N//2),roll(abs(W),N//2),roll(f,N//2),roll(abs(Wp1),N//2))
show()
Wp1=fft(w);
for i=22:N-20
Wp1(i)=0;
end
semilogy(circshift(f,fix(N/2)),circshift(abs(W),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp1),fix(N/2)))
Rücktransformation des Fourier-Spektrums in ein Zeitsignal (überschwingend und verschliffen, schärfere Kanten)
wp1=real(ifft(Wp1))
plot(t,w,t,wp1)
show()
wp1=real(ifft(Wp1));
plot(t,w,t,wp1)
Erfassen weiterer Nebenzipfel
Wp2=fft(w)
for i in range(31,N-30):
  Wp2[i]=0

Wp3=fft(w)
for i in range(41,N-40):
  Wp3[i]=0

Wp4=fft(w)
for i in range(51,N-50):
  Wp4[i]=0

semilogy(roll(f,N//2) ,roll(abs(W),N//2),roll(f,N//2),roll(abs(Wp4),N//2),roll(f,N//2),roll(abs(Wp3),N//2),roll(f,N//2),roll(abs(Wp2),N//2),roll(f,N//2),roll(abs(Wp1),N//2),roll(f,N//2),roll(abs(Wp0),N//2))
show()
Wp2=fft(w);
for i=32:N-30
Wp2(i)=0;
end
Wp3=fft(w);
for i=42:N-40
Wp3(i)=0;
end
Wp4=fft(w);
for i=35:N-50
Wp4(i)=0;
end
semilogy(circshift(f,fix(N/2)),circshift(abs(W),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp4),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp3),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp2),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp1),fix(N/2)),circshift(f,fix(N/2)),circshift(abs(Wp0),fix(N/2)))
Rücktransformation des Fourier-Spektrums in ein Zeitsignal (schärfere Kanten, aber Überschwingen bleibt gleich hoch, Gibbsches Phänomen)
wp2=real(ifft(Wp2))
wp3=real(ifft(Wp3))
wp4=real(ifft(Wp4))
plot(t,w,t,wp4,t,wp3,t,wp2,t,wp1,t,wp0)
show()
wp2=real(ifft(Wp2));
wp3=real(ifft(Wp3));
wp4=real(ifft(Wp4));
plot(t,w,t,wp4,t,wp3,t,wp2,t,wp1,t,wp0)