МИНОБРНАУКИ РОССИИ
Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Южный федеральный университет»
Факультет |
РАДИОТЕХНИЧЕСКИЙ |
|
Кафедра |
|
МИКРОПРОЦЕССОРНЫХ СИСТЕМ |
Отчет по лабораторной работе №1 по дисциплине:
«Объектно-ориентированное программирование».
На тему: «Спектральный анализ кусочно-линейных функций с разрывами».
Выполнил: |
|
студент группы Р-102 |
В.Г.Горчаков |
Проверил:доцент каф. МПС |
М.И.Ледовской |
Таганрог 2013 г.
Цель лабораторной работы
Изучить принципы создания приложения «Спектральный анализ кусочно-линейных функций с разрывами» для Windows в инструментальной среде Delphi 7
Интерфейс приложения
графический |
свойство |
событие |
обработчик |
компонент |
|
|
|
|
|
|
|
Button1 |
Caption |
OnClick |
Button1Click |
Button2 |
Caption |
OnClick |
Button2Click |
GroupBox1 |
Caption |
|
|
StringGrid1 |
GoEditing |
|
|
PaintBox1 |
|
OnPaint |
PaintBox1Paint |
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm) GroupBox1: TGroupBox; Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Edit5: TEdit; Edit6: TEdit;
UpDown1: TUpDown;
UpDown2: TUpDown;
UpDown3: TUpDown;
UpDown4: TUpDown;
UpDown5: TUpDown;
UpDown6: TUpDown; GroupBox3: TGroupBox; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; Label13: TLabel;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit; UpDown8: TUpDown; UpDown9: TUpDown; UpDown10: TUpDown; UpDown11: TUpDown; UpDown12: TUpDown; Label1: TLabel; GroupBox2: TGroupBox; Label8: TLabel;
Edit7: TEdit; UpDown7: TUpDown; Button1: TButton; PaintBox1: TPaintBox;
procedure EditClick(Sender: TObject); procedure PaintBoxPaint(Sender: TObject); procedure ButtonClick(Sender: TObject);
private
{Private declarations } public
{Public declarations } end;
Var
Form1: Tform1;
// параметры гармоник
M: array[0..5] of real; |
// амплидуда |
|
Q: array[1..5] of real; |
// фаза |
|
f1: real; |
// частота первой гармоники |
implementation
{$R *.DFM}
// сумма гармоник
function SumHarm(t: real): real; var
k: integer; y: real;
begin y:=M[0]/2; for k:=1 to 5 do
y:=y+M[k]*cos(2*pi*k*f1*t+Q[k]);
SumHarm:=y;
end;
// гармонический синтез procedure HarmSynt;
const RowCount = 12; // количествостроктаблицыStringGrid HarmCount=8; // количество гармоник + 1
var
Form1: Tform1;
//дискретные значения времени
MasT: array[1..RowCount-1] ofreal;
//значения функции в точках разрыва
MasYl: array[1..RowCount-1] of real; // левые MasYr: array[1..RowCount-1] of real; // правые
implementation
{$R *.dfm}
procedureFuncSpectr;
var |
|
|
l,p: integer; |
// левый нижний угол области вывода |
|
w,h: integer; |
// ширина и высота области вывода |
|
t: real; |
// время |
|
tmax: real; |
|
// верхняя граница времени |
dt: real; |
// приращение |
Ymax: real; |
// верхнее значение функции |
N: integer; |
// количество точек задания функции |
Harm1,Harm2: array[1..HarmCount] of real; // значениягармоникспектра A,A1,A2,B,B1,B2,M: array [0..HarmCount] of real; // амплитудыгармоник
Q: array[0..HarmCount] of real; |
// фазыгармоник |
|
f1: real; |
// частота первой гармоники |
|
mt,mr: real; |
// масштабы |
|
cx0,cy0: integer; // координаты начала координат графиков функции chy0: array[0..HarmCount] of integer; // испектра
cy: integer; |
// текущаяY-координата |
z: real; |
// вспомогательные переменные |
i,k: integer; |
|
begin
// область вывода графиков with Form1.PaintBox1 do begin
Canvas.Pen.Color:=clBlack;
Canvas.Brush.Color:=clWhite;
Canvas.Rectangle(0,0,Width,Height);
l:=70; // X-координата левого верхнего угла p:=Height-20; // Y-координата левого верхнего угла
h:=Height-50; // высота w:=Width-85; // ширина end;
//количество точек задания функции
N:=1;
while (MasT[N+1]>MasT[N]) and (N<RowCount-1) do N:=N+1;
//спектральный анализ кусочно-линейной функции с разрывами if N>1 then
begin tmax:=MasT[N];
f1:=1/tmax; dt:=(MasT[N]-MasT[1])/(N-1); M[0]:=0;
for i:=1 to N do M[0]:=M[0]+MasYl[i]+MasYr[i]; M[0]:=M[0]/2/N;
for k:=1 toHarmCountdo begin
z:=Pi*f1*k*dt;
A1[k]:=0; A2[k]:=0; B1[k]:=0; B2[k]:=0; for i:=1 to N do
begin
A1[k]:=A1[k]+MasYl[i]*Sin(2*z*i)-MasYr[i]*Sin(2*z*(i-1)); A2[k]:=A2[k]+MasYl[i]-MasYr[i]*Sin(z*(2*i-1)); B1[k]:=B1[k]+MasYr[i]*Cos(2*z*(i-1))-MasYl[i]*Cos(2*z*i); B2[k]:=B2[k]+MasYl[i]-MasYr[i]*Cos(z*(2*i-1));
end; A[k]:=A1[k]/z/N-Sin(z)*A2[k]/Sqr(N)/N;
B[k]:=B1[k]/z/N+Sin(z)*B2[k]/Sqr(N)/N;
M[k]:=Sqrt(Sqr(A[k])+Sqr(B[k]));
if A[k]<>0 then Q[k]:=-ArcTan(B[k]/A[k]); end;
end;
// максимальное значение функции |
|
Ymax:=0; |
|
for i:=1 to N do |
|
begin |
|
if Abs(MasYl[i]) >YmaxthenYmax:=Abs(MasYl[i]); |
|
if Abs(MasYr[i]) >YmaxthenYmax:=Abs(MasYr[i]); |
|
end; |
|
// масштабы |
|
mr:=(h-20)/(2+2*HarmCount); // относительных единиц по Y-координате |
// по Y- |
координате |
|
if N>1 thenmt:=(w-15)/tmax; // времени по X-координате |
|
with Form1.PaintBox1.Canvas do begin
//разметка осей для графика функции
//вертикальная ось
cx0:=l; cy:=p-h;
TextOut(cx0+w div 4,cy-25,'Функция'); MoveTo(cx0,cy); LineTo(cx0,cy+Round(2*mr)); MoveTo(cx0-3,cy); LineTo(cx0+3,cy); TextOut(cx0-20,cy-7,'+1');
cy0:=cy+Round(mr); TextOut(cx0-63,cy0-10,'Y(t)/Ymax');
// горизонтальнаяось
MoveTo(cx0,cy0); LineTo(cx0+w,cy0); if N>1 then
for i:=1 to N do begin
MoveTo(cx0+Round(MasT[i]*mt),cy0-3);
LineTo(cx0+Round(MasT[i]*mt),cy0+3); if (i<>1) and (i mod 2 = 1) then
TextOut(cx0+Round(MasT[i]*mt)-7,cy0+2,FloatToStr(MasT[i])); end;
TextOut(w+70,cy0+2,'t');
cy:=cy0+Round(mr); MoveTo(cx0-3,cy); LineTo(cx0+3,cy); TextOut(cx0-20,cy-7,'-1');
// разметка осей для графиков спектра cy:=cy+30;
TextOut(cx0+wdiv 5,cy-20,'Спектрфункции'); MoveTo(cx0,cy); LineTo(cx0,p+10);
for k:=0 toHarmCountdo begin
MoveTo(cx0-3,cy); LineTo(cx0+3,cy); chy0[k]:=cy+Round(mr); TextOut(cx0-45,chy0[k]-7,'Y'+IntToStr(k)+'/M1');
MoveTo(cx0,chy0[k]); LineTo(cx0+w,chy0[k]); if N>1 then
begin
MoveTo(cx0+Round(tmax*mt),chy0[k]-3); LineTo(cx0+Round(tmax*mt),chy0[k]+3); end;
TextOut(w+70,chy0[k]+2,'t');
cy:=chy0[k]+Round(mr); end;
MoveTo(cx0-3,cy); LineTo(cx0+3,cy);
//построение графика функции
Pen.Color:=clRed;
Pen.Width:=2;
MoveTo(cx0,cy0); ifYmax<>0 then for i:=1 to N do begin
LineTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYl[i]/Ymax)*mr)); MoveTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYl[i]/Ymax)*mr)); LineTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYr[i]/Ymax)*mr)); MoveTo(cx0+Round(MasT[i]*mt),cy0-Round((MasYr[i]/Ymax)*mr)); end;
Pen.Width:=1;
//построение графиков спектра
t:=0;
dt:=0.001;
if (N>1) and (M[1]<>0) then begin
MoveTo(cx0,chy0[0]-Round(M[0]/M[1])); LineTo(cx0+Round(tmax*mt),chy0[0]-Round(M[0]/M[1])); repeat
for k:=1 toHarmCountdo begin
Harm2[k]:=(M[k]/M[1])*cos(2*Pi*k*f1*t+Q[k]);
if t=0 thenMoveTo(cx0+Round(t*mt),chy0[k]-Round(Harm2[k]*mr)) else MoveTo(cx0+Round((t-dt)*mt),chy0[k]-Round(Harm1[k]*mr)); LineTo(cx0+Round(t*mt),chy0[k]-Round(Harm2[k]*mr)); Harm1[k]:=Harm2[k];
end; t:=t+dt;
until (t>=tmax); end;
end;
end;
procedure Tform1.FormCreate(Sender: Tobject); var
i: integer; begin
// количествостолбцовтаблицы StringGrid StringGrid1.ColCount:= 3;
// разметкатаблицы
StringGrid1.ColCount:= 3; StringGrid1.Cells[0,0]:= ' t'; StringGrid1.Cells[1,0]:= ' Y(t-0) '; StringGrid1.Cells[2,0]:= ' Y(t+0) '; for i:=1 to RowCount-1 do
begin
// заполнениетаблицынулями
Form1.StringGrid1.Cells[0,i]:= '0';
Form1.StringGrid1.Cells[1,i]:= '0';
Form1.StringGrid1.Cells[2,i]:= '0';
// инициализациямассивовнулевымизначениями
MasT[i]:=StrToFloat(Form1.StringGrid1.Cells[0,i]);
MasYl[i]:=StrToFloat(Form1.StringGrid1.Cells[1,i]);
MasYr[i]:=StrToFloat(Form1.StringGrid1.Cells[2,i]); end;
end;
procedure Tform1.Button1Click(Sender: Tobject); var
i:integer; begin
for i:=1 to RowCount-1 do begin
// обновление значений времени и функции
MasT[i]:=StrToFloat(Form1.StringGrid1.Cells[0,i]);
MasYl[i]:=StrToFloat(Form1.StringGrid1.Cells[1,i]);
MasYr[i]:=StrToFloat(Form1.StringGrid1.Cells[2,i]); end;
FuncSpectr; end;
procedure Tform1.PaintBoxPaint(Sender: Tobject); begin
FuncSpectr; end;
procedure Tform1.Button2Click(Sender: Tobject); begin
Application.Terminate; end;
end.
Вывод: изучил принципы создания приложения «Спектральный анализ кусочно-линейных функций с разрывами» для Windows в
инструментальной среде Delphi 7. Изучили основные свойства объектов среды программирования Delphi 7.