• 沒有找到結果。

附錄 B:

在文檔中 THz成像技術之研究 (頁 100-118)

在此收錄將所得數據成像的程式。

Unit1.h

//---

#ifndef Unit1H

#define Unit1H

//---

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Dialogs.hpp>

#include <ExtCtrls.hpp>

#include <Menus.hpp>

//--- class TMainForm : public TForm

{

__published: // IDE-managed Components TMainMenu *MainMenu1;

TMenuItem *FILE1;

TMenuItem *LoadTimeDomainData1;

TMenuItem *LoadFrequencyDomainData1;

TMenuItem *SaveImage1;

TMenuItem *FourierTransform1;

TMenuItem *FOURIERTRANSFORM2;

TMenuItem *N1;

TMenuItem *Setup1;

TMenuItem *MImage1;

TMenuItem *Mimage2;

TMenuItem *FrequencyDomain1;

TMenuItem *FrequencyDomainphase1;

TMenuItem *N2;

void __fastcall LoadTimeDomainData1Click(TObject *Sender);

void __fastcall SaveImage1Click(TObject *Sender);

void __fastcall Mimage2Click(TObject *Sender);

void __fastcall FOURIERTRANSFORM2Click(TObject *Sender);

void __fastcall TimeDomain1Click(TObject *Sender);

void __fastcall FrequencyDomain1Click(TObject *Sender);

void __fastcall FrequencyDomainphase1Click(TObject *Sender);

void __fastcall ExportIntensityPIC1Click(TObject *Sender);

void __fastcall Setup1Click(TObject *Sender);

void __fastcall LoadFrequencyDomainData1Click(TObject *Sender);

void __fastcall N2Click(TObject *Sender);

private: // User declarations public:

AnsiString FourierBaseDirectory; //傅氏轉換後數據存放路徑 AnsiString ImageBaseDirectory; //時域成像存放路徑

AnsiString FourierImageABaseDirectory; //頻域振幅成像存放路徑 AnsiString FourierImagePBaseDirectory; //頻域相位成像存放路徑 float deltaT; //每點差多少時間延遲

int TDpoints; //每個 waveform 有多少點

float TDMAX; //TD:時域 FD:頻域

float TDMIN; // MAX:最大值 MIN:最小值 float FDAMAX; //A:amplitude P:phase float FDAMIN;

float FDPMAX;

float FDPMIN;

float FDSfreq; //頻域傅氏轉換起始頻率 float FDEfreq; //頻域傅氏轉換截止頻率 float FDdf;

TComponent *AOwner;

// User declarations

__fastcall TMainForm(TComponent* Owner);

protected:

FT(char *inPath,char *outPath,double dt,double SF,double EF,double df);

IntensityPic(Double Max, Double Min);

};

//--- extern PACKAGE TMainForm *MainForm;

//---

#endif

Unit1.cpp

//---

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

#include "Unit2.h"

//---

#pragma package(smart_init)

#pragma resource "*.dfm"

#include<math.h>

#include<complex.h>

TMainForm *MainForm;

//--- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner)

{ FDSfreq=-2;

FDEfreq=4;

FDdf=0.05;

}

//---

void __fastcall TMainForm::LoadTimeDomainData1Click(TObject *Sender)//載入時域數據的資訊檔 { FILE *inf_file;

if(OpenDialog1->Execute())

{ InfoFile=OpenDialog1->FileName;

BaseDirectory=InfoFile.SubString(1,InfoFile.LastDelimiter("\\"));

Label1->Caption=InfoFile.SubString(1,InfoFile.LastDelimiter("\\"));

inf_file=fopen(InfoFile.c_str(),"r");

fscanf(inf_file,"%d %d %d %d %f %d %f %f",&Xpoints,&Ypoints,

&Xres,&Yres,&deltaT,&TDpoints,&TDMAX,&TDMIN);

fclose(inf_file);

TDMAX*=1.2;

TDMIN*=1.2;

FourierTransform1->Enabled=true; //開啟傅式轉換功能 TimeDomainImages1->Enabled=true; //開啟時域數據相關功能 FrequencyDomainImages1->Enabled=false; //關閉頻域相關功能

};

}

//--- void __fastcall TMainForm::SaveImage1Click(TObject *Sender) { AnsiString temp;

if(SaveDialog1->Execute())

{ temp=SaveDialog1->FileName + ".bmp" ; Image3->Picture->SaveToFile(temp);

Label2->Caption=temp;

};

}

//---

void __fastcall TMainForm::Mimage2Click(TObject *Sender)//固定時間延遲成像用 { int a,b;

int x,y;

float T;

FILE *in;

Image1->Width=120;

Image1->Height=70;

in=fopen("E:\\THz Imaging\\0716\\LEO.txt","r");

for(a=0;a<=2800;a++)

{ fscanf(in,"%d %d %f",&x,&y,&T);

Image1->Canvas->Pixels[x][y]=(TColor)(0x010101)*(int)((256*(T-(-0.5)*0.000001)/(15*0.000001)));

};

Image1->Picture->SaveToFile("E:\\THz Imaging\\0716\\LEO.bmp");

fclose(in);

}

//---

TMainForm::FT(char *inPath,char *outPath,double dt,double SF,double EF, double df) //fourier transform 函式

{ double *amp;

double *t;

FILE *infile;

FILE *outfile;

int points,BasePhase=0;

double a,b,c,d,temp;

// double dt;

double freq;

complex<double> re,mor,lre;

float e,f;

double FDA,FDP;

amp=new double[TDpoints+5];

t=new double[TDpoints+5];

infile=fopen(inPath,"r");

for(points=0;(!feof(infile))&&points<TDpoints;points++) { //c=e;

fscanf(infile,"%f %f",&e,&f);

amp[points]=f;

t[points]=e;

// if(points==3) // dt=e-c;

};

fclose(infile);

points--;

for(a=0;a<points;a++) amp[(int)a]*=dt;

outfile=fopen(outPath,"w");

for(freq=SF;freq<=EF;freq+=df) { for(a=0,re=0;a<TDpoints;a++)

{ mor=complex<double>(0,-1)*freq*t[(int)a]*6.2831;

re+=amp[(int)a]*exp(mor);

};

if((arg(re)-arg(lre))>4.5) BasePhase=BasePhase-1;

if((arg(re)-arg(lre))<(-4.5)) BasePhase=BasePhase+1;

FDA=sqrt(norm(re));

FDP=arg(re)+BasePhase*6.2831;

fprintf(outfile,"%E %E %E\n",freq,FDA,FDP);

lre=re;

if(FDA>FDAMAX) FDAMAX=FDA;

if(FDA<FDAMIN) FDAMIN=FDA;

if(FDP>FDPMAX) FDPMAX=FDP;

if(FDP<FDPMIN) FDPMIN=FDP;

};

fclose(outfile);

delete amp;

delete t;

}

void __fastcall TMainForm::FOURIERTRANSFORM2Click(TObject *Sender) //傅式轉換前置、後置作業

{ FILE *in,*FDinfo;

int a,b;

char infile[512],outfile[512];

in=fopen(InfoFile.c_str(),"r");

fscanf(in,"%d %d %d %d ",&Xpoints,&Ypoints,&Xres,&Yres);

fclose(in);

FourierBaseDirectory=BaseDirectory+"Fourier Spectrum";

CreateDir(FourierBaseDirectory);

FDAMAX=0;

FDAMIN=0;

FDPMAX=0;

FDPMIN=0;

for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

{ sprintf(infile,"%s%d %d.txt",BaseDirectory.c_str(),a,b);

sprintf(outfile,"%s\\%d %d.txt",FourierBaseDirectory.c_str(),a,b);

FT(infile,outfile,deltaT,FDSfreq,FDEfreq,FDdf);

};

sprintf(outfile,"%s\\Fourier.fif",FourierBaseDirectory.c_str());

FDinfo=fopen(outfile,"w");

fprintf(FDinfo,"%f %f %f\n",FDSfreq,FDEfreq,FDdf);

fprintf(FDinfo,"%d %d\n",Xpoints,Ypoints);

fprintf(FDinfo,"%f %f %f %f",FDAMAX,FDAMIN,FDPMAX,FDPMIN);

fclose(FDinfo);

}

//---

void __fastcall TMainForm::TimeDomain1Click(TObject *Sender)//時域成像舊版,廢棄 { int a,b,n,m;

char intxt[128],outbmp[128];

FILE *in;

float t,amp;

AnsiString temp;

Image1->Width=Xpoints;

Image1->Height=Ypoints;

ImageBaseDirectory=BaseDirectory+"Image";

CreateDir(ImageBaseDirectory);

IntensityPic(TDMAX,TDMIN) ;

temp=ImageBaseDirectory+"\\"+"TDIntensity.bmp";

Image3->Picture->SaveToFile(temp);

for(n=0;n<TDpoints;n++) { for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

{ sprintf(intxt,"%s%d %d.txt",BaseDirectory.c_str(),a,b);

in=fopen(intxt,"r");

for(m=0;m<=n;m++) fscanf(in,"%f %f",&t,&amp);

fclose(in);

Image1->Canvas->Pixels[a][b]=(TColor)0x010101*(int)(256*(amp-TDMIN)/(TDMAX-TDMIN));

};

temp=ImageBaseDirectory+"\\"+n+".bmp";

Image1->Picture->SaveToFile(temp);

};

}

