⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linereconst.c

📁 超声波成像算法
💻 C
字号:
/*                        LineReconst                                  */
/*      侾儔僀儞忋偺憸嵞惗傪FFT傪梡偄偰崅懍偵寁嶼                      */
#include <math.h>
#include "Reconst.h"
void LineReconst(AINF array,int n_time,int n_band,int i_delay,int i_shot,
	COMPLEX16 **wal_f,PVect p, int n_depth, double *depths, int ib,
	double *h, COMPLEX16 *rec, COMPLEX16 *s)
/*	堷悢丗
/*		AINF array	丗傾儗僀偵娭偡傞僨乕僞
/*		int n_time	丗帪娫僒儞僾儖悢
/*		int n_band	丗廃攇悢僒儞僾儖悢
/*		int i_delay	丗A/D曄姺偺抶傟帪娫乮僒儞僾儖悢乯
/*		COMPLEX16 wal_f[i][j]丗i斣栚偺憲怣攇宍偺戞j僼乕儕僄惉暘
/*		PVect p		丗埵抲儀僋僩儖
/*		int n_depth	丗墱峴偒偺暘妱悢乮嬤帡惛搙傛傝寛掕乯
/*		double depths[]丗墱峴暘妱椞堟偺嫬奅偲拞怱偺嫍棧
/*		int ib		丗
/*		double h[]	: 嶌嬈梡攝楍乮悺朄n_time*4乯
/*			僄僐乕攇宍偺僼乕儕僄惉暘偑寁嶼偝傟偰栠傞
/*		COMPLEX16 rec[j]丗i斣栚偺庴怣攇宍偺戞j僼乕儕僄惉暘偼
/*				rec[n_band*i+j]偱梌偊傜傟傞
/*		COMPLEX16 s[]丗暋慺悢偺嵞惗憸
/*		              s[ib+j]丗1儔僀儞偺j斣栚偺夋慺
/************************************************************/
{
	int		i, i_depth, i_freq,
			i_start, i_end, i_middle, i_bias,index, nsamp;
	double	*h1_real,*h1_imag,*h2_real,*h2_imag;
	double	Krx, Kry, Krz, drc, y0,z0, phase, buf1=0;
	double  L=0,Lmax=0,amp1=1,amp2=1,noise=0;
	int		tau_min, tau_max, tau_s_min, tau_s_max,n_bias;
	double tau, tau_bias, dtheta,cos_th,sin_th, low=10.0;
	double	R_min,R_max,R_start, R_end, R_middle;
	
	COMPLEX16 cx;
	dtheta    =	2*M_PI/(double)n_time;
	tau_bias=(double)(i_delay)/2.0;
	h1_real=h;
	h1_imag=h+  n_time;
	h2_real=h+2*n_time;
	h2_imag=h+3*n_time;
	nsamp=(int)(SPRATE*CYNUM*array.tnum);
	R_min=depths[0];/* 憸嵞惗椞堟偺嵟彫墱峴偒*/
	R_max=depths[2*n_depth];/* 憸嵞惗椞堟偺嵟戝墱峴偒*/
	tau_min=(int)(R_min*SPRATE*2.0);/* 憸嵞惗椞堟偱掕傑傞抶墑嵟彫抣*/
	tau_max=(int)(R_max*SPRATE*2.0);/* 憸嵞惗椞堟偱掕傑傞抶墑嵟戝抣*/
	tau_s_min=i_delay;             /*應掕僔僗僥儉偱掕傑傞抶墑嵟彫抣*/
	tau_s_max=i_delay+n_time-nsamp /*應掕僔僗僥儉偱掕傑傞抶墑嵟戝抣*/
	   -2*(int)(SPRATE*(array.radRc+array.radTr));									
	if(tau_min>tau_s_max || tau_max<tau_s_min) return;
	n_bias=4*n_time;
	//n_depth=8
		for(i_depth=0;i_depth<n_depth;i_depth++){
		R_start=depths[2*i_depth];
		R_middle=depths[2*i_depth+1];
		R_end=depths[2*i_depth+2];
		i_end=(int)(R_end*SPRATE*2.0)-tau_min;
		i_middle=(int)(R_middle*SPRATE*2.0)-tau_min;
		i_start=(int)(R_start*SPRATE*2.0)-tau_min;
		if((i_start<tau_s_max-tau_min)&&(i_end>tau_s_min-tau_min)){
			p.range=R_middle;
			p.x=R_middle*sin(p.theta);
			y0=R_middle*cos(p.theta);
			z0=R_middle*cos(p.theta);
			p.y=y0*sin(p.phai);
			p.z=z0*cos(p.phai);
			WaveFront0(array,n_time,n_band,i_delay,i_shot, wal_f, p,h);
			array.rxp=array.rx;
			array.ryp=array.ry;
            for(i=0;i<n_time;i++){
				h2_real[i]=0.0; 
				h2_imag[i]=0.0;
			}
			
			for ( i=0; i<array.rnum; i++ )
			//for ( i=0; i<0; i++ )
			{//庴怣巕偵娭偡傞儖乕僾
				i_bias=i*n_band;
				/* 儗僔乕僶偐傜僞乕僎僢僩傑偱偺曽岦儀僋僩儖傪寁嶼*/
				Krx = p.x - (*array.rxp);
				Kry = p.y - (*array.ryp);
				Krz = p.z;
				//儗僔乕僶偐傜僞乕僎僢僩傑偱偺嫍棧傪寁嶼
				drc = DIST( Krx, Kry, Krz);
				//僞乕僎僢僩乣儗僔乕僶傑偱
				//偺嫍棧傪僒儞僾儖悢偱寁嶼(僨傿儗僀傪寁嶼乯
				tau = dtheta*(drc*SPRATE - tau_bias);
				
				for(i_freq=0;i_freq<n_band;i_freq++){
				//  phase=dtheta*tau*(double)i_freq;
					phase=tau*(double)i_freq;
					phase=fmod(phase,2*M_PI);
					cx.real=rec[i_bias+i_freq].real;
					cx.imag=rec[i_bias+i_freq].imag;
					cos_th=cos(phase);
					sin_th=sin(phase);
				
					h2_real[i_freq] += (cx.real*cos_th-cx.imag*sin_th);
					h2_imag[i_freq] += (cx.real*sin_th+cx.imag*cos_th);
				}//i-freq loop
				array.rxp++;
				array.ryp++;
			}// i(receiver)loop
		
			 for(i_freq=0;i_freq<n_band;i_freq++){
				cx.real=h1_real[i_freq];
				cx.imag=h1_imag[i_freq];
				h1_real[i_freq]= h2_real[i_freq]*cx.real
								+h2_imag[i_freq]*cx.imag;
				h1_imag[i_freq]=-h2_real[i_freq]*cx.imag
								+h2_imag[i_freq]*cx.real;
			}
			for(i_freq=n_band;i_freq<n_time;i_freq++){
				h1_real[i_freq]= 0.0;
				h1_imag[i_freq]= 0.0;
			}
			
			FFT(n_time,h1_real,h1_imag,1.0);
			
			for(i=i_start;i<i_end;i++){
				index=(i-i_delay+n_bias)%n_time;
				s[ib+i].real+=h1_real[index];
				s[ib+i].imag+=h1_imag[index];
			}
		}//end if
	}//i_depth loop
	if(tau_min<tau_s_min){ 
		for(i=0;i<tau_s_min-tau_min;i++){
			s[ib+i].real=0.0;
			s[ib+i].imag=0.0;
		}
	}
	if(tau_max>tau_s_max){
		for(i=0;i<tau_max-tau_s_max;i++){
			s[ib+tau_max-tau_min-i].real=0.0;
			s[ib+tau_max-tau_min-i].imag=0.0;
		}
		
	}

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -