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

  1. ' *********************************************************
  2. ' *    Gehirnstrommessung  und  Auswertung auf Atari ST   *
  3. ' *          BRAIN.GFA für GFA-BASIC ab Version 3.0       *
  4. ' *                 Version 1.0 vom 8.3.'91               *
  5. ' *            (c) 1991 toolbox & Carsten Fabich          *
  6. ' *********************************************************
  7. '
  8. ' Sampler initialisieren:
  9. '
  10. ' im folgenden Inline ist Platz für die Interruptroutine
  11. ' und den Datenpuffer. Bitte hier Assemblersource laden:
  12. INLINE obj%,4150
  13. ' Zeiger auf aktuelles Byte vom AD-Wandler:
  14. ABSOLUTE count&,obj%+&H32
  15. ' Anzahl der Datenbytes:
  16. ABSOLUTE anzahl&,obj%+&H34
  17. ' Adresse des ersten Datenbytes:
  18. puffer%=obj%+&H36
  19. '
  20. ' Fouriertransformation vorbereiten:
  21. '
  22. ' Speicher für Real- und Imaginärteil der FFT:
  23. DIM rt(1024),it(1024),merk(1024)
  24. n%=128      ! Anzahl der Frequenzbänder
  25. nn%=n%-1    ! FFT-Felder beginnen mit dem Index 0
  26. kwnn=1/nn%  ! Kehrwert von nn% für schnellere Division
  27. kwn=1/n%    ! Kehrwert von n% für schnellere Division
  28. btof=1/128  ! für Umwandlung von Byte nach Float
  29. '
  30. ' Nummerierung der Frequenzbänder:
  31. FOR i%=1 TO 31
  32.   TEXT i%*20-5,320,STR$(i%)
  33. NEXT i%
  34. TEXT 10,16,"Meßsignal:"
  35. TEXT 10,216,"Frequenzspektrum:"
  36. DEFFILL 0,0,0
  37. '
  38. ' jetzt wird gesampelt:
  39. '
  40. REPEAT
  41.   ' Anzahl der zu samplenden Bytes in die
  42.   ' Interruptroutine kopieren:
  43.   anzahl&=n%
  44.   ' Zaehler zurücksetzen:
  45.   count&=0
  46.   '
  47.   ' Mit XBIOS 31 Samplefrequenz einstellen, Timer starten:
  48.   VOID XBIOS(31,W:0,W:4,W:245,L:obj%)
  49.   ' Einstellung des Kontroll- und Datenworts für Timer A:
  50.   '   4 / 245 für 200  Hz Samplefrequenz
  51.   '   4 /  99 für 500  Hz
  52.   '   2 / 245 für   1 kHz
  53.   '
  54.   ' Abwarten bis Interrupt-Routine fertig ist:
  55.   REPEAT
  56.   UNTIL count&=n%
  57.   '
  58.   ' Timer abstellen:
  59.   VOID XBIOS(31,W:0,W:0,W:0,L:0)
  60.   '
  61.   ' jetzt liegen ab "Puffer%" "anzahl&" gesampelte Bytes
  62.   '
  63.   ' altes Meßsignal löschen:
  64.   PBOX 0,19,639,200
  65.   ' Null-Linie Zeichnen:
  66.   LINE 0,100,639,100
  67.   '
  68.   ' Neue Messwerte auf den Bildschirm plotten und
  69.   ' in komplexes Zahlenfeld übertragen:
  70.   PLOT 0,100-50*(-1+PEEK(puffer%)*btof)
  71.   FOR i%=0 TO nn%
  72.     ' Integerwerte aus dem Puffer in FFT-Feld kopieren:
  73.     rt(i%)=-1+PEEK(puffer%+i%)*btof
  74.     ' Imaginärteil zurücksetzen:
  75.     it(i%)=0
  76.     ' Die Float-Werte liegen jetzt zwischen -1 und 1
  77.     ' Messwert zeichnen
  78.     DRAW  TO i%*640*kwnn,100-50*rt(i%)
  79.   NEXT i%
  80.   '
  81.   ' Bitreverse shuffling für Butterfly-FFT:
  82.   a%=0
  83.   FOR b%=1 TO nn%
  84.     pos%=SHR(n%,1)
  85.     WHILE (a%+pos%)>nn%
  86.       pos%=SHR(pos%,1)
  87.     WEND
  88.     a%=(a% MOD pos%)+pos%
  89.     IF a%>b%
  90.       SWAP rt(b%),rt(a%)
  91.     ENDIF
  92.   NEXT b%
  93.   '
  94.   ' jetzt die eigentliche FFT:
  95.   pos%=1
  96.   WHILE pos%<n%
  97.     sch%=pos%+pos%
  98.     a=PI/pos%
  99.     c=COS(a)
  100.     s=SIN(a)
  101.     wr=1
  102.     wi=0
  103.     FOR m%=1 TO pos%
  104.       i%=SUB(m%,1)
  105.       REPEAT
  106.         j%=ADD(i%,pos%)
  107.         tr=wr*rt(j%)-wi*it(j%)
  108.         ti=wr*it(j%)+wi*rt(j%)
  109.         rt(j%)=rt(i%)-tr
  110.         it(j%)=it(i%)-ti
  111.         rt(i%)=rt(i%)+tr
  112.         it(i%)=it(i%)+ti
  113.         i%=i%+sch%
  114.       UNTIL i%>=n%
  115.       tr=wr*c-wi*s
  116.       wi=wi*c+wr*s
  117.       wr=tr
  118.     NEXT m%
  119.     pos%=sch%
  120.   WEND
  121.   '
  122.   ' Altes Frequenzspektrum löschen
  123.   PBOX 0,219,639,305
  124.   '
  125.   ' Neues Spektrum zeichnen:
  126.   DEFLINE 1,15 ! Linienstärke für Balken einstellen
  127.   FOR i%=1 TO 31
  128.     x%=1+i%*20
  129.     y%=-800*SQR(rt(i%)*rt(i%)+it(i%)*it(i%))*kwn
  130.     LINE x%,300,x%,300+y%
  131.   NEXT i%
  132.   DEFLINE 1,1
  133.   ' Abbruch bei Mausklick oder Taste
  134. UNTIL MOUSEK OR INKEY$<>""
  135. END
  136. '***********************************************************
  137. '*                   Ende von BRAIN.GFA                    *
  138.