//---

void __fastcall TMainForm::FrequencyDomain1Click(TObject *Sender)//頻域振幅成像 { int a,b,n,m;

char intxt[512],outbmp[512];

FILE *in;

float F,amp,phase;

AnsiString temp;

long ***picData;

TImage *outputs;

AOwner = Image1->Owner;

picData=new long**[(int)(FDEfreq-FDSfreq)/FDdf+1]; //製作三維陣列 for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++)

picData[n]=new long*[Xpoints];

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) for(a=0;a<Xpoints;a++)

picData[n][a]=new long[Ypoints];

FourierBaseDirectory=BaseDirectory+"Fourier Spectrum";

FourierImageABaseDirectory=BaseDirectory+"FourierAmpImage";

CreateDir(FourierImageABaseDirectory);

IntensityPic(FDAMAX,FDAMIN) ;

temp=FourierImageABaseDirectory+"\\"+"FDAIntensity.bmp";

Image3->Picture->SaveToFile(temp);

for(a=0;a<Xpoints;a++) //讀入各像素數據並儲存 for(b=0;b<Ypoints;b++)

{ sprintf(intxt,"%s\\%d %d.txt",FourierBaseDirectory.c_str(),a,b);

in=fopen(intxt,"r");

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++)

{ fscanf(in,"%f %f %f",&F,&amp,&phase);

picData[n][a][b]=0x010101*(int)(256*(amp-FDAMIN)/(FDAMAX-FDAMIN));

};

fclose(in);

};

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) //作圖 { outputs = new TImage(AOwner);

outputs->Width=Xpoints;

outputs->Height=Ypoints;

for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

outputs->Canvas->Pixels[a][b]=(TColor)picData[n][a][b];

temp=FourierImageABaseDirectory+"\\"+n+".bmp";

outputs->Picture->SaveToFile(temp);

delete outputs;

};

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) for(a=0;a<Xpoints;a++)

delete picData[n][a];

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) delete picData[n];

delete picData;

}

//---

void __fastcall TMainForm::FrequencyDomainphase1Click(TObject *Sender)//頻域相位成像 { int a,b,n,m;

char intxt[512],outbmp[512];

FILE *in;

float F,amp,phase;

AnsiString temp;

long ***picData;

TImage *outputs;

AOwner = Image1->Owner;

picData=new long**[(int)(FDEfreq-FDSfreq)/FDdf+1];

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) picData[n]=new long*[Xpoints];

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) for(a=0;a<Xpoints;a++)

picData[n][a]=new long[Ypoints];

FourierBaseDirectory=BaseDirectory+"Fourier Spectrum";

FourierImagePBaseDirectory=BaseDirectory+"FourierPhaseImage";

CreateDir(FourierImagePBaseDirectory);

IntensityPic(FDPMAX,FDPMIN) ;

temp=FourierImagePBaseDirectory+"\\"+"FDPIntensity.bmp";

Image3->Picture->SaveToFile(temp);

for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

{ sprintf(intxt,"%s\\%d %d.txt",FourierBaseDirectory.c_str(),a,b);

in=fopen(intxt,"r");

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) { fscanf(in,"%f %f %f",&F,&amp,&phase);

picData[n][a][b]=0x010101*(int)(256*(phase-FDPMIN)/(FDPMAX-FDPMIN));

};

fclose(in);

};

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) { outputs = new TImage(AOwner);

outputs->Width=Xpoints;

outputs->Height=Ypoints;

for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

outputs->Canvas->Pixels[a][b]=(TColor)picData[n][a][b];

temp=FourierImagePBaseDirectory+"\\"+n+".bmp";

outputs->Picture->SaveToFile(temp);

delete outputs;

};

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) for(a=0;a<Xpoints;a++)

delete picData[n][a];

for(n=0;n<=(FDEfreq-FDSfreq)/FDdf;n++) delete picData[n];

delete picData;

}

//---

void __fastcall TMainForm::ExportIntensityPIC1Click(TObject *Sender) { double Max,Min;

IntensityPic(4,-30) ; }

//---

