Спектральный анализ дискретных сигналов

Автор: Пользователь скрыл имя, 25 Октября 2015 в 21:44, курсовая работа

Краткое описание

Задание для курсовой работы:
Написать программу на языке программирования Паскаль для решения следующей задачи (вариант задания индивидуальный). Результаты расчетов должны выводиться на экран и в файл. Оформление графиков и таблиц выполнять средствами математических пакетов (Maple, MathCad). Демонстрационный вариант программы подготовить в среде визуального программирования Delphi.
Проверить решение промежуточных задач средствами математических пакетов. Построить блок-схемы задачи и вспомогательных частей алгоритма. Оценить погрешность выполненных расчетов.

Файлы: 1 файл

Курсовая.doc

— 261.00 Кб (Скачать)

Button2.Visible:=false;

Button3.Visible:=true;

Button3.SetFocus;

Button4.Visible:=false;

end;

procedure TForm1.Button3Click(Sender: TObject);

var

  j: Integer;

  s1,s2,s3:string;

  begin

for j := 0 to N do

Y[j]:=signal(x0+j*hx);

Y[N]:=(Y[0]+Y[N])/2;

Trig(m,N,Y,a,b);

for j := 0 to m do

  begin

    str(j:2,s1);

    str(a[j]:10:5,s2);

    str(b[j]:10:5,s3);

    listbox1.Items.Add(s1+s2+s3);

    end;

    label1.Caption:='Вычислены коэффициенты Фурье';

  Button3.Visible:=false;

  Button4.Visible:=true;

  Button4.SetFocus;

    end;

procedure TForm1.Button4Click(Sender: TObject);

begin

Form1.Caption:='Построение  графиков';

    {здесь поместим алгоритм построения  графика сигнала и триг. полинома}

    Label1.Caption:='графики сигнала и полинома';

    Button4.Visible:=false;

    Button5.Visible:=true;

    Button5.SetFocus;

    Label2.Visible:=false;

    {Label3.Visible:=false;

    Label4.Visible:=false;}

   listbox1.Visible:=false;

    grafik(1); { 1 - сигнал точками, полином - линией}

Label1.Caption:='графики  сигнала и полинома';

Button4.Visible:=false

end;

 

 

procedure TForm1.Button5Click(Sender: TObject);

begin

Form1.Caption:='Спектр амплитуд';

    {здесь поместим алгоритм построения спектра амплитуд}

        Label1.Caption:='График спектра амплитуд';

    Button5.Visible:=false;

      form1.image1.Canvas.FillRect(rect(0,0,clientwidth,clientheight));

      grafik(2);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

Button2.Visible:=true;

Button3.Visible:=false;

Button4.Visible:=false;

Button5.Visible:=false;

end;

end.

 

 

 

 

 

 

 

 

 

 

 

 

Часть 2.

> restart;

> with(linalg):with(plots):

pp:=(x,y)->[x,y];

 

> fun:= proc(t) local z ;z:=piecewise(t<0,0,t<1/2,2*t,t<1,1,0); evalf(z);end;

> plot(fun(t),t=-1..2,thickness=2,color=brown);

> p(x):=x^4-x^3-3;

> Koeff:=fsolve(p(x),x,0..2);

> T:=Koeff;

> tau:=1;

 

> Period:=proc(t,t0,tau,T,f) local x,z;

x:=evalf(t-t0-floor((t-t0)/T)*T);

z:=fun(x/tau);evalf(z);

end;

> plot(Period(x,0,tau,T,fun),x=-1..3,thickness=2,color=brown):;

> #==============================================================================

>

> Koc:=0.2;Nzac:=5;

> ur:=diff(U(t),t);

> F:=Nzac*(cos((4+Nzac/10)*t+U(t))+Koeff*Period(t,0,tau,T,f)-Koc*U(t));

RK:=dsolve({ur=F,U(0)=0.15},U(t),type=numeric,output=listprocedure);

> fU:=subs(RK,U(t));

> T0:=5;Nt:=50;h:=T0/Nt;

> Tx:=array(0..Nt):U:=array(0..Nt):U_map:=array(0..Nt);

> for j from 0 to Nt do

x:=j*h;z:=fU(x);Tx[j]:=x;U[j]:=z;U_map[j]:=z;

#print(x,z);

od:

> RisU:=zip(pp,Tx,U):

> RU:=plot(RisU):

> display(RU):;

> #====================================

> RisU:=zip(pp,Tx,U):

> whattype([RisU]);

> RU0:=plot(RisU,style=point,symbol=cross):

> display(RU0):;

Определение периода с помощью функции автокорреляции

> R:=proc(Nt,T::array,U::array)

local k,j,t,z,Af::array,Uf::array,RAf,RisAf;

Af:=array(0..Nt);Uf:=array(0..2*Nt);

for j from 0 to Nt do Uf[j]:=U[j];Uf[j+Nt]:=U[j];

end;

for j from 0 to Nt do

t:=0;

for k from 0 to Nt do

t:=t+evalf(Uf[k]*Uf[k+j]);

end;

Af[j]:=evalf(t/Nt);

end;

RAf:=zip(pp,T,Af);RisAf:=plot(RAf):

display(RisAf);

end:

> R(Nt,Tx,U);

>

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=

>

> fn:=`D:\\work\\Астраханский.txt`;

>

>

++++++++++++++++++++++++++++++++++++++++++++++++++++

> L:=readdata(fn,2):;

Nstrok:=vectdim(L);

> U_n:=array(1..Nstrok);:

T_n:=array(1..Nstrok);

> for j from 1 to Nstrok do

T_n[j]:=L[j,1];

U_n[j]:=L[j,2];

#print(j,T_n[j],U_n[j]);

od:

> Ru1:=zip(pp,T_n,U_n):

> RU1:=plot(u1,style=point,symbol=cross,color=black):

 

> display(RU,RU1);

 

>

> #printf("%s",`  №      t      U_map    U_pas     разн \n`);

for k from 0 to Nt do t:=Tx[k]:del:=U_map[k]-U_n[k+1];

#printf("% 3.0f  % 6.2f % 8.4f  % 8.4f % 8.4f \n",k,t,U_map[k],U_n[k+1],del):

end:;

 

 

unit final;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Menus, StdCtrls;

type

  TForm1 = class(TForm)

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    SaveDialog1: TSaveDialog;

    Label1: TLabel;

    Label2: TLabel;

    ListBox1: TListBox;

    N4: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    Label3: TLabel;

    Label4: TLabel;

    procedure N3Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N6Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

            {=====================================================}

const

   U0=0.2;

   nzac=5;

   koc=0.2;

   hintegr=0.1;

   Npoint=80;

var

       tau:real; {период  сигнала}

       Koeff:real; {равен  периоду}

       min,sec:byte;

       frez:string;

       ftxt:text;

{===================корень полинома==============}

{фунция, задающая вычисление полинома  в точке}

function polynom(t:real):real;

begin

   polynom:=sqr(sqr(t))-sqr(t)*t-3;

end;

{процедуры метода простой итерации}

function derive(x:real):real;

begin

  derive:=4*sqr(x)*x-3*sqr(x);

end;

procedure Iter(a,b:real;var root:real;var K:integer);

const

  eps=0.0000001;{погрешность определения корня}

  Q0=1.5; {нормирующий множитель для ламбда}

var

  lambda:real;

  g:real;

  x,x0:real;

begin

   g:=derive(b);

    form1.label2.caption:='max производной =  '+ floattostrF (g, ffGeneral, 5, 1);

    lambda:=1.99/g;

    x:=(a+b)/2;

    k:=0;

    repeat

      x0:=x;

      x:=x0-lambda*polynom(x0);

      form1. listbox1.Items.Add(floattostrF(x,ffGeneral, 12, 9));

      k:=k+1;

    until abs(x-x0)<eps;

    root:=x;

end;

function signal(t:real):real;{сигнал 11-го варианта}

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;

 

 

function Period(x,T:real):real;

  var

    z:real;

begin

   z:=x-trunc(x/T)*T;{выделение дробной части}

   Period:=signal(z);

end;

{====================правая часть диф. уравнения===}

function F(t,U:real):real;

begin

  F:=Nzac*  (cos((4+nzac/10)*t+U)+Koeff*Period(t,Koeff)-Koc*U);

end;

procedure difur;

var

  j:integer;

  U,t:real;

  U1:real;

  strU,strt:string;

begin

  form1.listbox1.Clear;

   U:=U0;

   t:=0;

   Koeff:=Tau;

   for j :=0 to Npoint+1 do

   begin

          strt:=floattostrF(t,ffGeneral, 7, 4);

     strU:=floattostrF(U,ffGeneral, 7, 4);

     form1. listbox1.Items.Add(strt+'   '+ stru);

     writeln(ftxt,t:8:2,' ',U:8:3);

     {Метод Эйлера}

          U1:=U+hintegr*F(t,U);

          U:=U1;

          t:=t+hintegr;

   end;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

if savedialog1.Execute then

   begin

     frez:=savedialog1.FileName;

     label1.caption:='эапись в  файл '+#10+frez;

   end;

   assignfile(ftxt,frez);

    rewrite(ftxt);

end;

procedure TForm1.N3Click(Sender: TObject);

begin

Form1.Close;

Closefile(ftxt);

end;

procedure TForm1.N5Click(Sender: TObject);

var

a,b:real;

kiter:integer;

begin

 

 

    Form1.Caption:='Вычисляем корень полинома';

     b:=3;

     a:=0;

    {здесь вызов алгоритма  вычисления корня уравнения}

    Iter(a,b,Tau,Kiter);{вызов процедуры метода итераций}

    Label3.Caption:='корень равен '+floattostr(Tau);

    Label4.Caption:='число итераций '+inttostr(Kiter);

end;

procedure TForm1.N6Click(Sender: TObject);

begin

difur;

end;

end.


Информация о работе Спектральный анализ дискретных сигналов