Рефераты. Разложение сигнала в базисе Уолша

Разложение сигнала в базисе Уолша

Разложение сигнала в базисе Уолша

Пояснительная записка к курсовой работе по дисциплине "Прикладное программирование"

Разработал студент группы 96ПУ2 Cалимов Т.Р.

Пензенский государственный университет, Кафедра "АУИС"

Пенза 1998

Введение

В настоящее время индустрия производства компьютеров и  программного обеспечения для них является  одной  из  наиболее  важных сфер экономики развитых стран. Ежегодно в мире  продаются  десятки миллионов компьютеров. Только в США объем продаж компьютеров  составляет десятки миллионов долларов и постоянно продолжает расти.

В чем же причины такого стремительного роста индустрии персональных компьютеров и их сравнительная выгодность для многих деловых применений?

Простота использования, обеспеченная с помощью  диалогового способа взаимодействия с компьютером.

Относительно высокие возможности по  переработке  информации, наличие программного обеспечения, а так же мощных систем  для разработки нового программного обеспечения.

Язык С++ - универсальный язык общего назначения, область приложений которого - программирование систем в самом широком смысле. Кроме этого, С++ успешно используется как во  многих  приложениях, так и в мощных операционных системах. Реализация С++  осуществлена для машин в диапазоне от самых простых персональных компьютеров  до  самых мощных суперкомпьютеров и для  всех операционных систем.

И потому в данном курсовом проекте необходимо применить язык программирования С++ , как наиболее подходящий для решения поставленной задачи.

Прикладное программирование

Задание на курсовую работу

Тема: разработка программы для разложения сигнала в базисе Уолша.

Исходные данные:

Программа должна выполнять следующие действия:

1) принять блок данных целого типа , первый элемент в файле указывает количество значений в файле (до 10000);

2) выделить кадр из 256 значений;

3) вычислить среднее арифметическое по формуле  Разложение сигнала в базисе Уолша;

4) удалить постоянную составляющую из значений кадра xi=xi - m;

5) разложить сигнал в базисе Уолша;

6) коэффициенты разложения сохранить в файле;

7) построить график сигнала;

8) построить график функции Уолша;

9) повторить пункты 2 - 8 до конца файла со смещением 256 значений;

Составить пояснительную записку по форме:

a) задание;

б) алгоритм;

в) программа;

г) контрольный пример;

д) описание работы программы.

1 Алгоритм работы программы

2 Текст программы

#include <conio.h>

#include <stdio.h>

#include <stdlib.h>

#include <graphics.h>

 FILE *f;                      //Указатель на файл данных

 FILE *out;                               //Указатель на выходной файл

 int arr[256];                            //Массив кадрa

 int uolsh[512];                          //Массив коэффициентов Уолша

 int code, to_int;                        //Переменные для преобразования

 int clk2, loop, clk1;                    //Переменные циклов

 float sum;                               //Среднее арифметическое

 float stepx, stepy;                      //Шаги графика по х и по y

 int delta;                               //Смещение оси абсцисс

 char ch[10];                     //Для чтения строки файла

 int gdriver = DETECT, gmode, errorcode;  //Для инициализации графики

 int del=40;                              //Смещение оси ординат

int max() {                                //Поиск максимального числа

int tmp;                                  //Временная переменная

 tmp=0;

 for (clk2=0;clk2<256;clk2++)

   if (tmp<abs(arr[clk2])) tmp=abs(arr[clk2]);

 return tmp;

}

int ffread (FILE *filptr,char st[10]) {

int flg=0;    //Флаг наличия ошибки

size_t err;    //Определяет наличие ошибки

 *st--;

 do {

   *st++;

   err=fread (st,1,1,filptr);

   if (err!=1) {

     flg=1;

     break;

   }

 } while (st[0]!='n');

 st[0]=0;

 return flg;

}