TMainForm::IntensityPic(Double Max, Double Min) { int a,b;

// double Max,Min;

AnsiString out;

char temp[20];

for(a=8;a<32;a++) for(b=8;b<268;b++)

Image3->Canvas->Pixels[a][b]=0xFF0000;

for(a=10;a<30;a++) for(b=10;b<266;b++)

Image3->Canvas->Pixels[a][b]=0x010101*(265-b);

Image3->Canvas->Font->Size=6;

Image3->Canvas->Font->Color=0x000080;

for(a=0;a<=8;a++)

{ Image3->Canvas->TextOut(35,262-32*a,out.FloatToStrF(Min+(Max-Min)*a /8,0,6,3));

};

}

void __fastcall TMainForm::Setup1Click(TObject *Sender) { Form1->Visible=true;

Form1->Enabled=true;

}

//---

void __fastcall TMainForm::LoadFrequencyDomainData1Click(TObject *Sender) //載入頻域數據資料檔

{ FILE *inf_file;

if(OpenDialog2->Execute())

{ InfoFile=OpenDialog2->FileName;

BaseDirectory=InfoFile.SubString(1,InfoFile.LastDelimiter("\\"))+"..\\";

Label1->Caption=BaseDirectory;

inf_file=fopen(InfoFile.c_str(),"r");

fscanf(inf_file,"%f %f %f %d %d %f %f %f

%f",&FDSfreq,&FDEfreq,&FDdf,&Xpoints,&Ypoints,&FDAMAX,&FDAMIN,&FDPMAX,&FDPM IN);

fclose(inf_file);

FDAMAX*=1.05;

// FDAMIN*=1.05;

// FDPMAX*=1.05;

// FDPMIN*=1.05;

FourierTransform1->Enabled=false; //關閉傅式轉換功能 TimeDomainImages1->Enabled=false; //關閉時域相關功能 FrequencyDomainImages1->Enabled=true; //開啟頻域相關功能

};

}

//--- void __fastcall TMainForm::N2Click(TObject *Sender)//時域成像

{ int a,b,n,m;

char intxt[128],outbmp[128];

FILE *in;

float t,amp;

AnsiString temp;

long ***picData;

TImage *outputs;

AOwner = Image1->Owner;

picData=new long**[TDpoints];

for(n=0;n<TDpoints;n++) picData[n]=new long*[Xpoints];

for(n=0;n<TDpoints;n++) for(a=0;a<Xpoints;a++)

picData[n][a]=new long[Ypoints];

ImageBaseDirectory=BaseDirectory+"Image";

CreateDir(ImageBaseDirectory);

IntensityPic(TDMAX,TDMIN) ;

temp=ImageBaseDirectory+"\\"+"TDIntensity.bmp";

Image3->Picture->SaveToFile(temp);

for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

{ sprintf(intxt,"%s%d %d.txt",BaseDirectory.c_str(),a,b);

in=fopen(intxt,"r");

for(n=0;n<TDpoints;n++) { fscanf(in,"%f %f",&t,&amp);

picData[n][a][b]=0x010101*(long)(256*(amp-TDMIN)/(TDMAX-TDMIN));

};

fclose(in);

};

for(n=0;n<TDpoints;n++)

{ outputs = new TImage(AOwner);

outputs->Width=Xpoints;

outputs->Height=Ypoints;

for(a=0;a<Xpoints;a++) for(b=0;b<Ypoints;b++)

outputs->Canvas->Pixels[a][b]=(TColor)picData[n][a][b];

temp=ImageBaseDirectory+"\\"+n+".bmp";

outputs->Picture->SaveToFile(temp);

delete outputs;

};

for(n=0;n<TDpoints;n++) for(a=0;a<Xpoints;a++) delete picData[n][a];

for(n=0;n<TDpoints;n++) delete picData[n];

delete picData;

}

//---

Unit2.h

//---

#ifndef Unit2H

#define Unit2H

//---

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

//--- class TForm1 : public TForm

{

__published: // IDE-managed Components TLabel *Label1;

TEdit *Edit1;

TLabel *Label2;

TEdit *Edit2;

TLabel *Label3;

TEdit *Edit3;

TButton *Button1;

TButton *Button2;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall FormShow(TObject *Sender);

private: // User declarations public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//--- extern PACKAGE TForm1 *Form1;

//---

#endif

Unit2.cpp

//---

#include <vcl.h>

#pragma hdrstop

#include "Unit2.h"

#include "Unit1.h"

//---

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//--- __fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{ Edit1->Text=MainForm->FDSfreq;

Edit2->Text=MainForm->FDEfreq;

Edit3->Text=MainForm->FDdf;

}

//---

void __fastcall TForm1::Button1Click(TObject *Sender) //設定傅式轉換參數 { MainForm->FDSfreq=Edit1->Text.ToDouble();

MainForm->FDEfreq=Edit2->Text.ToDouble();

MainForm->FDdf=Edit3->Text.ToDouble();

Form1->Enabled=false;

Form1->Visible=false;

}

