Лазерный измеритель параметров дождевых капель, работающий в проходящем свете

Дипломная работа - Разное

Другие дипломы по предмету Разное

тся интенсивность дифрагированного пучка.

x

Рисунок 2.1. Зависимость дифракционной эффективности модулятора от угла падения света

 

Максимум интенсивности соответствует углу Брэгга, интенсивность дифрагированного пучка меняется по закону [2]:

; (2.12)

 

График выражения (2.5) приведен на рисунке (2.1). Из графика видно, что при изменении х интенсивность дифрагированного пучка падает.

 

3. Исследовательский раздел

 

Исследование проводилось по схеме приведенной на рисунке 1.1

 

3.1.1 Порядок обработки данных программой

-Читается бинарный файл по частям, размером SizeOfPart, заданном в файле настроек, по умолчанию- 100000 выборок. Размер одной выборки-16 байт

Вычисляется среднее арифметическое всей выборки, устраняется постоянная составляющая.

Выделяются импульсы, значения амплитуд которых превышает величину порога, заданного параметром Threshold

- Рассчитывается диаметр капель по квадрату величины импульса, умноженному на некоторый коэффициент, установленный при юстировке счетчика. Определение реального диаметра капель проводилось следующим образом. В шприц с иглами, разных диаметров набиралась вода и проводились измерения количества, упавших капель за 10 минут, с помощью разработанного счетчика. Вода собиралась в нормировочный стакан, с помощью, которого мерялся объем воды, исходя из чего, определялся средний диаметр капли.

- Частицы сортируются по размерам и подсчитывается их количество в определенных интервалах.

Формируется гистограмма.

 

3.1.2 Исходный текст программы

Ниже приведен исходный текст программы, показывающие принцип ее действия:

Обработка данных:

Обнуление переменных:

procedure tform1.Reseting;

begin

SetLength(ArrayOfData,SizeOfPart);

SetLength(AverageArray,AveCount);

PositionInFile:= 0;

CountOfParts:= FileSize(FileOfData) div SizeOfPart;

ScrollBar1.Position:= 0;;

Открытие файла:

procedure TForm1.OpenTheFile;: smallint;: integer;:= 0;.Enabled:= true;(FileOfData,OpenDialog1.FileName);:= true;(FileOfData);;:= SizeOfPart;(ArrayOfData,SizeOfPart);(AverageArray,SizeOfPart-5);:= FileSize(FileOfData) div SizeOfPart;.Max:= CountOfParts-1;(ArrayOfHists,CountOfParts);:= 0;i:= 0 to CountOfParts-1 do:= i;;;

end;.Title.Text.Text:= ExtractFileName(OpenDialog1.FileName);;TForm1.OpenTheHist;i: integer;: file of histogram;(FileOfHist,OpenDialog1.FileName);(FileOfHist);:= FileSize(FileOfHist);(ArrayOfHists,CountOfParts);i:= 0 to CountOfParts-1 do(FileOfHist,ArrayOfHists[i]);;

Чтение файла частями размером SizeOfPart:

procedure tform1.ReadingTheFile;i: integer;: smallint;i:= 0 to SizeOfPart-1 do(FileOfData,t);[i]:= t;i mod grf = 0 then;

end;

Averaging;

end;

Устранение постоянной составляющей сигнала:

procedure tform1.Averaging;

var i,j,t: integer;:= 0;i:= 0 to SizeOfPart-1 do t:= t+ ArrayOfData[i];:= t div SizeOfPart;i:= 0 to SizeOfPart-1 do if (ArrayOfData[i]- t) >= 0 then ArrayOfData[i]:= ArrayOfData[i]- t else ArrayOfData[i]:= 0;;

end;

Выделение импульсов, превышающих порог Threshold, подсчет их амплитуды:

procedure tform1.ImpCounter;i,t,im,IBegin,IEnd,maximum: integer;: boolean;:= 0;:= 0;i= threshold then:= true;;maximum< ArrayOfData[i] then:= ArrayOfData[i];(i);;:= i;imp then(CountOfImpulses);(ArrayOfImpulses[0],CountOfImpulses);(ArrayOfImpulses[1],CountOfImpulses);[0,CountOfImpulses-1]:= maximum;[1,CountOfImpulses-1]:= IEnd-IBegin;;:= 0;:= false;;;

Сортировка импульсов по амплитудам, создание массива гистограммы:

procedure tform1.CreatingOfHist;i,j,t1,t2,t1i,t2i,t: integer;

{t1:= ArrayOfImpulses[0,0];:= ArrayOfImpulses[1,0];i:= 0;i:= 0;}i:= 0 to CountOfImpulses-1 doi:= i;:= ArrayOfImpulses[0,i];j:= i+1 to CountOfImpulses-1 do if t1>ArrayOfImpulses[0,j] theni:= j;:= ArrayOfImpulses[0,j];;[0,t1i]:= ArrayOfImpulses[0,i];[0,i]:= t1;;

//edit2.text:= inttostr(CountOfImpulses);

//series6.Clear;

