Pre_deconvolution.cpp
上传用户:jig320
上传日期:2008-05-30
资源大小:201k
文件大小:3k
源码类别:

Windows编程

开发平台:

Visual C++

  1. #include "iostream.h"
  2. #include "math.h"
  3. //#include <stdlib.h>
  4. #define M 20
  5. #define N 350
  6. double ** pre_deconv(double **y,int m,int n,int ln,int da);
  7. double ** zeros(int m,int n);
  8. double *xxcorr(double *Y,int n);
  9. double *div(double **A,double *b,int num);
  10. double *conv(double *a,double *b,int num);
  11. void main()
  12. {
  13.     double **p;
  14. int i,j;
  15.    p= new double*[2];
  16. for(i=0;i<2;i++)
  17.    p[i]=new double[20];
  18.   
  19.   p=zeros(M,N);
  20.   double **f=pre_deconv(p,M,N,20,1);
  21.   for(i=0;i<2;i++)
  22.    {  cout<<endl;
  23.    for(j=0;j<10;j++)
  24.    cout<<f[i][j]<<" ";
  25.    }
  26.    
  27. for(i=0;i<M;i++)
  28.    delete[] p[i];
  29.    delete[] p;
  30. }
  31. double ** pre_deconv(double **y,int m,int n,int ln,int da)
  32. {
  33.     int i,j,k;
  34. int yn=0;
  35. double **py=new double*[m];
  36. for(i=0;i<m;i++)
  37.  py[i]=new double[n];
  38. double **Dr;
  39. double *yy=new double[ln];
  40. while(yn<(n-n%ln))
  41. {
  42. yn=yn+ln;
  43. Dr=zeros(m,ln);
  44. for(i=0;i<m;i++)
  45. {
  46. for(k=0;k<ln;k++)
  47. yy[k]=y[i][yn+k];
  48. Dr[i]=xxcorr(yy,ln);
  49. }
  50. double *DR= new double[ln];
  51. for(i=0;i<ln;i++)
  52. {
  53. DR[i]=0;
  54. for(j=0;j<m;j++)
  55. DR[i]+=Dr[j][i];
  56. }
  57. double **A;       //Toeplitz矩阵
  58. A=zeros(ln,ln);
  59. for(i=0;i<ln;i++)
  60.  for(j=0;j<ln;j++)
  61. {
  62. if(j==i)A[i][j]=DR[0];
  63. else if(j>i)A[i][j]=DR[j-i];
  64. else A[i][j]=DR[i-j];
  65. }
  66.  double *b=new double[ln];
  67.  for(i=0;i<ln;i++)
  68.  {
  69.  if((da+i)<ln)b[i]=DR[da+i];
  70.  else b[i]=0;
  71.  }
  72.          double *x=div(A,b,ln); //求Ax=b, x=Ab;
  73.  double *C=new double[ln+da];//求反滤波因子C[1,0...0,-c1,-c2,..]
  74.  C[0]=1;
  75.  for(i=0;i<ln+da;i++)
  76.  {
  77.  if(i<da)C[i]=0;
  78. else C[i]=-x[i-da];
  79.          }
  80. ///////////////////////////////////做卷积...
  81.  
  82.  for(i=0;i<m;i++)
  83.  {
  84.  double *s=conv(Dr[i],C,ln);
  85.  for(j=0;j<ln;j++)
  86.  py[i][yn-ln+j]=s[j];
  87.  }
  88. }
  89.   
  90.   return py;
  91. }
  92. double ** zeros(int m,int n)
  93. {
  94. int i,j;
  95.     double  **a= new double*[m];
  96. for(i=0;i<m;i++)
  97. a[i]=new double[n];
  98. for(i=0;i<m;i++)
  99. for(j=0;j<n;j++)
  100. a[i][j]=0;
  101. return a;
  102. }
  103. double *xxcorr(double *Y,int n)
  104. {
  105. int i,j;
  106. double *X = new double[n];
  107. for(i=0;i<n;i++)
  108. {
  109. double xk=0;
  110. for(j=0;j+i<n;j++)
  111. xk+=Y[j]*Y[j+i];
  112. X[i]=xk;
  113. }
  114. return X;
  115. }
  116. double *div(double **A,double *b,int num)
  117. {
  118. int i,j,k;
  119. //共处理num-1行
  120. double *x0= new double[num];
  121. for(i=0;i<num-1;i++)
  122. {
  123. //每列选主元
  124. double lineMax=fabs(A[i][i]);
  125. int lineI=i;
  126. for(j=i;j<num;j++)
  127. if(fabs(A[j][i])>fabs(lineMax))lineI=j;
  128. //主元所在行和当前行交换
  129. for(j=i;j<num;j++)
  130. {
  131. //
  132. lineMax=A[i][j];
  133. A[i][j]=A[lineI][j];
  134. A[lineI][j]=lineMax;
  135. lineMax=b[lineI];
  136. b[i]=b[lineI];
  137. b[lineI]=lineMax;
  138. }
  139. if(A[i][i]==0)continue;
  140. //将A变为上三角
  141. for(j=i+1;j<num;j++)
  142. {
  143. double temp=-A[j][i]/A[i][i];
  144. for(k=i;k<num;k++)
  145. {
  146. A[j][k]+=temp*A[i][k];
  147. }
  148. b[j]+=temp*b[i];
  149. }
  150. }
  151. double determinantA=1;
  152. for(i=0;i<num;i++)
  153. determinantA*=A[i][i];
  154. //回代求解x初值
  155. x0[num-1]=0;
  156. for(i=num-1;i>=0;i--)
  157. {
  158. for(j=num-1;j>i;j--)
  159. b[i]-=A[i][j]*x0[j];
  160. x0[i]=b[i]/A[i][i];
  161. }
  162. //////
  163. return x0;
  164. }
  165. double *conv(double *a,double *b,int num)
  166. {
  167. int i,t;
  168. double *c1=new double[num];
  169.     for(i=0;i<num;i++) 
  170.   
  171.  {
  172.  
  173.       c1[i]=0;
  174.   
  175.      for(t=num;t>=0;t--)                 // 做卷积
  176. if(t<=i)c1[i]+=*(a+t)*(*(b+i-t));
  177. else continue;
  178.      }
  179. return c1;
  180. }