예제 #1
0
 public static void conjugate_complex(int n,complex[] in1,complex[] out1) {
   int i = 0;
   for(i=0;i<n;i++) {
     out1[i].imag = -in1[i].imag;
     out1[i].real = in1[i].real;
   }
 }
예제 #2
0
 public static void Wn_i(int n, int i, complex Wn, int flag)
 {
   Wn.real = Math.Cos(2*PI*i/n);
   if(flag == 1)
   Wn.imag = -Math.Sin(2*PI*i/n);
   else if(flag == 0)
   Wn.imag = -Math.Sin(2*PI*i/n);
 }
예제 #3
0
 public static void c_abs(complex[] f,double[] out1,int n) {
   int i = 0;
   double t;
   for(i=0;i<n;i++) {
     t = f[i].real * f[i].real + f[i].imag * f[i].imag;
     out1[i] = Math.Sqrt(t);
   }
 }
예제 #4
0
        //傅里叶变化
        public static void fft(int N, complex[] f)
        {
          complex t=new complex(),wn=new complex();//中间变量
          int i,j,k,m,n,l,r,M;
          int la,lb,lc;
          /*----计算分解的级数M=log2(N)----*/
          for(i=N,M=1;(i=i/2)!=1;M++);
          /*----按照倒位序重新排列原信号----*/
          for(i=1,j=N/2;i<=N-2;i++) {
            if(i<j)
            {
              t=f[j];
              f[j]=f[i];
              f[i]=t;
            }
            k=N/2;
            while(k<=j)
            {
              j=j-k;
              k=k/2;
            }
            j=j+k;
          }

          /*----FFT算法----*/
          for(m=1;m<=M;m++) {
            la=(int)Math.Pow(2,m); //la=2^m代表第m级每个分组所含节点数
            lb=la/2;    //lb代表第m级每个分组所含碟形单元数
                         //同时它也表示每个碟形单元上下节点之间的距离
            /*----碟形运算----*/
            for(l=1;l<=lb;l++) {
              r=(int)((l-1)*Math.Pow(2,M-m));
              for(n=l-1;n<N-1;n=n+la) //遍历每个分组,分组总数为N/la
              {
                lc=n+lb;  //n,lc分别代表一个碟形单元的上、下节点编号
                Wn_i(N,r,wn,1);//wn=Wnr
                c_mul(f[lc],wn,t);//t = f[lc] * wn复数运算
                c_sub(f[n],t,(f[lc]));//f[lc] = f[n] - f[lc] * Wnr
                c_plus(f[n],t,(f[n]));//f[n] = f[n] + f[lc] * Wnr
              }
            }
          }
        }
예제 #5
0
 public static void c_div(complex a, complex b, complex c)
 {
   c.real = (a.real * b.real + a.imag * b.imag)/(b.real * b.real +b.imag * b.imag);
   c.imag = (a.imag * b.real - a.real * b.imag)/(b.real * b.real +b.imag * b.imag);
 }
예제 #6
0
 public static void c_mul(complex a, complex b, complex c)
 {
   c.real = a.real * b.real - a.imag * b.imag;
   c.imag = a.real * b.imag + a.imag * b.real;
 }
예제 #7
0
 public static void c_sub(complex a, complex b, complex c)
 {
   c.real = a.real - b.real;
   c.imag = a.imag - b.imag;
 }
예제 #8
0
 public static void c_plus(complex a, complex b, complex c)
 {
   c.real = a.real + b.real;
   c.imag = a.imag + b.imag;
 }
예제 #9
0
        public static void getRawData(complex[] data, double[] Tr, double[] R_path, double[] T_path, double[] Targets, double[] sigma, long TargetNum, double ApertureRange_min, double ApertureRange_max)
        {
	        double tp = Tp;

	        calculateData(data, Tr, tp, R_path, T_path, Targets, sigma, TargetNum, R_center, ApertureRange_min, ApertureRange_max);
	        /*
	        double *data_r,*data_i;
	        FILE *file_r,*file_i;
	        file_r=fopen("RawEcho_r.dat","wb");
	        file_i=fopen("RawEcho_i.dat","wb");
	        data_r=new double[AziNum*RanNum];
	        data_i=new double[AziNum*RanNum];
	        for (int i=0;i<AziNum*RanNum;i++) {
	        data_r[i]=data[i].real;
	        data_i[i]=data[i].imag;
	        }
	        fwrite(data_r,sizeof(double),AziNum*RanNum,file_r);
	        fwrite(data_i,sizeof(double),AziNum*RanNum,file_i);
	        fclose(file_r);
	        fclose(file_i);
	        delete[] data_r;
	        delete[] data_i;*/

	        //生成参考函数
	        complex[] ran_ref=new complex[RanNum];
            for (int i = 0; i < RanNum;i++ )
            {
                ran_ref[i] = new complex();
            }

                
            createRanRef(ran_ref, Tr);
	        fftshift(ran_ref, RanNum);

	        //回波生成
            FFT.fft((int)RanNum, ran_ref);
	        for (int i = 0; i<AziNum; i++) {
                complex[] tmpData = new complex[RanNum];
                for (int j = 0; j < RanNum; j++) {
                    tmpData[j] = data[RanNum * i + j];
                }
                FFT.fft((int)RanNum, tmpData);
	        }
	        createRawData(data, data, ran_ref);

	        for (int i = 0; i<AziNum; i++) {
                complex[] tmpData = new complex[RanNum];
                for (int j = 0; j < RanNum; j++)
                {
                    tmpData[j] = data[RanNum * i + j];
                }
                FFT.ifft((int)RanNum, tmpData);
	        }
        }