//Series6.AddXY(0,0);:= 0;:= 0;i< CountOfImpulses do(j);:= 0;( ArrayOfImpulses[0,i]< (HistInt*j)*(HistInt*j)+Threshold) and(i<CountOfImpulses) do(t);(i);;[PositionInFile].Hist[j+round(sqrt(Threshold))-1]:= t;

//Series6.AddXY((HistInt*j+sqrt(Threshold)){*10/8192},t);;

ConvertHist;

end;

Преобразование гистограммы, создание более широких интервалов:

procedure tform1.ConvertHist;i,j,k,m: integer;:= (round(100-sqrt(Threshold))-(round(100-sqrt(Threshold)) mod HistCount)) div HistCount ;.Clear;(TempHist,CountOfParts);k:= 0 to CountOfParts-1 do(TempHist[k],HistCount);k:= 0 to CountOfParts-1 doi:= 0 to HistCount-1 do[k,i]:= 0;j:= 0 to TempCount-1 do[k,i]:= TempHist[k,i]+ArrayOfHists[k].hist[round(sqrt(Threshold))+i*TempCount+j];;

//for i:= 0 to HistCount-1 do .AddXY(sqrt(Threshold)+i*TempCount*2,TempHist[ScrollBar1.Position,i]);;

Сохранение в формат Microsoft Excel- .xls:

procedure TForm1.ChartToXLS;i: integer;.Sheets[0].ClearCells;.Filename:= SaveDialog1.FileName+' graph.xls';.Sheets[0].AsString[0,0]:='hist_x';.Sheets[0].AsString[1,0]:='hist_y';.Sheets[0].AsString[2,0]:='<50_x';.Sheets[0].AsString[3,0]:='<50_y';.Sheets[0].AsString[4,0]:='<100_x';.Sheets[0].AsString[5,0]:='<100_y';.Sheets[0].AsString[6,0]:='<150_x';.Sheets[0].AsString[7,0]:='<150_y';.Sheets[0].AsString[8,0]:='<200_x';.Sheets[0].AsString[9,0]:='<200_y';i:= 1 to series1.Count -1 do.Sheets[0].AsFloat[0,i]:= Series1.XValue[i];.Sheets[0].AsFloat[1,i]:= Series1.YValue[i];;i:= 1 to series6.Count -1 do.Sheets[0].AsFloat[2,i]:= Series6.XValue[i];.Sheets[0].AsFloat[3,i]:= Series6.YValue[i];.Sheets[0].AsFloat[4,i]:= Series7.XValue[i];.Sheets[0].AsFloat[5,i]:= Series7.YValue[i];.Sheets[0].AsFloat[6,i]:= Series8.XValue[i];.Sheets[0].AsFloat[7,i]:= Series8.YValue[i];.Sheets[0].AsFloat[8,i]:= Series9.XValue[i];.Sheets[0].AsFloat[9,i]:= Series9.YValue[i];;.Write;;TForm1.XLSCreate;i,j,t: integer;;.Sheets[0].ClearCells;.Filename:= SaveDialog1.FileName+'.xls';.Sheets[0].AsString[0,0]:= 'd1';.Sheets[0].AsString[1,0]:= 'd1';.Sheets[0].AsString[2,0]:= 'd';

XLSTable.Sheets[0].AsString[3,0]:= 'N';

XLSTable.Sheets[0].AsString[4,0]:= 'N*d/(d1-d2)';

for i:= 0 to HistCount -1 do.Sheets[0].AsFloat[0,i+1]:= (sqrt(Threshold)+i*TempCount)*2;.Sheets[0].AsFloat[1,i+1]:= (sqrt(Threshold)+(i+1)*TempCount)*2;.Sheets[0].AsFloat[2,i+1]:= (sqrt(Threshold)+(i+0.5)*TempCount)*2 ;:= 0;j:= 0 to CountOfParts -1 do:= t+TempHist[j,i];.Sheets[0].AsFloat[3,i+1]:= t;.Sheets[0].AsFloat[4,i+1]:= t*0.5*(sqrt(Threshold)+(i+0.5)*TempCount)*2/TempCount;;

XLSTable.Write;

end;

Чтение настроек из ini- файла:

procedure TForm1.ReadIni;: TIniFile;: string[200];

GetDir(0, sPath); { }

sIniFile := TIniFile.Create(sPath + '\Config.INI');

//

form1.top := sIniFile.ReadInteger('Form1', 'form1.Top', form1.top);.left := sIniFile.ReadInteger('Form1', 'form1.left', form1.left);.Width:= sIniFile.ReadInteger('Form1','Form1.Width',Form1.Width);.Height:= sIniFile.ReadInteger('Form1','Form1.Height',Form1.Height);

//

Frequency:= SIniFile.ReadInteger('Data','frequency',100000);:= SIniFile.ReadInteger('Data','AveCount',10);:= SIniFile.ReadInteger('Data','Part',10000);:= SIniFile.ReadInteger('Data','SizeOfPart',100000);:= SIniFile.ReadInteger('Data','grf',5);:= SIniFile.ReadInteger('D