Институт ИРЭ
Кафедра ФОРС
Научный
руководитель к.т.н. доцент Лишак М.Ю.
уч. степень должность подпись фамилия и инициалы
Консультант
уч. степень должность подпись фамилия и инициалы
Дата
Москва, 2020
МИНОБРНАУКИ РОССИИ
федеральное государственное бюджетное образовательное
учреждение высшего образования
«Национальный исследовательский университет «МЭИ»
Институт ИРЭ
Кафедра ФОРС
ЗАДАНИЕ
НА ВЫПУСКНУЮ КВАЛИФИКАЦИОННУЮ РАБОТУ
(бакалаврскую работу)
Научный
руководитель к.т.н. доцент Лишак М.Ю.
уч. степень должность подпись фамилия и инициалы
Консультант
уч. степень должность подпись фамилия и инициалы
2
СОДЕРЖАНИЕ РАЗДЕЛОВ ЗАДАНИЯ И ИСХОДНЫЕ ДАННЫЕ
Количество листов 5
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА
Примечания:
1. Задание брошюруется вместе с выпускной работой после титульного листа (страницы задания
имеют номера 2, 3).
2. Отзыв руководителя, рецензия(и), акт проверки на объем заимствований и согласие студента на
размещение работы в открытом доступе вкладываются в конверт (файловую папку) под
обложкой работы.
3
Содержание
Аннотация..................................................................................................................................5
ВВЕДЕНИЕ ..................................................................................................................................6
1. ФОРМИРОВАНИЕ И ОБРАБОТКА КВАЗИНЕПРЕРЫВНОГО РАДИОЛОКАЦИОННОГО
СИГНАЛА ....................................................................................................................................7
1.1. Квазинепрерывный сигнал ......................................................................................... 7
1.2. Определения дальности цели по параметрам отраженного радиосигнала ......... 10
1.3. Измерение дальности ............................................................................................... 11
1.4. Максимальная однозначно измеряемая дальность ............................................... 12
2. АЛГОРИТМ НАЗНАЧЕНИЯ ПАРАМЕТРОВ КВАЗИНЕПРЕРЫВНОГО СИГНАЛА ПРИ
СОПРОВОЖДЕНИИ ЦЕЛИ С РЕЗУЛЬТАТАМИ РАСЧЁТА В MATHCAD ....................................... 15
2.1. Расчет параметров сигнала при сопровождении одной цели. ............................... 15
2.2. Расчет параметров сигнала при сопровождении двух целей. ................................ 24
3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ АЛГОРИТМА НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ С++ .... 29
ЗАКЛЮЧЕНИЕ ........................................................................................................................... 37
ЛИТЕРАТУРА ............................................................................................................................ 38
ПРИЛОЖЕНИЕ .......................................................................................................................... 39
4
Аннотация
5
ВВЕДЕНИЕ
6
1. ФОРМИРОВАНИЕ И ОБРАБОТКА КВАЗИНЕПРЕРЫВНОГО
РАДИОЛОКАЦИОННОГО СИГНАЛА
7
Измерение дальности радиолокатором становится возможным благодаря
некоторым свойствам распространения радиоволн.
8
начальными фазами. Когерентные пачки прямоугольных радиоимпульсов,
длительность которых много больше времени запаздывания сигнала, а период
повторения импульсов в пачке много меньше этого времени, - принято называть
квазинепрерывным сигналом.1
Q – скважность импульса;
𝜏
Q=
𝑇
𝜏 − длительность импульса
Т − период импульсов
1
Многофункциональные радиолокационные системы: учеб. Пособие для
вузов/ Дудник П.И., Ильчук А.Р., Татарский Б.Г. – М.: Дрофа, 2007.
9
Частотными параметрами является:
2
Трухачев А.А. Радиолокационные сигналы и их применения: – М.:
Воениздат, 2005.
10
Рисунок 1.2 – Временное положение отраженных от целей сигналов для
одиночного радиоимпульса
𝑐∗𝑡
𝑅=
2
с – скорость света 3
3
Многофункциональные радиолокационные системы: учеб. Пособие для
вузов/ Дудник П.И., Ильчук А.Р., Татарский Б.Г. – М.: Дрофа, 2007.
12
соответственно, дальности до цели. В подобных ситуациях говорят о
неоднозначности измерения дальности цели. Пример представлен на Рис.1.3.
13
t < T – эхо-сигнал поступает до момента излучения следующего
зондирующего импульса;
𝑡зад
𝑡н.д = 𝑡зад − [ ]Т
Тповт повт
𝑡зад
[ ] − вычисление целой части дроби. Это целое число показывает, сколько
Тповт
14
2. АЛГОРИТМ НАЗНАЧЕНИЯ ПАРАМЕТРОВ
КВАЗИНЕПРЕРЫВНОГО СИГНАЛА ПРИ СОПРОВОЖДЕНИИ
ЦЕЛИ С РЕЗУЛЬТАТАМИ РАСЧЁТА В MATHCAD
𝑅(𝑡𝑐 ) = 𝑅0 − 𝑉 ∗ 𝑡𝑐
15
С помощью формулы найдем количество отсчетов времени:
16
Используя формулу
2∗𝑅
𝑡зад =
𝑐
𝑡зад
𝑡н.д = 𝑡зад − [ ]Т
Тповт повт
𝑡зад
𝑁=[ ] − вычисление целой части дроби, определяет количество периодов,
Тповт
18
Алгоритм вычисления tн.д.:
19
б) на периферийные (нерабочие) участки [0, 0.45T] или [0.55T, T].
20
времени происходи при переборе всех заданных частот начиная с
начальной частоты.
21
График зависимости заданной частоты повторения сигнала
удовлетворяющие заданному условию от расстояния до цели.
22
Рис.2.3 Фрагмент графика зависимости частоты повторения от расстояния до
цели.
23
2.2. Расчет параметров сигнала при сопровождении двух целей.
Зададим начало и конец отсчета времени такие же, как и у первой цели:
24
Далее посчитаем время неопределенной дальности в начальный момент времени
у первой и второй цели.
В этом случае задаются также частоты одинаковые для первой и второй цели, в
диапазоне от 40 кГц до 200 кГц.
25
Рис.2.4 График зависимости двух значений времени неопределенной дальности у
первой и второй цели от расстояния.
Для того чтобы это не происходило, добавим еще одно условие. Время
неопределенной дальности второй цели не должно превышать разность времени
неопределенной дальности первой цели и 1.5Тимп и не должно быть меньше чем
сумма времени неопределенной дальности первой цели и 1.5Тимп., где Тимп –
это длительность импульса, которая вычисляется по формуле:
Тимп = Тповт/𝑄
26
𝑡н.д 2 > 𝑡н.д1 + Тимп
27
График представлен на рис.2.5
28
3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ АЛГОРИТМА НА ЯЗЫКЕ
ПРОГРАММИРОВАНИЯ С++
29
Запоминаем исходные данные:
void TForm1::GetInData(void )
{
30
количество заданных частот:
inData.FT = floor((inData.f1-inData.f0)/inData.fs);
Для цели 1:
for(i = 0; i < inData.NT; i++)
{
31
tpovt = 1.0/inData.fpovt[i];
deltaR = C*tpovt/2.0;
dR = x-floor(x/deltaR)*deltaR;
dt = 2.0*dR/C;
if((0.45*tpovt < dt) && (dt < 0.55*tpovt))
return inData.fpovt[i];
i++;
}
return 0;
}
// Очищаем таблицу
for(i = 0; i < (long int)TablRes->RowCount-1; i++)
TablRes->Rows[i]->Clear();
TablRes->ColCount = 5;
TablRes->RowCount = 2;
// Создаем "шапку" таблицы
for(i = 0; i < 5; i++)
TablRes->Cells[i][0] = buf[i];
// Выводим результаты в таблицу
for(i = 0; i < inData.NT; i++)
{
TablRes->Cells[1][TablRes->RowCount-1] = TablRes->RowCount-2; //
Порядковый номер
sprintf(buf1,"%.1f",outData.d[i]/1000.0);
TablRes->Cells[2][TablRes->RowCount-1] = buf1;
sprintf(buf1,"%.1f",outData.fd[i]/1000.0);
TablRes->Cells[3][TablRes->RowCount-1] = buf1;
sprintf(buf1,"%.2f",outData.tnd1[i]*1000000.0);
TablRes->Cells[4][TablRes->RowCount-1] = buf1;
TablRes->RowCount++;
}
}
// Очищаем таблицу
for(i = 0; i < (long int)TablRes1->RowCount-1; i++)
33
TablRes1->Rows[i]->Clear();
TablRes1->ColCount = 3;
TablRes1->RowCount = 2;
// Создаем "шапку" таблицы
for(i = 0; i < 3; i++)
TablRes1->Cells[i][0] = buf[i];
// Выводим результаты в таблицу
for(i = 0; i < inData.NT; i++)
{
TablRes1->Cells[1][TablRes1->RowCount-1] = TablRes1->RowCount-2;
// Порядковый номер
sprintf(buf1,"%.2f",outData.tnd2[i]*1000000.0);
TablRes1->Cells[2][TablRes1->RowCount-1] = buf1;
TablRes1->RowCount++;
}
}
4
Шилдт Г. С++ для начинающих. – М.: ЭКОМ Паблишерс, 2013.
34
Рис.3.1 Основное окно программы.
36
ЗАКЛЮЧЕНИЕ
37
ЛИТЕРАТУРА
38
ПРИЛОЖЕНИЕ
Приложение А.
Полный листинг проекта а среде MathCAD.
39
40
41
42
43
Приложение Б.
Листинги программ модели.
//--------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
#include <math.h>
#include "stdio.h"
#include "Graf1.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------
//====== РАССЧИТАТЬ ======
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
GetInData();
CalcData();
PrintData();
PrintData2();
PrintGraf_1();
return;
}
//--------------------------------------------------------------------
void TForm1::GetInData(void )
44
{
inData.r0 = Form1->Edit1->Text.ToDouble();
inData.v = Form1->Edit2->Text.ToDouble();
inData.t0 = Form1->Edit3->Text.ToDouble();
inData.t1 = Form1->Edit4->Text.ToDouble();
inData.ts = Form1->Edit5->Text.ToDouble();
inData.f0 = Form1->Edit6->Text.ToDouble();
inData.f1 = Form1->Edit7->Text.ToDouble();
inData.fs = Form1->Edit8->Text.ToDouble();
}
//--------------------------------------------------------------------
void TForm1::CalcData(void )
{
long int i,j,k = 0;
double ti = inData.t0;
double tzi;
double fj;
double tp;
double kj;
double dd;
bool flag;
double rd;
double r01;
double timp;
inData.NT = floor((inData.t1-inData.t0)/inData.ts);
inData.FT = floor((inData.f1-inData.f0)/inData.fs);
inData.fpovt = new double[inData.FT];
outData.d = new double[inData.NT];
outData.d2 = new double[inData.NT];
outData.fd = new double[inData.NT];
outData.fd2 = new double[inData.NT];
outData.tnd1 = new double[inData.NT];
45
outData.tnd2 = new double[inData.NT];
outData.tnd21 = new double[inData.NT];
for(i = 0; i < inData.FT; i++)
inData.fpovt[i] = inData.f0+inData.fs*(double)i;
// Для цели 1
for(i = 0; i < inData.NT; i++)
{
outData.d[i] = inData.r0-inData.v*(double)i*inData.ts;
outData.fd[i] = FuncFP(outData.d[i]);
outData.tnd1[i] = 2.0*(outData.d[i]-
floor(outData.d[i]*2.0*outData.fd[i]/C)*(C/(2.0*outData.fd[i])))/C;
}
rd = C/FuncFP(outData.d[0])/2.0;
for(i = 0; i < inData.NT; i++)
{
outData.d2[i] = inData.r0+rd-inData.v*(double)i*inData.ts;
outData.fd2[i] = FuncFP(outData.d2[i]);
outData.tnd2[i] = 2.0*(outData.d[i]-
floor(outData.d[i]*2.0*outData.fd2[i]/C)*(C/(2.0*outData.fd2[i])))/C;
}
for(i = 0; i < inData.NT; i++)
{
outData.tnd21[i] =
FuncFP1(outData.d2[i],outData.d[i],outData.tnd1[i]);
}
/* for(i = 0; i < inData.NT; i++)
{
outData.d[i] = inData.r0-inData.v*ti;
tzi = 2.0*outData.d[i]/C;
fj = inData.f0;
flag = true;
for(j = 0; (j < inData.FT) && (flag == true); j++)
46
{
tp = 1.0/fj;
kj = tzi-floor(tzi/tp)*tp; // Время неопределенной дальности
if((0.45*tp) < kj && (0.55*tp) > kj)
{
// Сохраняем предварительные результаты
outData.fd[i] = fj;
outData.tnd1[i] = kj;
flag = false;
}
fj += inData.fs;
}
ti += inData.ts;
}
rd = C/outData.fd[0]/2.0;
r01 = rd+inData.r0;
ti = inData.t0;
for(i = 0; i < inData.NT; i++)
{
dd = r01-inData.v*ti;
//tzi = 2.0*dd/C;
// fj = outData.fd[i];
// tp = 1.0/fj;
// timp = tp/10.0;
// kj = tzi-floor(tzi/tp)*tp; // Время неопределенной дальности
kj = 2*(dd-floor(dd*2*outData.fd[i]/C)*(C/2*outData.fd[i]))/C;
// Сохраняем предварительные результаты
outData.tnd2[i] = kj;
ti += inData.ts;
}*/
}
//--------------------------------------------------------------------
double TForm1::FuncFP(double x)
47
{
bool flag = true;
long int i = 0;
double tpovt;
double deltaR;
double dR;
double dt;
while(i != inData.FT)
{
tpovt = 1.0/inData.fpovt[i];
deltaR = C*tpovt/2.0;
dR = x-floor(x/deltaR)*deltaR;
dt = 2.0*dR/C;
if((0.45*tpovt < dt) && (dt < 0.55*tpovt))
return inData.fpovt[i];
i++;
}
return 0;
}
//------------------------------------------------------------------------
---
double TForm1::FuncFP1(double x,double y,double tnd)
{
bool flag = true;
long int i = 0;
double tpovt;
double deltaR;
double dR;
double dt;
double timp;
double tnd2p;
while(i != inData.FT)
48
{
tpovt = 1.0/inData.fpovt[i];
deltaR = C*tpovt/2.0;
dR = x-floor(x/deltaR)*deltaR;
dt = 2.0*dR/C;
timp = tpovt/10.0;
if((0.45*tpovt < dt) && (dt < 0.55*tpovt))
{
tnd2p = 2.0*(y-
floor(y*2.0*inData.fpovt[i]/C)*(C/(2.0*inData.fpovt[i])))/C;
if(tnd2p < tnd-1.5*timp || tnd2p > tnd+1.5*timp)
return tnd2p;
}
i++;
}
return 0;
}
//--------------------------------------------------------------------
//====== ВЫВОД РЕЗУЛЬТАТОВ В ТАБЛИЦУ 1 ======
void TForm1::PrintData(void )
{
long int i;
char *buf[5] = {"","№","Расстояние до цели (км)","Частота (kHz)","Tнд1
(мкс)"};
char buf1[50];
// Очищаем таблицу
for(i = 0; i < (long int)TablRes->RowCount-1; i++)
TablRes->Rows[i]->Clear();
TablRes->ColCount = 5;
TablRes->RowCount = 2;
// Создаем "шапку" таблицы
for(i = 0; i < 5; i++)
TablRes->Cells[i][0] = buf[i];
49
// Выводим результаты в таблицу
for(i = 0; i < inData.NT; i++)
{
TablRes->Cells[1][TablRes->RowCount-1] = TablRes->RowCount-2; //
Порядковый номер
sprintf(buf1,"%.1f",outData.d[i]/1000.0);
TablRes->Cells[2][TablRes->RowCount-1] = buf1;
sprintf(buf1,"%.1f",outData.fd[i]/1000.0);
TablRes->Cells[3][TablRes->RowCount-1] = buf1;
sprintf(buf1,"%.2f",outData.tnd1[i]*1000000.0);
TablRes->Cells[4][TablRes->RowCount-1] = buf1;
TablRes->RowCount++;
}
}
//--------------------------------------------------------------------
//====== ВЫВОД РЕЗУЛЬТАТОВ В ТАБЛИЦУ 2 ======
void TForm1::PrintData2(void )
{
long int i;
char *buf[3] = {"","№","Tнд2 (мкс)"};
char buf1[50];
// Очищаем таблицу
for(i = 0; i < (long int)TablRes1->RowCount-1; i++)
TablRes1->Rows[i]->Clear();
TablRes1->ColCount = 3;
TablRes1->RowCount = 2;
// Создаем "шапку" таблицы
for(i = 0; i < 3; i++)
TablRes1->Cells[i][0] = buf[i];
// Выводим результаты в таблицу
for(i = 0; i < inData.NT; i++)
{
50
TablRes1->Cells[1][TablRes1->RowCount-1] = TablRes1->RowCount-2;
// Порядковый номер
sprintf(buf1,"%.2f",outData.tnd2[i]*1000000.0);
TablRes1->Cells[2][TablRes1->RowCount-1] = buf1;
TablRes1->RowCount++;
}
}
//--------------------------------------------------------------------
//====== ВЫХОД ИЗ ПРОГРАММЫ ======
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete []outData.d;
delete []outData.fd;
delete []outData.tnd1;
delete []outData.tnd2;
}
//--------------------------------------------------------------------
//====== ВЫВОД ГРАФИКА 1 ======
void TForm1::PrintGraf_1(void )
{
Application->CreateForm(__classid(TGraf_1),&Graf_1);
Graf_1->ShowModal();
Graf_1->Free();
}
//--------------------------------------------------------------------
Рисуем графики
//--------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Graf1.h"
#include "Main.h"
51
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TGraf_1 *Graf_1;
int dx_dy = 5; // Смещение осей X и Y
int wXY = 3; // Толщина осей X и Y
const float Scale = 20;
//--------------------------------------------------------------------
__fastcall TGraf_1::TGraf_1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------
void __fastcall TGraf_1::FormPaint(TObject *Sender)
{
DrawAxis(&graf1);
PrintGraf(&graf1);
DrawAxis(&graf2);
PrintGraf(&graf2);
PrintGraf(&graf3);
DrawAxis(&graf4);
PrintGraf(&graf4);
PrintGraf(&graf5);
}
//--------------------------------------------------------------------
//====== ВЫВОДИМ ГРАФИК ======
void TGraf_1::PrintGraf(GRAFIK *g)
{
long int i;
double x, y;
g->pb->Canvas->Pen->Width = g->width;
g->pb->Canvas->Pen->Color = g->color;
52
x = (g->dX[0]-g->minX)/g->scaleX+dx_dy;
y = g->pb->ClientHeight-((g->dY[0]-g->minY)/g->scaleY-dx_dy+wXY);
g->pb->Canvas->MoveTo(x,y);
for(i = 1; i < g->cPoints; i++)
{
x = (g->dX[i]-g->minX)/g->scaleX+dx_dy;
y = g->pb->ClientHeight-((g->dY[i]-g->minY)/g->scaleY-dx_dy+wXY);
g->pb->Canvas->LineTo(x,y);
}
}
//--------------------------------------------------------------------
g->pb->Canvas->Font->Color = clBlue;
g->pb->Canvas->Pen->Width = wXY;
// Рисуем оси
g->pb->Canvas->Pen->Color = clBlack;
g->pb->Canvas->MoveTo(dx_dy,height);
g->pb->Canvas->LineTo(dx_dy,0);
g->pb->Canvas->MoveTo(dx_dy,height);
g->pb->Canvas->LineTo(width,height);
// Стрелочки
g->pb->Canvas->Pen->Width = 2;
// X
g->pb->Canvas->MoveTo(width,height);
g->pb->Canvas->LineTo(width-10,height-4);
g->pb->Canvas->MoveTo(width,height);
53
g->pb->Canvas->LineTo(width-10,height+4);
// Y
g->pb->Canvas->MoveTo(dx_dy,0);
g->pb->Canvas->LineTo(dx_dy-4,10);
g->pb->Canvas->MoveTo(dx_dy,0);
g->pb->Canvas->LineTo(dx_dy+4,10);
// Рисуем сетку
g->pb->Canvas->Pen->Width = 1;
g->pb->Canvas->Pen->Color = clGray;
// Вертикальные линии
for(i = Scale+dx_dy; i < width-10; i = i+Scale)
{
g->pb->Canvas->MoveTo(i,1);
g->pb->Canvas->LineTo(i,height-1);
}
// Горизонтальные линии
for(i = Scale-dx_dy; i < height-10; i = i+Scale)
{
g->pb->Canvas->MoveTo(dx_dy+1,i);
g->pb->Canvas->LineTo(width-1,i);
}
}
//--------------------------------------------------------------------
void __fastcall TGraf_1::FormCreate(TObject *Sender)
{
// Инициализация графика 1
graf1.pb = Graf_1->PaintBox1;
graf1.color = clRed;
graf1.width = 2;
graf1.cPoints = Form1->inData.NT;
graf1.dX = Form1->outData.d;
graf1.dY = Form1->outData.fd;
CalcScale(&graf1);
54
// Инициализация График 2
graf2.pb = Graf_1->PaintBox2;
graf2.color = clRed;
graf2.width = 1;
graf2.cPoints = Form1->inData.NT;
graf2.dX = Form1->outData.d;
graf2.dY = Form1->outData.tnd1;
CalcScale(&graf2);
graf3.pb = Graf_1->PaintBox2;
graf3.color = clBlue;
graf3.width = 1;
graf3.cPoints = Form1->inData.NT;
graf3.dX = Form1->outData.d;
graf3.dY = Form1->outData.tnd2;
CalcScale(&graf3);
// Инициализация График 3
graf4.pb = Graf_1->PaintBox3;
graf4.color = clRed;
graf4.width = 1;
graf4.cPoints = Form1->inData.NT;
graf4.dX = Form1->outData.d;
graf4.dY = Form1->outData.tnd1;
CalcScale(&graf4);
graf5.pb = Graf_1->PaintBox3;
graf5.color = clBlue;
graf5.width = 1;
graf5.cPoints = Form1->inData.NT;
graf5.dX = Form1->outData.d;
graf5.dY = Form1->outData.tnd21;
CalcScale(&graf5);
}
//--------------------------------------------------------------------
//====== ВЫЧИСЛЯЕМ МАСШТАБ ======
55
void TGraf_1::CalcScale(GRAFIK *g)
{
g->minX = MinV(g->dX,graf1.cPoints);
g->minY = MinV(g->dY,graf1.cPoints);
g->scaleX = (MaxV(g->dX,g->cPoints)-g->minX)/g->pb->ClientWidth;
g->scaleY = (MaxV(g->dY,g->cPoints)-g->minY)/g->pb->ClientHeight;
}
//--------------------------------------------------------------------
//====== МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ ======
double TGraf_1::MaxV(double *v,int c)
{
int i;
double m = -1;
56