예제 #10
0
        public static void createRawData(complex[] dev_RawData, complex[] dev_data, complex[] RanRef)
        {
	        for (int j = 0; j<AziNum; j++) {
		        for (int i = 0; i<RanNum; i++) {
			        double real = dev_RawData[j*RanNum + i].real;
			        double imag = dev_RawData[j*RanNum + i].imag;
			        dev_RawData[j*RanNum + i].real = real*RanRef[i].real - imag*RanRef[i].imag;
			        dev_RawData[j*RanNum + i].imag = real*RanRef[i].imag + imag*RanRef[i].real;
		        }
	        }
        }
예제 #11
0
        public static void calculateData(complex[] data, double[] Tr, double tp, double[] R_path, double[] T_path, double[] Targets, double[] sigma, long TargetNum, double R_center, double ApertureRange_min, double ApertureRange_max)
        {
	        for (int j = 0; j<AziNum; j++) {
		        for (int i = 0; i<RanNum; i++) {
			        data[j*RanNum + i].real = 0;
			        data[j*RanNum + i].imag = 0;
			        for (int t = 0; t < TargetNum; t++) {
				        double TargetRange = Targets[t * 3 + 1] - R_path[3 * j + 1];
				        if ((TargetRange >= (ApertureRange_min)) && (TargetRange<(ApertureRange_max))) {
					        double Rt = Math.Sqrt(Math.Pow(T_path[3 * j + 0] - Targets[3 * t], 2) + Math.Pow(T_path[3 * j + 1] - Targets[3 * t + 1], 2) + Math.Pow(T_path[3 * j + 2] - Targets[3 * t + 2], 2));
					        double Rr = Math.Sqrt(Math.Pow(R_path[3 * j + 0] - Targets[3 * t], 2) + Math.Pow(R_path[3 * j + 1] - Targets[3 * t + 1], 2) + Math.Pow(R_path[3 * j + 2] - Targets[3 * t + 2], 2));
					        double R_target = Rt + Rr;
					        double delta_T = (R_target - (R_center)) / c;

					        //double R_target=Targets_Rs[j*(*TargetNum)+t];
					        //double delta_T=(R_target-(*R_center))/C;

					        //if (Math.Abs(Tr[i]-delta_T)<(*tp)/2) {
					        //	data[j*RanNum+i].x=data[j*RanNum+i].x+sigma[t]*Math.Cospi(-2*Fc*R_target/C+Kr*Math.Pow(Tr[i]-delta_T,2));
					        //	data[j*RanNum+i].y=data[j*RanNum+i].y+sigma[t]*Math.Sinpi(-2*Fc*R_target/C+Kr*Math.Pow(Tr[i]-delta_T,2));
					        //}
					        double StepLen = Math.Abs(Tr[1] - Tr[0]);
					        if (Math.Abs(Tr[i] - delta_T) <= Math.Abs(StepLen)) {
						        double new_sigma = sigma[t] * (StepLen - Math.Abs(Tr[i] - delta_T)) / StepLen;
						        data[j*RanNum + i].real = data[j*RanNum + i].real + new_sigma*Math.Cos(-2.0*PI*Fc*R_target / c);
						        data[j*RanNum + i].imag = data[j*RanNum + i].imag + new_sigma*Math.Sin(-2.0*PI*Fc*R_target / c);
					        }
				        }
			        }
		        }
	        }
        }
예제 #12
0
        public static void fftshift(complex[] ran_ref, long len)
        {
	        double x, y;
	        for (int i = 0; i<len / 2; i++) {
		        x = ran_ref[i].real;
		        y = ran_ref[i].imag;
		        ran_ref[i].real = ran_ref[i + len / 2].real;
		        ran_ref[i].imag = ran_ref[i + len / 2].imag;
		        ran_ref[i + len / 2].real = x;
		        ran_ref[i + len / 2].imag = y;
	        }
        }
예제 #13
0
        public static void createRanRef(complex[] ran_ref, double[] Tr)
        {
	        for (int i = 0; i<RanNum; i++) {
		        if (Math.Abs(Tr[i])<Tp / 2) {
			        ran_ref[i].real = Math.Cos(PI*Kr*Tr[i] * Tr[i]);
			        ran_ref[i].imag = Math.Sin(PI*Kr*Tr[i] * Tr[i]);
		        }
		        else {
			        ran_ref[i].real = 0;
			        ran_ref[i].imag = 0;
		        }
	        }
        }
예제 #14
0
 //傅里叶逆变换
 public static void ifft(int N, complex[] f)
 {
   int i=0;
   conjugate_complex(N,f,f);
   fft(N,f);
   conjugate_complex(N,f,f);
   for(i=0;i<N;i++)
   {
     f[i].imag = (f[i].imag)/N;
     f[i].real = (f[i].real)/N;
   }
 }