Автор: Пользователь скрыл имя, 25 Октября 2015 в 21:44, курсовая работа
Задание для курсовой работы:
Написать программу на языке программирования Паскаль для решения следующей задачи (вариант задания индивидуальный). Результаты расчетов должны выводиться на экран и в файл. Оформление графиков и таблиц выполнять средствами математических пакетов (Maple, MathCad). Демонстрационный вариант программы подготовить в среде визуального программирования Delphi.
Проверить решение промежуточных задач средствами математических пакетов. Построить блок-схемы задачи и вспомогательных частей алгоритма. Оценить погрешность выполненных расчетов.
Уральский технический институт связи и информатики (филиал)
Сибирского государственного университета
Телекоммуникаций и информатики
(УрТИСИ ГОУ ВПО «СибГУТИ»)
Курсовая работа.
По дисциплине
«Языки программирования».
Тема: Спектральный анализ дискретных сигналов
Выполнил: Астраханский Д.А.
Группа: МЕ-51
Екатеринбург, 2008
Задание для курсовой работы.
Написать программу на языке программирования Паскаль для решения следующей задачи (вариант задания индивидуальный). Результаты расчетов должны выводиться на экран и в файл. Оформление графиков и таблиц выполнять средствами математических пакетов (Maple, MathCad). Демонстрационный вариант программы подготовить в среде визуального программирования Delphi.
Проверить решение промежуточных задач средствами математических пакетов. Построить блок-схемы задачи и вспомогательных частей алгоритма. Оценить погрешность выполненных расчетов.
Напряжение U=U(t) на входе транзистора как функция времени описывается дифференциальным уравнением
с начальными условиями (1), где n – последняя цифра номера зачетной книжки, k – коэффициент усиления (см. ниже), fs(t) – периодический сигнал
(рис. 1), m – коэффициент обратной связи.
Указания и пояснения.
Курсовая работа выполняется в ЧЕТЫРЕ этапа.
Оформление:
Часть 1.
Решение задачи спектрального анализа (вариант 02 )
> restart;
> with(linalg):with(plots):with(
> fun:= proc(t)
local z ;z:=piecewise(t<0,0,t<1/2,2*t,
> fun(t/tau);
> p(x):=x^4-x^3-3;
> Koeff:=fsolve(p(x)=0,x,0..3);
> tau:=Koeff:
> plot(p(x),x=Koeff-0.5..Koeff+
> R1:=plot(fun(t),t=0..2.5,
> R11:=plot(fun(t/tau),t=0..2.5,
> display(R1,R11);
> Fourier_T:=proc(F,T0,TN,k::
global A0,Ak,Bk;
T:=TN-T0;
A0:=2/T*Int(F(x),x=T0..TN);
Ak:=2/T*int(F(x)*cos(k*x*2*Pi/
Bk:=2/T*int(F(x)*sin(k*x*2*Pi/
end proc:
> Trig_polynom:=proc(N,T,a0,ak,
global a,b,RisTrig;
a:=array(0..N);b:=array(0..N);
A0:=evalf(a0);a[0]:=A0;b[0]:=
A:=seq(evalf(subs(k=n,ak)),n=
B:=seq(evalf(subs(k=n,bk)),n=
for n from 1 to N do
a[n]:=A[n];b[n]:=B[n];
end do;
Pol:=A0/2+sum(A[k]*cos(2*Pi*k*
RisTrig:=plot(Pol,x=-T/2..3*T/
RETURN(Pol);
end proc:
> ARR:=proc(n::integer,c) local L,H,ma,mi,k::integer,
Sim::array(0..n);
ma:=c[0];mi:=c[0];
L:=line([0,c[0]],[n,c[n]],
for k from 1 to n do
if c[k]>ma then ma:=c[k];end if;
if c[k]<mi then mi:=c[k];end if;
end do;
H:=ma-mi;
if H=0 then RETURN(L) end;
for k from 0 to n do
if abs(c[k])<H/1000 then
Sim[k]:=ellipse([k,c[k]],0.2,
else
Sim[k]:=plottools[arrow]([k,0]
end if;
end do;
convert(Sim,list);
end:
> Spectr:=proc(n,a,b,c,Risphi) local k,R,phi;
for k from 0 to n do
c[k]:=evalf(abs(I*a[k]+b[k])):
# print(k,c[k]);
phi:=evalf(argument(I*a[k]+b[
R[k]:=[eval(k),eval(phi)];
end:;
Risphi:=plot(convert(R,list)):
end:
> T:=3;# величина периода
> F_for_all:=proc(t) global tau;fun(t/tau);end proc:;
> Ris1:=plot(F_for_all(t),t=0..
> Fourier_T(F_for_all,0,T,k):
> a0:=evalf(A0);
> Nk:=80;
> Trig_polynom(Nk,T,A0,Ak,Bk,k):
> display(RisTrig,Ris1);
> Spectr(Nk,a,b,c,'Risphi1');
> display(ARR(Nk,c));
>
> Ampl:=display(ARR(Nk,c)):;
> 2: DTF:=proc (y,N,Y) local n,k,j,p,h;
n:=N-1;
h:=2*Pi/N;
2.1: for k from 0 to N do
p:=0;
for j from 0 to n do
p:=p+evalf(y[j]*exp(-I*k*j*h))
end;
Y[k]:=evalf(1/N*p);
end:
end:;
> 3: CDTF:=proc(N,Y,y) local n,k,h,p,j;
n:=N-1;
h:=2*Pi/N;
for k from 0 to n do
p:=0;
for j from 0 to n do
p:=p+Y[j]*exp(I*k*j*h);
end;
y[k]:=evalf(Re(p));
end:
end:
> Setka_DTF:=proc(Nt,T,F,Y::
global GrafF;
h:=T/Nt;
for j from 0 to Nt do
x:= evalf(j*h);
Y[j]:= F(x);
R[j]:=[j,eval(Y[j])];
end:
5.1: R[Nt]:=[j,eval(Y[0])];
GrafF:=plot(convert(R,list),0.
style=point,symbol=circle):
end:
> Spectr_DTF:=proc(n,C,A,phi) local k,R;global Risphi;
6.1: for k from 0 to n do
A[k]:=evalf(abs(C[k])):
phi[k]:=evalf(argument(C[k]));
R[k]:=[eval(k),eval(phi[k])];
end:;
Risphi:=plot(convert(R,list),
end:
Параметры задачи
> Nt:=80:`число дискретных отсчетов `:
> n:=Nt;N:=Nt-1;# параметры ДПФ
> C:=array(0..n):phi:=array(0..
Y:=array(0..N):
> Setka_DTF(N,T,F_for_all,Y);
> DTF(Y,Nt,C,n):
> Spectr_DTF(n,C,A,phi):
Для четных N
> display(ARR(n,A));
> display(ARR((n-1)/2,A));
> CDTF(Nt,C,F):
> display(GrafF,ARR(n-1,F));
> Setka:=proc(Nt,T,F,Y::array) local h,j,x,R,RL;
global GrafF;
h:=T/Nt;
for j from 0 to Nt do
x:= evalf(j*h);
Y[j]:= F(x);
R[j]:=[x,eval(Y[j])];
end:
5.1: R[Nt]:=[x,eval(Y[0])];
GrafF:=plot(convert(R,list),0.
style=point,symbol=circle):
end:
> F_Discret:=proc (Y,N,a,b,n) local k,j,p,q,h;
h:=2*Pi/N;
for k from 0 to n do
p:=0;q:=0;
for j from 0 to N do
p:=p+evalf(Y[j]*cos(k*j*h));
q:=q+evalf(Y[j]*sin(k*j*h));
end;
a[k]:=2/N*p;b[k]:=2/N*q;
# print(k,a[k],b[k]);
end:
if 2*n=N then b[n]:=0; end;
RETURN(n);
end:;
> 3: Trig:=proc(t,n,T,a,b) local z,k;
z:=a[0]/2+sum(a[k]*cos(k*t*2*
end:
Для сравнения графиков спектра амплитуд и спектра фаз зададим одинаковое число коэффициентов
> M:=Nk:
> a:=array(0..M):b:=array(0..M):
> Setka(N,T,F_for_all,Y):
> F_Discret(Y,N,a,b,M):
> Cl:=blue,red,brown:;
> 15: RT:=seq(plot(Trig(t,8*k,T,a,b)
numpoints=500,color=Cl[k]),k=
> 16: display(RT,GrafF);
> Spectr(M,a,b,c,'Grafphi');:
> display(ARR(M,c));:
> display(Ampl);
>
unit koren1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button2: TButton;
Label2: TLabel;
Button3: TButton;
ListBox1: TListBox;
Button4: TButton;
Button5: TButton;
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{============================}
const
N=80;
m=N div 2;
x0=0;
T=3;
hx=T/N;
type
koeff=array[0..m] of real;
dann=array[0..N] of real;
var
Tau:real;
Y:dann;
a,b:koeff;
h:real;
eps:real;
La:real;
Rb:real;
Nkoeff:integer;
function pol(t:real):real;
begin
pol:=sqr(sqr(t))-sqr(t)*t-3;
end;
function derive(t:real):real;
begin
derive:=4*sqr(t)*t-3*sqr(t);
end;
function root(a,b:real):real;
var
X0,X1,delta:real;
begin
X0:=(a+b)/2;
repeat
X1:=X0-pol(X0)/derive(X0);
delta:=abs(X1-X0);
X0:=X1;
until delta<0.00001;
root:=X0;
end;
function riter(a,b:real):real;
var
X0,X1,delta:real;
const
lambda=0.0001;
begin
X0:=(a+b)/2;
repeat
X1:=X0-pol(X0)*lambda;
delta:=abs(X1-X0);
X0:=X1;
until delta<0.00001;
riter:=X0;
end;
function signal(t:real):real;
var
z:real;
begin
if t<0 then
z:=0
else
if t<1/2 then
z:=2*t
else
if t<1 then
z:=1
else z:=0;
signal:=z;
end;
procedure Trig(m,N:integer;Y:dann;var a,b:koeff);
var
j,k:integer;
p,q:real;
x:real;
h:real;
begin
h:=2*Pi/N;
for k := 0 to m do
begin
p:=0;q:=0;
for j := 1 to N do
begin
x:=j*h;
p:=p+Y[j]*cos(x*k);
q:=p+Y[j]*sin(x*k);
end;
a[k]:=p*2/N;
b[k]:=q*2/N;
end;
end;
function Tpol(m:integer;x:real):real;
var
z:real;
k:integer;
begin
z:=a[0]/2;
for k:=1 to m do
z:=z+(a[k]*cos(k*2*Pi/T*x)+b[
Tpol:=z;
end;
procedure grafik(numvar:integer);
type
dann= array[0..N] of real;
var
L,R,W,H: integer;
X: dann;
Y: dann;
k:integer;
ymin,ymax:real;
Mx,My:real;
x0,y0: integer;
posx,posy:integer;
Nkf:string;
tx:real;
ypol:real;
procedure min_max(N:integer;Y:dann; var min, max:real);
var
k: integer;
begin
min:=Y[0];max:=Y[0];
for k := 1 to N do
if Y[k]> max then
max:=Y[k]
else if Y[k]< min then
min:=Y[k];
{увеличим диапазон}
max:=max+0.1;
min:=min-0.1;
end;
begin
L:=20;
R:=form1.image1.clientHeight-
W:=form1.image1.Width-50;
H:=form1.image1.clientheight-
case numvar of
1: begin
for k:=0 to N do
X[k]:=signal(hx*k/Tau);
min_max(N,X,ymin,ymax);
Mx:=W/N;
My:=H/(ymax-ymin);
x0:=L;
y0:=R-abs(Round(ymin*My));
with form1.image1.Canvas do
begin
pen.Color:=clblue;
font.Name:='Tahoma';
font.Size:=8;
font.Color:=claqua;
for k:=0 to N do
begin
posx:=x0+round(k*Mx);
posy:=y0-round(X[k]*My);
textout(posx-2,posy-8,'o');
Pixels[posx,posy]:=clRed;
end;
pen.Width:=2;
Moveto(L,R);lineto(L,R-H);
moveto(x0,y0);lineto(x0+W,y0);
font.Color:=clred;
textout(x0+W,y0+10,'x');
textout(x0+W,y0-20,
textout(x0+round(W*Tau/T), y0-20,'tau='+ floattostrF (Tau,ffFixed, 6, 3));
Nkf:=Inputbox('Число коэффициентов полинома','например 10','20');
Nkoeff:=strtoint(Nkf);
pen.Color:=clNavy;
tx:=0;
ypol:=Tpol(Nkoeff,tx/Tau);
posx:=x0+round(0*Mx/2);
posy:=y0-round(ypol*My);
moveto(posx,posy);
for k:=1 to 2*N do
begin
tx:=hx*k/2;
ypol:=Tpol(Nkoeff,tx/Tau);
posx:=x0+round(k*Mx/2);
posy:=y0-round(ypol*My);
lineto(posx,posy);
end;
end;
end;
2: begin
for k:=0 to m do
Y[k]:=sqrt(sqr(a[k])+sqr(b[k])
min_max(m,Y,ymin,ymax);
Mx:=W/m;
My:=H/(ymax-ymin);
x0:=L;
y0:=R-abs(Round(ymin*My));
with form1.image1.Canvas do
begin
pen.Width:=2;
pen.Color:=clred;
Moveto(L,R);lineto(L,R-H);
moveto(x0,y0);lineto(x0+W,y0);
pen.Width:=5;
pen.Color:=clblue;
for k:=0 to m do
begin
posx:=x0+round(k*Mx);
posy:=y0-round(Y[k]*My);
moveto(posx,y0);
lineto(posx,posy);
end;
end;
end;
end;
end;
{=============================
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Button2Click(Sender: TObject);
const
a=0; b=3;
begin
Tau:=riter(a,b);
Label2.Caption:='корень='+