在此收錄將所得數據成像的程式。
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,&);
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,&,&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,&,&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,&);
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