void main () {

 clrscr();

 if ((f = fopen("int.dat", "rt"))== NULL) {

    fprintf(stderr, "Входной файл отсутствует.n");

    exit (1);

 }

 if ((out = fopen("out.dat", "wt"))== NULL) {

    fprintf(stderr, "Ошибка создания файла.n");

    exit (1);

 }

 if (ffread (f,ch)==1) {                          //Чтение длины файла

    fprintf(stderr, "Ошибка при чтении файла.n");

    exit (1);

 }

 code=atoi(ch);                //Преобразование строки в число

 if (code<256) {

    fprintf(stderr, "Длина меньше одного кадраn");

    exit (1);       //Длина меньше одного кадра

 }

 for (clk1=0;clk1<code/256;clk1++) {

   clrscr ();

   for (clk2=0;clk2<256;clk2++) {   //Чтение одного кадра

if (ffread (f,ch)==1) {                  //Чтение данных из файла

   fprintf(stderr, "Ошибка при чтении файла.n");

   exit (1);

}

arr[clk2]=atoi (ch);                          //вычисление значения

   }

   //Вычисление среднего арифметического кадра

   sum=0;

   for (clk2=0;clk2<256;clk2++) sum+=arr[clk2];

   printf ("Среднее значение амплитуды сигнала в кадре равно %fn",

                                      sum/256);

       //Удаление постоянной составляющей

   printf ("Удаляем постоянную составляющую...n");

   for (clk2=0;clk2<256;clk2++) arr[clk2]-=int(sum/256);

             //Раскладываем сигнал в базисе Уолша

             //Для разложения находим второй коэффициент

             //       0            1/2

             // C1=-U*ó (Q+1/2)dQ+U*ó (Q+1/2)dQ=U/4

             //       õ             õ

             //     -1/2            0

             //Для каждой пары значений

   printf ("Раскладываем в базисе Уолша...n");

   for (clk2=0;clk2<255;clk2++) {

     uolsh[2*clk2]=(arr[clk2+1]-arr[clk2])/4+arr[clk2];

     uolsh[2*clk2+1]=(arr[clk2+1]-arr[clk2])*3/4+arr[clk2];

     fprintf (out,"%i ",uolsh[2*clk2]);

     fprintf (out,"%i n",uolsh[2*clk2+1]);

   }

   printf ("Нажмите любую клавишуn");

   getch();

   initgraph(&gdriver, &gmode, "");

   errorcode = graphresult();

   if (errorcode != grOk)

   {

      printf("Ошибка инициализации графики: %sn",

     grapherrormsg(errorcode));

      printf("Нажмите любую клавишу для выхода n");

      getch();

      exit(1);

   }

   stepx=(getmaxx()-del)/256;                //Вычисление шага по x

   delta=(getmaxy()/2);                        //Смещение оси абсцисс

   stepy=(float)delta/max();                   //Вычисление шага по y

   line (del,0,del,479);                       //Рисование осей координат

   line (0,delta,639,delta);

   outtextxy(0,delta+20,"0");                  //Вывод обозначений осей

   outtextxy(33,0,"Y");

   outtextxy(500,delta+20,"номер значения");

   moveto(del,delta-arr[1]*stepy);

   setcolor(LIGHTBLUE);

   for (clk2=0;clk2<256;clk2++)                          //Вывод графика

     lineto (stepx*clk2+del,delta-stepy*arr[clk2]);         //сигнала]

   setcolor (WHITE);

   outtextxy (100,0,"График сигнала");

   outtextxy(100,10,"Нажмите любую клавишу для продолжения");

   getch();

   initgraph(&gdriver, &gmode, "");

   line (del,0,del,479);                         //Рисование осей координат

   line (0,delta,639,delta);

   outtextxy(0,delta+20,"0");                    //Вывод обозначений осей

   outtextxy(33,0,"Y");

   outtextxy(500,delta+20,"номер значения");

   moveto(del,delta-uolsh[1]*stepy);

   setcolor(LIGHTGREEN);

   for (clk2=0;clk2<512;clk2++)                             //Вывод графика

     lineto (stepx*clk2/2+del,delta-stepy*uolsh[clk2]);     //функции Уолша

   setcolor(WHITE);

   outtextxy (100,0,"График функции Уолша");

   outtextxy(100,10,"Нажмите любую клавишу для продолжения");

   getch();

   initgraph(&gdriver, &gmode, "");

   line (del,0,del,479);                         //Рисование осей координат

   line (0,delta,639,delta);

   outtextxy(0,delta+20,"0");                    //Вывод обозначений осей

   outtextxy(33,0,"Y");

   outtextxy(500,delta+20,"номер значения");

   moveto(del,delta-arr[1]*stepy);

   setcolor(LIGHTBLUE);

   for (clk2=0;clk2<256;clk2++)                             //Вывод графика

     lineto (stepx*clk2+del,delta-stepy*arr[clk2]);         //сигнала

   moveto(del,delta-uolsh[1]*stepy);

   setcolor(LIGHTGREEN);

   for (clk2=0;clk2<512;clk2++)                             //Вывод графика

     lineto (stepx*clk2/2+del,delta-stepy*uolsh[clk2]);     //функции Уолша

   setcolor(WHITE);

   for (clk2=1;clk2<9;clk2++) {

     line (32*clk2*stepx+del,delta,32*clk2*stepx+del,delta+5);

     itoa (32*clk2,ch,10);                              //Нанесение разметки

     outtextxy(32*clk2*stepx+del,delta+10,ch);                 // на ось x

   }

   to_int=max()/4;

   for (clk2=-3;clk2<4;clk2++) {                       //Нанесение разметки

     if (clk2!=0) {

       line (del,delta-stepy*to_int*clk2,del-5,delta-stepy*to_int*clk2);

       itoa (to_int*clk2,ch,10);

       outtextxy(0,delta-stepy*to_int*clk2,ch);                 //на ось y

     }

   }

   outtextxy(100,0,"Нажмите любую клавишу для продолжения");

   getch ();

   closegraph();

   printf("Следующий кадр :n");

 }

 clrscr ();

 fclose (f);

 fclose (out);

}

3 Контрольный пример

Файл out.dat:

125 164

206 250

207 77

-15 -71

-20 138

129 -51

-141 -140

-79 42

37 -95

-125 -51

-58 -150

-152 -62

-42 -92

-76 6

-17 -147

-212 -212

-167 -75

28 142

167 101

31 -44

-25 89

68 -89

-142 -90

-75 -99

-135 -184

-212 -218

-159 -33

-12 -98

-148 -163

-130 -48

52 170

192 118

64 32

-42 -156

-134 26

27 -135

-131 39

131 147

70 -102

-199 -222

-128 84

98 -88

-161 -120

-12 162

223 169

117 67

-18 -138

-133 -3

18 -72

-124 -138

-155 -175

-83 121

144 -15

-35 86

94 -12

-100 -168

-113 65

109 17

14 101

157 181

159 89

101 197

143 -63

-163 -156

-61 122

152 27

20 134

99 -86

-186 -200

-192 -158

-151 -171

-142 -64

-23 -17

-37 -83

-86 -46

-62 -134

-70 131

215 181

170 184

120 -23

-100 -111




2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.