home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 202.lha / FFT / arcsin < prev    next >
Encoding:
Text File  |  1988-12-28  |  1.8 KB  |  64 lines

  1. ANEW TASK-ARCSIN
  2.  
  3. OB.ARRAY SIN-TABLE
  4. VARIABLE FP
  5.  
  6. \ change df1: later with assign
  7.  
  8. : LOADTABLE
  9.   " 4th:FFT/SINETABLE" $FOPEN  DUP IF FP ! 
  10.                        ELSE ABORT" SINETABLE NOT FOUND!"  THEN
  11.   1000 NEW: SIN-TABLE
  12.   FP @ DATA.ADDR: SIN-TABLE 4000 FREAD FP @ FCLOSE
  13.   DUP 0> IF CR . ."  BYTES READ TO SINE TABLE" CR 
  14.         ELSE FREE: SIN-TABLE ABORT" SINE TABLE WENT WRONG!!!" THEN
  15. ;
  16.  
  17.  
  18.  
  19. \ BSEARCH FOR ARCSIN
  20. \ B stands for Brute force
  21. \ binary search on sin-table values
  22. : ARCSINSEARCH ( SIN -- INDEX) 
  23.   >R 0 999 ( -- lo hi)
  24.   BEGIN
  25.      2DUP + 2/ ( -- low hi ave)
  26.      DUP AT: SIN-TABLE ( -- low hi ave sinval)
  27.      R@ 2DUP   ( -- low hi ave sinval sin sinval sin )
  28.      = IF RDROP DROP DROP NIP NIP EXIT ELSE ( -- index | low hi ave sinval sin)
  29.           U> IF NIP        ( -- low newhi) 
  30.             ELSE -ROT NIP  ( -- newlow hi)
  31.             THEN
  32.        THEN
  33.      2DUP SWAP - 1 = 
  34.    UNTIL       ( -- lo hi, stop when differ by 1)
  35.    2DUP AT: SIN-TABLE R@  - ( -- lo hi lo hisin-sin)
  36.    SWAP AT: SIN-TABLE R> SWAP - ( -- lo hi hi-sin sin-lo)
  37.    > IF DROP ELSE NIP THEN
  38. ;
  39.     
  40. \ DEGREES    
  41. : ARCSIN ( sin -- degrees)
  42.   DUP 0< IF NEGATE ARCSINSEARCH NEGATE ELSE ARCSINSEARCH THEN
  43.   9000 1000 */
  44. ;
  45.  
  46. : ARCSIN.INDEX ( sin -- signed index)
  47.   DUP 0< IF NEGATE ARCSINSEARCH NEGATE ELSE ARCSINSEARCH THEN 
  48. ;
  49.  
  50. : SIN.LOOKUP ( index -- degrees*10000)
  51.   DUP ABS 1000 >= IF ABORT" INDEX TO SINE TABLE TOO BIG!" CR THEN
  52.   DUP 0< IF NEGATE AT: SIN-TABLE NEGATE ELSE AT: SIN-TABLE THEN ;
  53.  
  54. \ The following is only used in fft, where we have an index to the
  55. \ table gotten from ARCSIN.INDEX.  We need the sine AND cosine.
  56. \ cos(a) = sin(a+90)
  57. : COS.LOOKUP ( sinindex -- degrees*10000)
  58.   DUP 0< IF 1000 + SIN.LOOKUP ELSE 
  59.       DUP 0= IF DROP 10000    ELSE
  60.       1000 SWAP - SIN.LOOKUP  
  61.   THEN THEN      
  62. ;
  63.  
  64.