home *** CD-ROM | disk | FTP | other *** search
- ' *********************************************************
- ' * Gehirnstrommessung und Auswertung auf Atari ST *
- ' * BRAIN.GFA für GFA-BASIC ab Version 3.0 *
- ' * Version 1.0 vom 8.3.'91 *
- ' * (c) 1991 toolbox & Carsten Fabich *
- ' *********************************************************
- '
- ' Sampler initialisieren:
- '
- ' im folgenden Inline ist Platz für die Interruptroutine
- ' und den Datenpuffer. Bitte hier Assemblersource laden:
- INLINE obj%,4150
- ' Zeiger auf aktuelles Byte vom AD-Wandler:
- ABSOLUTE count&,obj%+&H32
- ' Anzahl der Datenbytes:
- ABSOLUTE anzahl&,obj%+&H34
- ' Adresse des ersten Datenbytes:
- puffer%=obj%+&H36
- '
- ' Fouriertransformation vorbereiten:
- '
- ' Speicher für Real- und Imaginärteil der FFT:
- DIM rt(1024),it(1024),merk(1024)
- n%=128 ! Anzahl der Frequenzbänder
- nn%=n%-1 ! FFT-Felder beginnen mit dem Index 0
- kwnn=1/nn% ! Kehrwert von nn% für schnellere Division
- kwn=1/n% ! Kehrwert von n% für schnellere Division
- btof=1/128 ! für Umwandlung von Byte nach Float
- '
- ' Nummerierung der Frequenzbänder:
- FOR i%=1 TO 31
- TEXT i%*20-5,320,STR$(i%)
- NEXT i%
- TEXT 10,16,"Meßsignal:"
- TEXT 10,216,"Frequenzspektrum:"
- DEFFILL 0,0,0
- '
- ' jetzt wird gesampelt:
- '
- REPEAT
- ' Anzahl der zu samplenden Bytes in die
- ' Interruptroutine kopieren:
- anzahl&=n%
- ' Zaehler zurücksetzen:
- count&=0
- '
- ' Mit XBIOS 31 Samplefrequenz einstellen, Timer starten:
- VOID XBIOS(31,W:0,W:4,W:245,L:obj%)
- ' Einstellung des Kontroll- und Datenworts für Timer A:
- ' 4 / 245 für 200 Hz Samplefrequenz
- ' 4 / 99 für 500 Hz
- ' 2 / 245 für 1 kHz
- '
- ' Abwarten bis Interrupt-Routine fertig ist:
- REPEAT
- UNTIL count&=n%
- '
- ' Timer abstellen:
- VOID XBIOS(31,W:0,W:0,W:0,L:0)
- '
- ' jetzt liegen ab "Puffer%" "anzahl&" gesampelte Bytes
- '
- ' altes Meßsignal löschen:
- PBOX 0,19,639,200
- ' Null-Linie Zeichnen:
- LINE 0,100,639,100
- '
- ' Neue Messwerte auf den Bildschirm plotten und
- ' in komplexes Zahlenfeld übertragen:
- PLOT 0,100-50*(-1+PEEK(puffer%)*btof)
- FOR i%=0 TO nn%
- ' Integerwerte aus dem Puffer in FFT-Feld kopieren:
- rt(i%)=-1+PEEK(puffer%+i%)*btof
- ' Imaginärteil zurücksetzen:
- it(i%)=0
- ' Die Float-Werte liegen jetzt zwischen -1 und 1
- ' Messwert zeichnen
- DRAW TO i%*640*kwnn,100-50*rt(i%)
- NEXT i%
- '
- ' Bitreverse shuffling für Butterfly-FFT:
- a%=0
- FOR b%=1 TO nn%
- pos%=SHR(n%,1)
- WHILE (a%+pos%)>nn%
- pos%=SHR(pos%,1)
- WEND
- a%=(a% MOD pos%)+pos%
- IF a%>b%
- SWAP rt(b%),rt(a%)
- ENDIF
- NEXT b%
- '
- ' jetzt die eigentliche FFT:
- pos%=1
- WHILE pos%<n%
- sch%=pos%+pos%
- a=PI/pos%
- c=COS(a)
- s=SIN(a)
- wr=1
- wi=0
- FOR m%=1 TO pos%
- i%=SUB(m%,1)
- REPEAT
- j%=ADD(i%,pos%)
- tr=wr*rt(j%)-wi*it(j%)
- ti=wr*it(j%)+wi*rt(j%)
- rt(j%)=rt(i%)-tr
- it(j%)=it(i%)-ti
- rt(i%)=rt(i%)+tr
- it(i%)=it(i%)+ti
- i%=i%+sch%
- UNTIL i%>=n%
- tr=wr*c-wi*s
- wi=wi*c+wr*s
- wr=tr
- NEXT m%
- pos%=sch%
- WEND
- '
- ' Altes Frequenzspektrum löschen
- PBOX 0,219,639,305
- '
- ' Neues Spektrum zeichnen:
- DEFLINE 1,15 ! Linienstärke für Balken einstellen
- FOR i%=1 TO 31
- x%=1+i%*20
- y%=-800*SQR(rt(i%)*rt(i%)+it(i%)*it(i%))*kwn
- LINE x%,300,x%,300+y%
- NEXT i%
- DEFLINE 1,1
- ' Abbruch bei Mausklick oder Taste
- UNTIL MOUSEK OR INKEY$<>""
- END
- '***********************************************************
- '* Ende von BRAIN.GFA *
-