|
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 - 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.