//--- void __fastcall TForm1::Button2Click(TObject *Sender) { Form1->Enabled=false;

Form1->Visible=false;

}

//--- void __fastcall TForm1::FormShow(TObject *Sender)

{ Edit1->Text=MainForm->FDSfreq;

Edit2->Text=MainForm->FDEfreq;

Edit3->Text=MainForm->FDdf;

}

//---

參考文獻:

[1] 王炯翰 “液晶次毫米波段光學特性之研究(I)”,交通大學光電所碩 士論文,2002

[2] Daniel M. Mittleman, Rune H. Jacobsen, and Martin C. Nuss, “T-Ray Imaging”, JOURNAL OF SELECTED TOPICS IN QUANTUM

ELECTRONICS, VOL. 2, NO. 3, SEPTEMBER 1996

[3] 游博文 “THz 輻射偵測用砷離子佈植砷化鎵偶極天線之研製”,交 通大學光電所碩士論文,2002

[4] 洪勝富,齊正中,”短脈衝雷射激發兆赫輻射技術及其研究”,物 理雙月刊二三卷,pp.322-328,2001

[5] H.BB,NUSS MC “Imaging with terahertz waves”,Opt. Letter.,vol.20, No. 16, pp. 1716,1995

[6] P.H. Bolivar, M Brucherseifer, M, Nagel,H Kurz, A Bosserhoff, R Buttner, “Label-free probing of the binding state of DNA by time-domain terahertz sensing” Ultra. Pheno. Semi 2001,vol.384, pp.253-258,2002

[7] X.C.Zhang, B.B. Hu, and D.H. Auston, “Generation of femtosecond electromagnetic pulses from semiconductor surface”, Appl. Phys.

Lett. Vol.56 , No. 11,pp.1011-1013,1990

[8] S.L. Chuang, S. Schmitt, “Optical rectification at semiconductor surfaces”, Phys. Rev. Lett. ,vol.68, pp.102-105 , 1992

[9] Q. Chen, Zhiping Jiang, G. X. Xu, X.-C. Zhang,” Near-field terahertz imaging with a dynamic aperture”, OPTICS LETTERS , Vol. 25, No.

15 ,pp. 1122-1124, 2000

[10] D.C. Edelstein, R.B. Romney, and M. Scheuermann, “Rapid programmable 300 ps optical delay scanner and signal-averaging system for ultrafast measurements”,Rev. Sci. Instrum. 62(3),1991 [11] M.J. Feldstein, P. Vöhringer, N. F.Scherer , ”Rapid-scan pump-probe

spectroscopy with high time and wave-number resolution:

optical-Kerr-effect measurements of neat liquids ”, J. Opt. Soc. Am.

B , vol. 12,No. 8,1995

[12] John M. Khosrofian and Bruce A. Garetz , “Measurement of a Gaussian laser beam diameter through the direct inversion of knife-edge data”, applied optics, vol.22,No.21,pp.3406,1983 [13] Lionel Duvillaret, Stéphane Rialland, and Jean-Louis

Coutaz, ”Electro-optic sensors for electric field measurement. II.

Choice of the crystals and complete optimization of their orientation ”, J. Opt. Soc. Am. B,vol. 19,No 11,2002

[14] N.C.J. van der Valk, and P.C.M. Planken, “Electro-Optic detection of subwavelength terahertz spot sizes in the near field of a metal tip”, Appl. Phys. Lett., Vol. 81, No. 9, pp. 1558, 2002

[15] Karsten J. Siebert, Holger Quast, Rainer Leonhardt, Torsten Löffler, Mark Thomson, Tobias Bauer, and Hartmut G. Roskos,

“Continuous-wave all-optoelectronic terahertz imaging”, Appl. Phys.

Lett., Vol.80, No. 16, pp.3003,2002

[16] John O'Hara, and D. Grischkowsky,”Synthetic phased-array terahertz imaging”,opt. Lett., Vol. 27, No. 12, pp. 1070, 2002

[17] Ajay Nahata, James T. Yardley, Tony F. Heinz, “Two-dimensional imaging of continuous-wave terahertz radiation using electro-optic detection”, Appl. Phys. Lett., Vol. 81, No. 6, pp. 963,2002

[18] K. McClatchey, M.T. Reiten, and R.A. Cheville,”Time resolved synthetic aperture terahertz impulse imaging”,Appl. Phys. Lett., Vol.

79, No. 27, pp. 4485, 2001

在文檔中 THz成像技術之研究 (頁 100-118)

相關文件