|
|
DataMuseum.dkPresents historical artifacts from the history of: MIKADOS |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about MIKADOS Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 20352 (0x4f80)
Notes: Mikados TextFile, Mikados_K
Names: »FFTDEMO«
└─⟦d110b5765⟧ Bits:30005308 Eksamensopgave i dynamiske systemer med FFT
└─⟦this⟧ »FFTDEMO«
PROGRAM FFTDEMO;
(*********************************************
ENDELIG VERSION AF PROGRAMMET FFTDEMO 1/9-80
FORUDSAETTER FILERNE:
FFTPLOT (INDEHOLDENDE PROCEDUREN FFTPLOT)
MIT (-----"------ -----"---- MIT)
FFT2 (-----"------ -----"---- FFT2)
KONVERT (---"----- -----"---- KONVERTERING)
********************************************)
CONST TOPI=6.283185307179;
PI=3.141592653489;
PIHALV=1.570796326794;
REOGIM='real- og imaginaerdelen';
AOGF='amplituden og fasen';
TYPE CHECK=(OK,IKKEOK);
VEKTOR =ARRAY (0..255) OF REAL;
OVERSKRIFT=STRING(40);
SIGNALFORM=STRING(3);
SYMBOLER=ARRAY (1..2) OF CHAR;
PUNKTER=ARRAY(1..256,1..2) OF REAL;
VAR SIG1I,SIG1R,SIG2R,SIG2I : VEKTOR;
X,Y:PUNKTER;
DEL,NUMSIG: ARRAY (1..4) OF STRING(15);
M,N,MTEST,S,SIG,D,I,IHE,N1 :INTEGER;
A,B :REAL;
ART,SVAR :SIGNALFORM;
CASETEGN,SPTYPE:CHAR;
TEGN:SYMBOLER;
TEST,FORTSAT,PLOT :BOOLEAN;
SVARTEST:CHECK;
SIGNAL:SIGNALFORM;
(*$IFFTPLOT*)
(*$IFFT2*)
(*$IMIT*)
(*$IKONVERT*)
SEGMENT FUNCTION JANEJ(SP0RGSMAAL:STRING):BOOLEAN;
(* DENNE PROCEDURE UDSKRIVER 'SP0RGSMAAL' OG LAESER
SVARET. DEN ER TRUE HVIS SVARET ER 'J' ELLER 'JA'
OG FALSE HVIS DET ER 'NEJ' ELLER 'N'. *)
BEGIN
REPEAT
SVARTEST:=OK;
WRITE(SP0RGSMAAL);
READLN; READ(SVAR);
IF (SVAR<>'JA') AND (SVAR<>'NEJ') AND
(SVAR<>'J') AND (SVAR<>'N') THEN
BEGIN
WRITELN('Det indtastede: ',SVAR,' er ikke lovligt.');
WRITELN('Kun JA,NEJ,J,N er lovlige svar');
SVARTEST:=IKKEOK;
END;
UNTIL SVARTEST=OK;
JANEJ:=SVAR(1)='J';
END;
SEGMENT PROCEDURE SIGNALPLOT(D:INTEGER;
SIGNALNR:INTEGER;
SKALA:BOOLEAN;
TEKST:OVERSKRIFT);
(* DENNE PROCEDURE UDTEGNER SIGNAL/SPEKTRUM.
D ER 1 FOR REALDELEN OG 2 FOR IMAGINAERDELEN.
SIGNALNR ER 1 FOR DET F0RSTE SIGNAL OG 2 FOR DET ANDET.
3 FOR BADE REAL- OG IMAGINAER DEL AF 1. SIGNAL
4 -"- --"- --"-- " ----"---- " " 2. --"---
SKALA TRUE NAAR X-AKSEN ER -N/2 TIL N/2 OG FALSE NAAR
DEN SKAL VAERE 0 TIL N-1.
TEKST ER EN TEKST SOM BESKRIVER HVAD DER PLOTTES. *)
VAR S:INTEGER;
BEGIN
CASE SIGNALNR OF
1: CASE D OF
1: FOR I:=0 TO N1 DO Y(I+1,1):= SIG1R(I);
2: FOR I:=0 TO N1 DO Y(I+1,1):=SIG1I(I);
END;
2: CASE D OF
1: FOR I:=0 TO N1 DO Y(I+1,1):= SIG2R(I);
2: FOR I:=0 TO N1 DO Y(I+1,1):=SIG2I(I);
END;
3: FOR I:=0 TO N1 DO
BEGIN
IHE:=I+1;
Y(IHE,1):=SIG1R(I);
Y(IHE,2):=SIG1I(I);
END;
4: FOR I:=0 TO N1 DO
BEGIN
IHE:=I+1;
Y(IHE,1):=SIG2R(I);
Y(IHE,2):=SIG2I(I);
END;
END;
IF (SIGNALNR >= 3) THEN
BEGIN
S:=2;
TEGN(1):='r';
TEGN(2):='i';
END
ELSE
BEGIN
S:=1;
TEGN(1):=TEKST(1);
END;
IF SKALA THEN
FOR I:=0 TO N1 DO X(I+1,1):=I-N DIV 2
ELSE
FOR I:=0 TO N1 DO
BEGIN
IHE:=I+1;
X(IHE,1):=I;
X(IHE,2):=I;
END;
WRITELN;
WRITELN('Her kommer ',TEKST);
WRITELN('Tryk RETURN naar kurven ikke skal vises mere');
FFTPLOT(S,N,X,Y,TEGN,TRUE);
READLN;
END;
SEGMENT PROCEDURE TABEL(X,Y:VEKTOR;
HOVED:OVERSKRIFT;
KOLNAVN1,KOLNAVN2:OVERSKRIFT);
(* DENNE PROCEDURE UDSKRIVER TABEL MED VEKTORERNE X OG Y
HOVED ANGIVER HVAD TABELLEN INDEHOLDER.
KOLNAVN1 ER INDHOLDET AF F0RSTE KOLONNE.
KOLNAVN2 " ----"---- " ANDEN ---"--- *)
VAR TL,LINIE,NR:INTEGER;
BEGIN
NR:=0;
REPEAT
LINIE:=1;
CLEARSCREEN;
GOTOXY(13,1); WRITELN('Tabel over ',HOVED);
GOTOXY(13,2); FOR I:=1 TO 11+LENGTH(HOVED) DO WRITE('*');
WRITELN;
GOTOXY(4,4); WRITE('i');
GOTOXY(13,4); WRITE(KOLNAVN1);
GOTOXY(36,4); WRITE(KOLNAVN2);
GOTOXY(1,5); FOR I:=1 TO 51 DO WRITE('-');
WRITELN('-');
REPEAT
TL:=1;
REPEAT
WRITELN(' ',NR,' ',X(NR),' ',Y(NR));
LINIE:=LINIE+1;
TL:=TL+1;
NR:=NR+1;
UNTIL (TL>=5) OR (NR>N1);
WRITELN;
UNTIL(NR>N1) OR (LINIE>=12);
WRITE('Tryk RETURN naar der skal fortsaettes.');
READLN;
UNTIL (NR>=N1);
END; (*SLUT TABEL*)
SEGMENT PROCEDURE SIGFKT(VAR ST:VEKTOR;
A,B:REAL;
SI:SIGNALFORM);
(* HER UDREGNES SIGNALET BESTEMT VED SI OG AFLEVERES
I VEKTOREN ST. A OG B ER PARAMETRE TIL SIGNALERNE. *)
VAR H,HELP,F,XMAX,DXM:REAL;
I,J,X,OVRE,DX,BMAX,ETTER,NULLER:INTEGER;
CASETEGN:CHAR;
PROCEDURE INDSAT(MAXANTAL:INTEGER;
VAERDI:REAL);
(* DENNE PROCEDURE INDSAETTER TALLET VAERDI I VEKTOREN
ST, FRA HVOR X PEGER OG TIL X+MAXANTAL (X ER INDEKS I
VEKTOREN) *)
VAR ANTAL:INTEGER;
BEGIN
ANTAL:=1;
WHILE (ANTAL<=MAXANTAL) AND (X<=N1) DO
BEGIN
ST(X):=VAERDI;
X:=X+1;
ANTAL:=ANTAL+1;
END;
END;
BEGIN
CASETEGN:=SI(1);
CASE CASETEGN OF
'T': BEGIN
H:=-4*A/N/N;
HELP:=N1/A;
DXM:=HELP/2;
XMAX:=0.0;
X:=0;
F:=0.0;
REPEAT
I:=1;
XMAX:=XMAX + DXM;
H:=-H;
WHILE (X<=XMAX) AND (X<=N1) DO
BEGIN
ST(X):=H*(X-F);
X:=X+1;
I:=I+1;
END;
I:=1;
H:=-H;
XMAX:=XMAX + DXM;
F:=F+HELP;
WHILE (X<=XMAX ) AND (X<=N1) DO
BEGIN
ST(X):=H*(X-F);
X:=X+1;
I:=I+1;
END;
IF X=N1 THEN ST(X):=H*(X-F);
UNTIL X>=N1;
END;
'S': BEGIN
A:=TOPI*A/N;
CLEARSCREEN;
WRITE('Punkt nr.');
FOR X:=0 TO N1 DO
BEGIN
ST(X):= SIN(A*X);
GOTOXY(10,1);
WRITE(X);
END;
GOTOXY(1,2);
END;
'C': BEGIN
A:=TOPI*A/N;
CLEARSCREEN;
WRITE('Punkt nr.');
FOR X:=0 TO N1 DO
BEGIN
ST(X):=COS(A*X);
GOTOXY(10,1);
WRITE(X);
END;
GOTOXY(1,2);
END;
'F': BEGIN
X:=0;
BMAX:=TRUNC(B);
NULLER:=TRUNC(N/2/A);
ETTER:=NULLER-2;
IF BMAX>0 THEN
BEGIN
FOR X:=0 TO BMAX DO ST(X):=0.0;
X:=BMAX+1;
END;
REPEAT
ST(X):=0.5;
X:=X+1;
INDSAT(ETTER,1.0);
IF (X<=N1) THEN ST(X):=0.5;
X:=X+1;
INDSAT(NULLER,0.0);
UNTIL (X>=N1);
END;
'I': BEGIN
DX:=TRUNC( N/(A+1) );
FOR X:=0 TO N1 DO ST(X):=0.0;
FOR I:=1 TO TRUNC(A) DO
BEGIN
X:=DX*I;
ST(X):=1.0;
END;
END;
'K': FOR X:=0 TO N1 DO ST(X):=A;
'M': MIT(A,ST,D);
END;
END;
SEGMENT PROCEDURE TOSIGNAL;
(* DENNE PROCEDURE LAVER LINIARKOMBINATIONEN ELLER
PRODUKTET AF DE TIDLIGERE DEFINEREDE SIGNALER *)
VAR RE1,IM1,RE2,IM2:REAL;
BEGIN
REPEAT
SVARTEST:=OK;
WRITELN;
WRITELN('Hvordan skal de to signaler "kombineres"?');
WRITELN;
WRITELN('Indtast:');
WRITELN('1 for A*SIGNAL1 + B*SIGNAL2');
WRITELN('2 for A*SIGNAL1*SIGNAL2');
WRITELN;
WRITE('Indtast det oenskede: ');
READLN; READ(ART);
IF (ART<>'1') AND (ART<>'2') THEN
BEGIN
WRITELN('Det indtastede: ',ART,' er ikke lovligt.');
WRITELN('Kun 1,2 er lovlige svar.');
SVARTEST:=IKKEOK;
END;
UNTIL SVARTEST=OK;
WRITE('Indtast A:');
READ(A);
CASETEGN:=ART(1);
CASE CASETEGN OF
'1': BEGIN
WRITE('Indtast B:'); READ(B);
FOR I:=0 TO N1 DO
BEGIN
SIG1R(I):=A*SIG1R(I) + B*SIG2R(I);
SIG1I(I):=A*SIG1I(I) + B*SIG2I(I);
END;
END;
'2': FOR I:=0 TO N1 DO
BEGIN
RE1:=SIG1R(I);
IM1:=SIG1I(I);
RE2:=SIG2R(I);
IM2:=SIG2I(I);
SIG1R(I):=A*(RE1*RE2-IM1*IM2);
SIG1I(I):=A*(RE1*IM2+RE2*IM1);
END;
END;
IF JANEJ(CONCAT('0nskes plot af ',DEL(1),'?') ) THEN
SIGNALPLOT(1,1,FALSE,DEL(1));
IF JANEJ( CONCAT('0nskes plot af ',DEL(2),'?') ) THEN
SIGNALPLOT(2,1,FALSE,DEL(2));
IF JANEJ( CONCAT('0nskes tabel over ',REOGIM) ) THEN
TABEL(SIG1R,SIG1I,REOGIM,DEL(1),DEL(2)) ELSE ;
END;
SEGMENT PROCEDURE SIGNALDEFINITION;
(* DENNE PROCEDURE GIVER LISTE OVER DE MULIGE STANDARD-
SIGNALER, OG CHECKER SVARENE PAA SP0RGSMAALENE OM
REAL OG IMAGINAERDELEN AF SIGNAL NR. 1 EVT. OGSAA NR. 2
KALDER SAA SIGFKT SOM LEVERER SIGNALET. *)
BEGIN
FOR SIG:=1 TO S DO
BEGIN
FOR D:=1 TO 2 DO
BEGIN
REPEAT
SVARTEST:=OK;
WRITELN;
WRITELN('Hvordan skal ',DEL(D),' af det ',NUMSIG(SIG),' signal',
' vaere?');
WRITELN('Der er flg. svarmuligheder:');
WRITELN;
WRITELN('aTRE betyder trekantsignal');
WRITELN('aFIR ---"--- firkantsignal');
WRITELN('aIMP ---"--- impulssignal (diskret delta fkt)');
WRITELN('aCOS ---"--- cosinus signal');
WRITELN('aSIN ---"--- sinus signal');
WRITELN('kKST ---"--- konstanten k');
WRITELN('xMIT ---"--- brugerdefineret signal i proceduren MIT');
WRITELN;
WRITELN('a betegner et reelt, positivt tal som angiver,');
WRITELN(' hvormange gange det valgte signal gentages');
WRITE('Indtast det oenskede:');
READ(A); READ(SIGNAL);
IF (A<=0) AND (SIGNAL<>'KST') AND (SIGNAL<>'MIT') THEN
BEGIN
WRITELN('Det indtastede a: ',A,' er ikke lovligt.');
WRITELN('a skal vaere positiv!');
SVARTEST:=IKKEOK;
END;
IF (SIGNAL<>'TRE') AND (SIGNAL<>'FIR') AND (SIGNAL<>'IMP')
AND
(SIGNAL<>'COS') AND (SIGNAL<>'SIN') AND (SIGNAL<>'KST')
AND (SIGNAL<>'MIT')
THEN
BEGIN
WRITELN('Det indtastede signal: ',SIGNAL,' er ikke lovligt');
SVARTEST:=IKKEOK;
END;
IF (SIGNAL='FIR') THEN
BEGIN
WRITE('Hvad skal forskydningen vaere?');
READ(B);
IF B<0 THEN
BEGIN
WRITELN('b skal vaere ikke negativ');
SVARTEST:=IKKEOK;
END;
END;
UNTIL SVARTEST=OK;
CASE SIG OF
1: CASE D OF
1: SIGFKT(SIG1R,A,B,SIGNAL);
2: SIGFKT(SIG1I,A,B,SIGNAL);
END;
2: CASE D OF
1: SIGFKT(SIG2R,A,B,SIGNAL);
2: SIGFKT(SIG2I,A,B,SIGNAL);
END;
END; (* CASE SIG *)
IF JANEJ( CONCAT('0nskes plot af ',DEL(D),'?') ) THEN
SIGNALPLOT(D,SIG,FALSE,DEL(D));
END;
IF JANEJ(CONCAT('0nskes plot af ',REOGIM,'?')) THEN
SIGNALPLOT(1,SIG+2,FALSE,REOGIM);
IF JANEJ(CONCAT('0nskes tabel over ',REOGIM,'?')) THEN
CASE SIG OF
1: TABEL(SIG1R,SIG1I,REOGIM,DEL(1),DEL(2));
2: TABEL(SIG2R,SIG2I,REOGIM,DEL(1),DEL(2));
END;
END;
END;
SEGMENT PROCEDURE NSP0RGSMAAL;
(* HER STILLES ? OM N (ANTALLET AF SAMPLES) OG SVARET
CHECKES. DER FINDES OGSAA M SAA 2**M=N.
ENDELIG ? OM SIGNALET SKAL LAVES MED ET ELLET TO SIGNALER *)
BEGIN
REPEAT
SVARTEST:=OK;
WRITE('Hvormange samples (N) oenskes? ÆN<=256Å :');
READ(N);
M:=-1;
MTEST:=2*N;
IF N>=2 THEN
REPEAT
MTEST:=MTEST DIV 2;
M:=M+1;
UNTIL (MTEST=1) OR ((MTEST MOD 2)=1);
IF MTEST<>1 THEN
BEGIN
WRITELN('Det indtastede N=',N,' er ikke en potens af 2');
SVARTEST:=IKKEOK;
END;
IF N>256 THEN
BEGIN
WRITELN('Det indtastede N=',N,' er for stort. (N<=256 )');
SVARTEST:=IKKEOK;
END;
IF N<2 THEN
BEGIN
WRITELN('Det indtastede N= ',N,' er for lille. (N>=2)');
SVARTEST:=IKKEOK;
END;
UNTIL SVARTEST=OK;
N1:=N-1;
REPEAT
SVARTEST:=OK;
WRITELN;
WRITE('0nskes der anvendt 1 eller 2 signaler?');
READ(S);
IF (S<>1) AND (S<>2) THEN
BEGIN
WRITELN('Det angivne antal signaler: ',S,' er ikke lovligt');
SVARTEST:=IKKEOK;
END;
UNTIL SVARTEST=OK;
END;
SEGMENT PROCEDURE VINDUE;
(* PROCEDUREN DEFINERER VINDUE, SOM KAN GANGES PAA DET
FAERDIGE SIGNAL *)
VAR V1,V2:INTEGER;
PROCEDURE READHELTAL(A:CHAR;
VAR H:INTEGER);
(* LAESER HELTALLET VED NAVN 'A' IND I DEN VARIABLE H
OG CHECKER OM DET ER INTERVALLET Æ0;N-1Å *)
BEGIN
REPEAT
SVARTEST:=OK;
WRITE('Indtast ',A,':');
READ(H);
IF (H<0) OR (H>N1) THEN
BEGIN
WRITELN('Det indtastede ',A,'= ',H,' er ikke lovligt');
WRITELN(A,' skal vaere i intervallet Æ0;',N1,'Å');
SVARTEST:=IKKEOK;
END;
UNTIL SVARTEST=OK;
END;
BEGIN
WRITELN('PT. Kun en mulighed for efterbehandling af signalet');
WRITELN('Nemlig anvendelse af et firkantet vindue');
WRITELN('dvs. signalet ganges med flg. funktion.');
WRITELN(' 1 for a<x<b ');
WRITELN('F(X)= o.5 for x=a og x=b ');
WRITELN(' 0 ellers');
WRITELN('Hvor a,b,x er hele tal i intervaller Æ0;',n1,'Å');
WRITELN('og a<=b');
READHELTAL('a',V1);
REPEAT
SVARTEST:=OK;
READHELTAL('b',V2);
IF V2<V1 THEN
BEGIN
WRITELN('b skal vaere stoerre end a');
SVARTEST:=IKKEOK;
END;
UNTIL SVARTEST=OK;
FOR I:= 0 TO V1 DO
BEGIN
SIG1R(I):=0.0;
SIG1I(I):=0.0;
END;
SIG1R(V1):=0.5*SIG1R(V1);
SIG1I(V1):=0.5*SIG1I(V1);
SIG1R(V2):=0.5*SIG1R(V2);
SIG1I(V2):=0.5*SIG1I(V2);
FOR I:=V2+1 TO N1 DO
BEGIN
SIG1R(I):=0.0;
SIG1I(I):=0.0;
END;
END;
SEGMENT PROCEDURE SPEKTRUM(TEKST:OVERSKRIFT);
(* DENNE PROCEDURER STILLER ?? OM HVORDAN 'TEKST'
F.EKS. SPEKTRET SKAL PRAESENTERES *)
FUNCTION READSVAR(VAR TEGN:CHAR):CHECK;
BEGIN
READLN; READ(TEGN);
IF (TEGN<>'1') AND (TEGN<>'2') AND (TEGN<>'3') THEN
BEGIN
WRITELN('Det indtastede: ',TEGN,' er ikke lovligt.');
WRITELN('Kun 1,2,3 er lovlige svar.');
READSVAR:=IKKEOK;
END;
END;
BEGIN
REPEAT
SVARTEST:=OK;
PLOT:=FALSE;
WRITELN('Hvad skal plottet af ',TEKST,' indeholde?');
WRITELN('Der er flg. valgmuligheder:');
WRITELN;
WRITELN('1 Plot af ',REOGIM);
WRITELN('2 -"-- af ',AOGF);
WRITELN('3 Begge dele');
WRITE('Indtast nummeret paa det oenskede: ');
SVARTEST:=READSVAR(SPTYPE);
UNTIL SVARTEST=OK;
IF (SPTYPE<>'1') THEN
BEGIN
KONVERT(SIG1R,SIG1I,SIG2R,SIG2I);
PLOT:=TRUE;
END;
CASE SPTYPE OF
'1': FOR D:=1 TO 2 DO
BEGIN
SIGNALPLOT(D,1,FALSE,DEL(D));
END;
'2': FOR D:=1 TO 2 DO
BEGIN
SIGNALPLOT(D,2,TRUE,DEL(D+2));
END;
'3': BEGIN
FOR D:=1 TO 2 DO SIGNALPLOT(D,1,FALSE,DEL(D));
FOR D:=3 TO 4 DO SIGNALPLOT(D-2,2,TRUE,DEL(D));
END;
END;
IF (JANEJ(CONCAT('0nskes tabel over ',TEKST,' ?') )) THEN
BEGIN
REPEAT
SVARTEST:=OK;
WRITELN('Hvad skal tabellen indeholde?');
WRITELN;
WRITELN('Der flg. valgmuligheder:');
WRITELN('1 Tabel over ',REOGIM);
WRITELN('2 --"-- -"-- ',AOGF);
WRITELN('3 Baade og');
WRITE('Indtast nummeret paa det oenskede:');
SVARTEST:=READSVAR(SPTYPE);
UNTIL SVARTEST=OK;
IF (SPTYPE<>'1') AND (NOT PLOT) THEN
KONVERT(SIG1R,SIG1I,SIG2R,SIG2I);
CASE SPTYPE OF
'1': TABEL(SIG1R,SIG1I,REOGIM,DEL(1),DEL(2));
'2': TABEL(SIG2R,SIG2I,AOGF,DEL(3),DEL(4));
'3': BEGIN
TABEL(SIG1R,SIG1I,REOGIM,DEL(1),DEL(2));
TABEL(SIG2R,SIG2I,AOGF,DEL(3),DEL(4));
END;
END;
END;
END;
BEGIN
DEL(1):='realdelen';
DEL(2):='imaginaerdelen';
DEL(3):='amplituden';
DEL(4):='fasen';
NUMSIG(1):='f0rste';
NUMSIG(2):='andet';
TEST:=FALSE;
REPEAT
NSP0RGSMAAL;
SIGNALDEFINITION;
IF S=2 THEN TOSIGNAL;
IF JANEJ('0nskes signalet efterbehandlet?') THEN VINDUE;
FFT2(SIG1R,SIG1I,N,M);
SPEKTRUM('spektret');
FORTSAT:=(NOT JANEJ('0nskes behandlet flere signaler?'));
UNTIL FORTSAT;
WRITE('TAK FOR IDAG ');
END.