vector_quantization.c
上传用户:bossps2lzz
上传日期:2022-07-07
资源大小:522k
文件大小:2k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <math.h>
  2. struct buffer {
  3. short data[100][256];
  4. };
  5. #define dim 8
  6. #define nn 8
  7. float codebk[8][128];
  8. void vetcor_quantization(struct buffer *data) {
  9. nn=no_tr_vec;
  10.         mtemp=1;
  11.         for (k=0;k<dim;++k) {
  12.           codebk[0][k]=0.0;
  13.           for (i=0;i<nn;++i) {
  14.             codebk[0][k]+=data[i][k];
  15.           }
  16.           codebk[0][k]/=(float) nn;
  17.         }
  18.         while (mtemp < cb_size) {
  19.           mtemp=mtemp*2;
  20.           for(i=0;i<mtemp;++i) {  /* splitting */
  21.             j=i/2;
  22.             del = 0.001;
  23.             if(i == i/2*2) del=-0.001;
  24.             for (k=0;k<dim;++k)
  25.               yy[i][k]=codebk[j][k]*(1.0+del);
  26.           }
  27.           totd2=10.0e15;
  28.           flag1 = 0;
  29.           while ( flag1 == 0) {
  30.             totd1=0.0;
  31.             for(i=0;i<mtemp;++i) {
  32.               for(k=0;k<dim;++k)
  33.                 codebk[i][k]=0.0;
  34.               bin[i]=0;
  35.             }
  36.             for(i=0;i<nn;++i){
  37.               j=0;
  38.               dist2=0.0;
  39.               for(k=0;k<dim;++k) {
  40.                 dist2+=(data[i][k]-yy[j][k])*(data[i][k]-yy[j][k]);
  41.               }
  42.               index=0;
  43.               for(j=1;j<mtemp;++j){
  44.                 dist1=0.0;
  45.                 for(k=0;k<dim;++k)
  46.                   dist1+=(data[i][k]-yy[j][k])*(data[i][k]-yy[j][k]);
  47.                 if(dist1 < dist2){
  48.                   dist2=dist1;
  49.                   index=j;
  50.                 }
  51.               }
  52.               ++bin[index];
  53.               for(k=0;k<dim;++k)
  54.                 codebk[index][k]+=data[i][k];
  55.               totd1=totd1+dist2;
  56.             }  /* end for i<nn */
  57.             for(j=0;j<mtemp;++j){
  58.               if(bin[j] > 0) {
  59.                 for(k=0;k<dim;++k){
  60.                   codebk[j][k]/=(float) bin[j];
  61.                   yy[j][k]=codebk[j][k];
  62.                 }
  63.               }
  64.             }
  65.     totd1/=(float) nn*dim;
  66.             drel=(totd2-totd1)/totd1;
  67.     k=fflush(res_file);
  68.             flag1 = 1;
  69.             if(drel > 0.001) {
  70.               flag1 = 0;
  71.               totd2=totd1;
  72.             }
  73.           }   /* end while flag1 */
  74.         }   /* end while mtemp<cb_size */
  75. dist=totd1;