home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / bench / BIS / bis.c < prev    next >
C/C++ Source or Header  |  1995-05-17  |  3KB  |  231 lines

  1. #include <stdio.h>
  2. #include <time.h>
  3. #include <math.h>
  4.  
  5. #define LUT_SIZE 10000
  6. #define IMA_SIZE 256
  7.  
  8. #define IX(f,x,y) ((f)->data[(f)->width * (y) + (x)])
  9.  
  10. #define c_add(r,a,b)  (r).x = (a).x + (b).x, (r).y = (a).y + (b).y
  11. #define c_sub(r,a,b)  (r).x = (a).x + (b).x, (r).y = (a).y + (b).y
  12. #define c_mul(r,a,b)  (r).x = (a).x * (b).x - (a).y * (b).y, \
  13.                       (r).y = (a).x * (b).y + (a).y * (b).x
  14. #define c_cmul(r,a,b) (r).x = (a).x * (b).x + (a).y * (b).y, \
  15.                       (r).y = (a).x * (b).y - (a).y * (b).x
  16.  
  17. typedef struct {
  18.     double x;
  19.     double y;
  20. } Complex;
  21.  
  22. typedef struct {
  23.     float x;
  24.     float y;
  25. } ShortComplex;
  26.  
  27. typedef struct {
  28.     short x;
  29.     short y;
  30. } ShortVec;
  31.  
  32. typedef struct {
  33.     ShortVec u;
  34.     ShortVec v;
  35. } ShortVecPair;
  36.  
  37. typedef struct {
  38.     int width;
  39.     int height;
  40.     float *data;
  41.     float vec[1];
  42. } Ima;
  43.  
  44. typedef struct {
  45.     int width;
  46.     int height;
  47.     Complex *data;
  48.     Complex vec[1];
  49. } Fos;
  50.  
  51. typedef struct {
  52.     int length;
  53.     ShortVecPair *list;
  54.     ShortVecPair vec[1];
  55. } Lut;
  56.  
  57. typedef struct {
  58.     int length;
  59.     Complex *list;
  60.     Complex vec[1];
  61. } Bis;
  62.  
  63. Lut *the_lut;
  64. Fos *the_fos;
  65. Bis *the_bis;
  66.  
  67. Lut *alloc_lut(n)
  68. int n;
  69. {
  70.     Lut *lut;
  71.  
  72.     lut = (Lut *)malloc(sizeof(Lut) + (n-1) * sizeof(ShortVecPair));
  73.     if (!lut) fatal("can't alloc_lut");
  74.  
  75.     lut->length = n;
  76.     lut->list = &lut->vec[0];
  77.  
  78.     return lut;
  79. }
  80.  
  81. Bis *alloc_bis(n)
  82. int n;
  83. {
  84.     Bis *bis;
  85.  
  86.     bis = (Bis *)malloc(sizeof(Bis) + (n-1) * sizeof(Complex));
  87.     if (!bis) fatal("can't alloc_bis");
  88.  
  89.     bis->length = n;
  90.     bis->list = &bis->vec[0];
  91.  
  92.     return bis;
  93. }
  94.  
  95. Fos *alloc_fos(n)
  96. int n;
  97. {
  98.     Fos *fos;
  99.  
  100.     fos = (Fos *)malloc(sizeof(Fos) + (n*n-1) * sizeof(Complex));
  101.     if (!fos) fatal("can't alloc_fos");
  102.  
  103.     fos->width = n;
  104.     fos->height = n;
  105.     fos->data = &fos->vec[0];
  106.  
  107.     return fos;
  108. }
  109.  
  110. cleanup()
  111. {
  112.     if (the_bis) free(the_bis);
  113.     if (the_fos) free(the_fos);
  114.     if (the_lut) free(the_lut);
  115. }
  116.  
  117. fatal(s)
  118. char *s;
  119. {
  120.     if (s) fprintf(stderr,"FATAL: %s\n",s);
  121.     cleanup();
  122.     exit(99);
  123. }
  124.  
  125. bispectrum(fos,lut,bis)
  126. Fos *fos;
  127. Lut *lut;
  128. Bis *bis;
  129. {
  130.     int i;
  131.     ShortVec u,v;
  132.     Complex b,c;
  133.     Complex one, two;
  134.  
  135.     for (i=0; i<lut->length; ++i) {
  136.         u = lut->list[i].u;
  137.         v = lut->list[i].v;
  138.         one = IX(fos, u.x, u.y);
  139.         two = IX(fos, v.x, v.y);
  140.         c_mul(b, one, two);
  141.         one = IX(fos, u.x+v.x, u.y+v.y);
  142.         c_cmul(c, b, one);
  143.         b = bis->list[i];
  144.         c_add(b, b, c);
  145.         bis->list[i] = b;
  146.     }
  147. }
  148.  
  149. clear_bis(bis)
  150. Bis *bis;
  151. {
  152.     int i;
  153.  
  154.     for (i=0; i<bis->length; ++i) {
  155.         bis->list[i].x = 0.0;
  156.         bis->list[i].y = 0.0;
  157.     }
  158. }
  159.  
  160. fake_fos(fos)
  161. Fos *fos;
  162. {
  163.     int i,j;
  164.  
  165.     for (i=0; i<IMA_SIZE; ++i)
  166.         for (j=0; j<IMA_SIZE; ++j) {
  167.             IX(fos,j,i).x = exp(-(double)(i*i+j*j));
  168.             IX(fos,j,i).y = 1.0;
  169.         }
  170. }
  171.  
  172. void fake_lut(lut)
  173. Lut *lut;
  174. {
  175.     int i,j;
  176.     int n;
  177.     ShortVec u,v;
  178.  
  179.     n = 0;
  180.     for (i=0; i<IMA_SIZE; ++i)
  181.         for (j=0; j<=i; ++j) {
  182.             u.x = i;
  183.             u.y = j;
  184.             v.x = IMA_SIZE-1 - i;
  185.             v.y = IMA_SIZE-1 - j;
  186.             lut->list[n].u = u;
  187.             lut->list[n].v = v;
  188.             ++n;
  189.             if (n >= lut->length) return;
  190.         }
  191. }
  192.  
  193. double sumall(bis)
  194. Bis *bis;
  195. {
  196.     int i;
  197.     double sum;
  198.  
  199.     sum = 0.0;
  200.     for (i=0; i<bis->length; ++i)
  201.         sum += bis->list[i].x + bis->list[i].y;
  202.     return sum;    
  203. }
  204.  
  205. main()
  206. {
  207.     time_t start,stop;
  208.     int i;
  209.  
  210.     the_lut = alloc_lut(LUT_SIZE);
  211.     the_fos = alloc_fos(IMA_SIZE);
  212.     the_bis = alloc_bis(LUT_SIZE);
  213.  
  214.     fake_fos(the_fos);
  215.     fake_lut(the_lut);
  216.     clear_bis(the_bis);
  217.  
  218.     time(&start);
  219.  
  220.     for (i=0; i<1000; ++i)
  221.         bispectrum(the_fos,the_lut,the_bis);
  222.  
  223.     time(&stop);
  224.  
  225.     printf("sum = %f\n",sumall(the_bis));
  226.  
  227.     printf("%d seconds\n",stop-start);
  228.  
  229.     cleanup();
  230. }
  231.