home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
06
/
praxis
/
brain_st.gfa
next >
Wrap
Text File
|
1991-03-26
|
4KB
|
138 lines
' *********************************************************
' * 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 *