Die folgenden Befehle zeigen die Definitionen von verschiedenen
Rechtecks-, Dreiecks- Sägezahn- und Elementarfunktionen
als mögliche Eingabedaten für das
Demonstrationsprogramm zur Fourier-Transformation.
Die vielen kurzen Dateien
'fdeftriang.m',
'fdeftriangl.m',
'fdefsaegz.m',
'fdefminisaegz.m',
'fdefsquare.m',
'fdefsin.m', und
'fdefcos.m'
sind im Text zusammengefaßt.
% fdeftriang.m - Skript f = Zickzack-Funktion, ungerade f = [ 0:20 19:-1:-20 -19:-1 ] ; % 80 Elemente % fdeftriangl.m - Skript f = Zickzack-Funktion, ungerade f = [ 0:25 24:-1:-25 -24:-1 ] ; % 100 Elemente % fdefsaegz.m Skript f= Saegezahn-Funktion, ungerade f = [ 0:40 -40:-1 ]/40 ; % 81 Elemente % fdefminisaegz.m Skript f= kl. Saegezahn-Funktion, Phasenverschoben h = [ 0:20 -20:-1 ]/20 ; f = [ h(10:41) h(1:9)] ; 41 Elemente % fdefsquare.m - Skript f= quadrat. Puls, gerade, a0 klein f = [ 1 ones(1,20) -1*ones(1,40) ones(1,20)]; % fdefsin.m Skript f = sin(0:dw:2pi-dw) xvector = 0:99; f = sin( xvector/50*pi); % 100 Elemente % fdefcos.m Skript f = cos(0:dw:2pi-dw) xvector = 0:99; f = cos( xvector/50*pi); % 100 Elemente
Eine analoge Serie von Skripts definiert verschieden breite Rechteckpulse: 'fdefnarrpeak.m', 'fdefpeak.m', 'fdefmedpeak.m', 'fdefwidpeak.m'.
% fdefnarrpeak.m Skript f = Rechteckpuls 3 breit, 100 Elemente f = [ 1 1 zeros(1,97) 1]; % fdefpeak.m Skript f = Rechteckpuls 5 breit, 100 Elemente f = [ 1 1 1 zeros(1,95) 1 1]; % fdefmedpeak.m Skript f = Rechteckpuls 9 breit, 100 Elemente f = [ 1 1 1 1 1 zeros(1,91) 1 1 1 1]; % fdefwidpeak.m Skript f = Rechteckpuls 15 breit, 100 Elemente f = [ 1 1 1 1 1 1 1 1 zeros(1,85) 1 1 1 1 1 1 1];
Ein weiteres Skript 'fdefhat.m' zur Definition einer Testfunktion f erzeugt eine Hutfunktion aufgrund der interaktiven Abfrage der gewünschten Position und Breite.
% fdefhat.m Skript f - Hutfunktion, % Breite und Position wird interaktiv abgefragt f = zeros(1,100); disp('Definition einer Hut-Funktion durch Angabe von'); disp(' Position und Breite'); pos = input(' Eingabe Position der Hut-Spitze (0..99):'); wid = input(' Eingabe halbe Breite des Spitz-Hutes:'); f(pos+1) = 1; for k=pos+2:min(pos+1+wid,100) f(k) = 1-(k-pos-1)/wid; end for k=max(pos+2-100,1):pos+1+wid-100 f(k) = 1-(k-pos-1+100)/wid; end for k=pos:-1:max(pos-wid+1,1) f(k) = 1+(k-pos-1)/wid; end for k=min(pos+100,100):-1:pos-wid+1+100 f(k) = 1+(k-pos-1-100)/wid; end
Das M-File 'rearrg.m' wird als Makro im Skript 'foudem.m' gebraucht:
function ovec = rearrg(ivec) ltot = length(ivec); ovec = [ ivec(floor((ltot+1)/2)+1:ltot) , ivec(1:floor(ltot/2)+1 ) ];
Eine Serie von Displays der verschiedenen Darstellungsarten von Fourier-Spektren zur vorher zu definierenden Funktion f erfolgt mit dem M-File 'foushow.m'.
% foushow.m - Demo Skript zum Zeichnen der verschiedenen % Darstellungsformen der Fourierkoeffizienten % die Zeitfunktion muss im Vektor f vordefiniert werden ft = fft(f); n = length(f); % die einfachste verfuegbare Fourier-Transformation ist fft fmi = min(f); fma = max(f); % Rechen-Ungenauigkeits-Effekte werden Null gesetzt if max(real(ft)) < 1e-12; ft = j*imag(ft); end if max(imag(ft)) < 1e-12 ; ft = real(ft); end % 1. ganz gewoehnliche Fourier-Koeffizienten ftn = 2*ft/n; nh = floor(n/2); ibas=1:nh; figure(1); clf; figure(2); clf figure(1) ; subplot(2,1,1); bar(ibas,real(ftn(1:nh))) subplot(2,1,2); bar(ibas,-imag(ftn(1:nh))) figure(2); plot(f) % Die Zeitfunktion erscheint in Figur 2 axis([-3 n+3 fmi-0.15*(fma-fmi) fma+0.15*(fma-fmi)]) figure(1) % Stop durch Tastatur-Abfrage cont = input('1. in Fig. 1: a und b-Koeffizienten - weiter?'); clf; bar(ibas,abs(ftn(1:nh))) % 2. Power-Spektrum, Stop durch Tastatur-Abfrage cont = input('2. im Fig. 1: Power-Spektrum -weiter?'); % alle diskret - Transformierten Koeffizienten igew = 1:n; subplot(2,1,1); bar(igew,real(ft)) subplot(2,1,2); bar(igew,-imag(ft)) % 3. DFT Koeffizienten, Stop durch Tastatur-Abfrage cont = input('3. im Fig. 1: DFT-Koeffizienten - weiter?'); % 4. Komplexe Darstellung ftr = rearrg(ft); lorig = length(f); idx = -floor(lorig/2):floor(lorig/2); ftrn = ftr/n; clf; subplot(2,1,1) ; bar(idx,real(ftrn)) subplot(2,1,2); bar(idx,imag(ftrn)) disp('4. im Fig. 1: Re, Im der komplexen Koeffizienten - Show fertig')
Nur gerade der Display von Realteil und Imaginärteil der komplexen Fourier-Koeffizienten zur vorher definierten Funktion 'f' erfolgt mit dem M-File 'foushow.m'.
% foushowexp.m Darstellung der Fourier-Koeffizienten % zur vordefinierten Funktion f % in der komplexen Exponenten-Form ck*exp(j*k*w), k=-N..+N, ft = fft(f); n = length(f); ftr = rearrg(ft); lorig = length(f); idx = -floor(lorig/2):floor(lorig/2); rcoef = real(ftr); % Rechen-Ungenauigkeits-Effekte werden Null gesetzt if max(rcoef) < 1e-12 rcoef = zeros(1,length(ftr)); end xicoef = imag(ftr); if max(xicoef) < 1e-12 xicoef = zeros(1,length(ftr)); end % plot in zwei Teilbildern uebereinander subplot(2,1,1); bar(idx,rcoef) subplot(2,1,2); bar(idx,xicoef)
In der M-File-Sammlung ist auch ein Demonstrationsskript zur Erläuterung des Algorithmus der schnellen Fouriertransformation enthalten Für diese Skripts 'shoffralgo.m', 'dftmatrix.m', und 'xfftmatrix.m' wird jedoch auf den Textteil des Buches verwiesen.