home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1991 / 05 / bittman / ddj_32c.c next >
Text File  |  1991-02-10  |  3KB  |  112 lines

  1. /******* FILE DDJ_32C.C, FOR USE ON DSP BOARD WITH AT&T 'C' ****/
  2.  
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <nr.h>
  6.  
  7. #define PI 3.1415926
  8. #define SQR(a) ((a)*(a))
  9.  
  10. asm(".global i1, i2, o1, o2");
  11. asm(".global funcnum, bs");
  12. asm(".global amp, dco, freq, samprate");
  13.  
  14. short funcnum;
  15. short bs;
  16.  
  17. float *i1, *i2, *o1, *o2;
  18. float amp, dco, freq, samprate;
  19.  
  20. short fft_stages(fft_size)
  21. short fft_size;
  22. {
  23.    short rtn;
  24.  
  25.    switch(fft_size)
  26.    {
  27.       case 32  : rtn = 5; break;
  28.       case 64  : rtn = 6; break;
  29.       case 128 : rtn = 7; break;
  30.       case 256 : rtn = 8; break;
  31.       case 512 : rtn = 9; break;
  32.       case 1024 : rtn = 10; break;
  33.       case 2048 : rtn = 11; break;
  34.       case 4096 : rtn = 12; break;
  35.       case 8192 : rtn = 13; break;
  36.       default  : rtn = 0; break;
  37.    }
  38.    return(rtn);
  39. }
  40.  
  41. main()
  42. {
  43.      register float scal;
  44.      short n;
  45.      float *data1, *data2, temp;
  46.      register short i,j;
  47.  
  48.      while (1) {
  49.        funcnum=0;
  50.        /* WAIT FOR PC TO DOWNLOAD FUNCTION NUMBER */
  51.        while (!(funcnum));
  52.        n = bs >> 1;
  53.        switch(funcnum) {
  54.           case 1: /* CONVERT TO DSP FORMAT */
  55.                     dsp32(bs,o1);
  56.                     break;
  57.  
  58.           case 2: /* CONVERT TO IEEE FORMAT */
  59.                     ieee32(bs,o1);
  60.                     break;
  61.  
  62.           case 3: /* SYNTHESIZE COSINE */
  63.                     scal = 2.0 * PI * freq / samprate;
  64.                     j = 0;
  65.                     data1 = o1;
  66.                     for (i=bs; i-- > 0; j++) {
  67.                       *data1++ = (amp * cos(scal * j)) + dco;
  68.                     }
  69.                     break;
  70.  
  71.           case 4: /* FORWARD FFT */
  72.                     data1 = o1;
  73.                     data1--;
  74.                     realft(data1,n,1);
  75.                     break;
  76.  
  77.           case 5: /* INVERSE FFT */
  78.                     data1 = o1;
  79.                     data1--;
  80.                     realft(data1,n,-1);
  81.  
  82.                     /* scale by 1/n to retain original amplitude */
  83.                     data1 = o1;
  84.                     scal = 1.0 / n;
  85.                     for (i=bs; i-- > 0; data1++) {
  86.                       *data1 = *data1 * scal;
  87.                     }
  88.                     break;
  89.  
  90.           case 6: /* CALCULATE LOG-MAGNITUDE (data output from NR-realft) */
  91.                     o1[0]=log10(SQR(i1[0]));
  92.                     temp=log10(SQR(i1[1]));
  93.                     for (i=1;i<n;i++) {
  94.                       o1[i]=log10(SQR(i1[2*i])+SQR(i1[2*i+1]));
  95.                     }
  96.                     o1[n] = temp;
  97.                     for (i=n+1;i<bs;i++) {
  98.                       o1[i]=0.0;
  99.                     }
  100.                     break;
  101.  
  102.           case 7: /* FORWARD FFT */
  103.                     data1 = o1;
  104.                     rffta(bs,fft_stages(bs),data1);
  105.                     break;
  106.  
  107.           default : break;
  108.        }
  109.      }
  110. }
  111. 
  112.