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

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

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

Разработал студент группы 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 ("Среднее значение амплитуды сигнала в кадре равно %f\n",

                                      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("Ошибка инициализации графики: %s\n",

     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

-82 -10 

2 -46 

-58 -34 

-53 -118 

-71 90 

143 87 

58 59 

12 -85 

-60 88 

152 131 

152 216 

170 14 

-54 -33 

50 195 

174 -16 

-134 -181 

-180 -129 

-78 -28 

36 113 

144 128 

45 -103 

-71 141 

171 17 

-26 42 

10 -124 

-84 132 

243 247 

136 -92 

-137 5 

53 5 

-14 -2 

14 34 

30 -1 

-8 11 

76 187 

140 -68 

-103 37 

75 9 

-25 -27 

29 143 

149 47 

-23 -61 

-115 -185 

-171 -70 

16 88 

153 213 

140 -67 

-93 63 

57 -113 

-203 -213 

-180 -103 

-8 104 

85 -69 

-156 -176 

-188 -190 

-181 -157 

-102 -16 

60 126 

185 237 

183 21 

1 125 

108 -52 

-50 114 

211 240 

223 157 

147 194 

180 104 

22 -66 

-51 70 

162 226 

262 270 

192 26 

-45 -20 

-62 -172 

-206 -162 

-73 61 

47 -117 

-115 53 

97 14 

-45 -80 

-74 -26 

-49 -146 

-170 -120 

-23 120 

205 232 

228 192 

168 156 

64 -109 

-186 -165 

-126 -70 

-46 -55 

5 135 

180 136 

128 157 

124 26 

37 157 

145 -1 

-19 93 

130 92 

-3 -155 

-202 -143 

-129 -162 

-112 22 

67 21 

0 5 

48 128 

81 -95 

-74 148 

167 -17 

-92 -58 

-88 -184 

-151 11 

42 -58 

-125 -159 

-178 -184 

-96 86 

194 228 

136 -85 

-169 -115 

-74 -45 

-38 -55 

-15 83 

139 153 

132 76 

89 173 

116 -83 

-131 -25 

13 -19 

-29 -16 

-17 -33 

-54 -80 

-92 -87 

-59 -9 

17 17 

8 -11 

-63 -149 

-80 144 

147 -71 

-191 -211 

-116 96 

146 33 

-56 -120 

-151 -147 

-105 -27 

11 8 

33 89 

77 -3 

-90 -184 

-149 17 

106 118 

94 33 

-9 -31 

-82 -162 

-174 -118 

-54 16 

19 -49 

-47 25 

22 -56 

-27 110 

98 -64 

-108 -30 

-43 -147 

-82 152 

192 35 

-5 74 

95 55 

5 -56 

-87 -89 

-123 -189 

-104 132 

232 194 

190 221 

145 -39 

-80 24 

-45 -155 

-173 -97 

-60 -62 

-10 100 

75 -87 

-122 -30 

-20 -96 

-51 117 

138 10 

-92 -170 

-209 -209 

-145 -15 

82 146 

122 8 

-6 84 

73 -40 

-61 12 

-24 -171 

-228 -193 

-169 -155 

-59 121 

220 239 

175 27 

-96 -194 

-213 -153 

-91 -27 

49 137 

181 181 

153 97 

79 99 

90 49 

72 160 

133 -11 

-76 -62 

-14 68 

30 -128 

-174 -105 

2 147 

224 232 

237 239 

236 224 

203 173 

133 83 

19 -60 

-35 95 

106 -5 

-84 -132 

-142 -114 

-61 15 

82 139 

182 210 

162 36 

33 157 

163 50 

-63 -176 

-216 -181 

-147 -114 

-20 134 

198 170 

71 -97 

-164 -128 

-88 -44 

-75 -184 

-170 -31 

67 123 

70 -92 

-155 -117 

-126 -184 

-212 -209 

-193 -165 

-54 141 

239 239 

199 116 

39 -33 

-1 137 

184 138 

116 120 

34 -143 

-165 -31 

23 -5 

29 127 

185 203 

196 162 

86 -32 

-20 122 

115 -42 

-134 -160 

-169 -159 

-62 124 

161 49 

-23 -57 

-86 -112 

-142 -178 

-154 -70 

-34 -46 

-89 -162 

-129 11 

65 31 

44 106 

126 102 

36 -73 

-78 24 

5 -136 

-95 129 

161 -1 

-50 14 

37 16 

0 -10 

-70 -180 

-194 -110 

-101 -168 

-119 47 

108 62 

27 3 

-65 -175 

-170 -46 

23 37 

13 -51 

-96 -123 

-126 -104 

-42 58 

39 -102 

-122 -20 

4 -54 

-95 -119 

-147 -179 

-179 -145 

-109 -72 

-6 89 

109 51 

44 88 

127 161 

84 -108 

-153 -50 

59 174 

224 208 

205 219 

110 -122 

-181 -63 

26 86 

27 -153 

-148 42 

75 -50 

-86 -32 

23 77 

132 187 

112 -94 

-104 82 

103 -41 

-62 42 

71 24 

15 47 

39 -11 

-17 21 

94 200 

142 -83 

-126 16 

49 -27 

-54 -30 

5 53 

70 54 

30 -2 

21 103 

129 99 

39 -51 

-12 158 

235 219 

154 38 

-12 5 

64 164 

153 28 

-56 -100 

-41 121 

105 -93 

-100 85 

110 -28 

-37 83 

151 166 

115 -3 

-98 -168 

-146 -30 

-13 -97 

-46 144 

244 256 

257 246 

127 -99 

-129 39 

143 182 

125 -29 

-72 -2 

-17 -117 

-135 -71 

-61 -107 

-67 59 

108 78 

16 -78 

-38 138 

134 -52 

-158 -184 

-179 -143 

-118 -104 

-110 -136 

-123 -69 

-42 -44 

-3 82 

127 131 

142 158 

83 -85 

-66 144 

130 -110 

-206 -156 

-132 -134 

-111 -61 

17 123 

122 10 

-70 -119 

-126 -89 

-25 65 

71 -9 

-30 9 

72 158 

151 51 

35 105 

118 72 

36 8 

-63 -179 

-126 96 

199 181 

121 19 

-46 -74 

-71 -37

6 59 

83 76 

58 30 

-44 -164 

-219 -207 

-145 -31 

16 -6 

-13 -5 

-18 -55 

-100 -152 

-128 -24 

-24 -129 

-170 -144 

-126 -116 

-99 -77 

-66 -69 

-15 97 

153 149 

76 -66 

-155 -189 

-148 -28 

-20 -124

-141 -69 

31 159 

-32 59 

41 -89 

-142 -116 

-54 46 

87 69 

27 -38 

-40 24 

94 171 

95 -137 

-224 -165 

-105 -43 

32 121 

83 -83 

-131 -59 

-29 -42 

-40 -20 

21 83 

94 51 

22 8 

-38 -116 

-67 111 

161 82 

-18 -138 

-196 -190 

-135 -30 

-39 -163 

-178 -82 

30 158 

183 103 

-7 -149 

-155 -25 

-1 -85 

-37 145 

154 -11 

-67 -12 

-25 -109 

-83 53 

73 -27 

-118 -202 

-240 -230 

-225 -224 

-181 -95 

-61 -79 

-45 45 

55 -15 

-45 -35 

-37 -54 

-46 -10 

50 135 

134 45 

38 116 

89 -44 

-90 -48 

-53 -107 

-69 63 

92 18 

-63 -151 

-162 -93 

-31 25 

17 -55 

-32 88 

124 73 

89 173 

117 -82 

-83 115 

179 109 

31 -57 

-35 99 

113 6 

-68 -108 

-47 115 

209 235 

196 92 

63 109 

133 132 

73 -44 

-29 119 

153 72 

22 4 

23 83 

54 -66 

-32 156 

189 66 

31 87 

88 33 

-58 -184 

-235 -211 

-109 72 

70 -118 

-215 -223 

-203 -155

-47 119 

214 238 

202 104 

31 -17 

-66 -117 

-57 117 

173 111 

40 -40 

-115 -184 

-148 -6 

109 199 

141 -66 

-141 -83 

-45 -27 

23 104 

101 13 

30 156 

119 -82 

-150 -84 

-91 -173 

-135 23 

55 -39 

-21 111 

83 -108 

-110 78 

69 -139 

-174 -36 

61 116 

54 -128 

-204 -174 

-103 9 

55 33 

9 -17 

-29 -24 

-55 -124 

-82 73 

176 226 

236 202 

79 -135 

-195 -101 

-33 7 

59 123 

104 2 

-24 26 

80 136 

160 152 

127 87





 

57 39 

7 -39 

-30 34 

-13 -171 

-154 40 

89 -9 

-93 -164 

-200 -202 

-204 -208 

-219 -238 

-207 -124 

-64 -27 

-53 -143 

-88 114 

137 -19 

-90 -74 

-88 -134 

-144 -117 

-99 -91 

-20 114 

79 -129 

-199 -131 



-85 -60 

-19 37 

15 -87 

-46 138 

202 144 

67 -27 

-33 51 

87 75 

81 108 

49 -98 

-89 79 

63 -137 

-157 4 

113 169 

139 22 

-87 -187 

-209 -151 

-30 154 

247 249 

218 151 

48 -90 

-143 -109 



-95 -102 

-29 126 

148 35 

-49 -103 

-110 -70 

-50 -50 

-22 33 

58 50 

26 -16 

-47 -68 

-24 86 

112 54 

32 50 

-16 -166 

-173 -35 

39 49 

63 81 

7 -160 

-163 -1 

118 194 

168 36 

25 135 



139 36 

50 182 

149 -53

-150 -140 

-152 -187 

-101 107 

139 -7 

-57 -9 

37 80 

87 56 

-13 -120 

-149 -97 

-16 95 

167 201 

215 209 

124 -40 

-124 -130 

-60 88 

118 30 

1 33 

82 146 

79 -123 



-188 -114 

-43 27 

98 170 

206 203 

165 93 

-19 -173 

-249 -245 

-211 -147 

-130 -160 

-141 -71 

-72 -146 

-110 38 

83 25 

48 153 

164 79 

32 24 

39 78 

16 -148 

-187 -101 

-15 69 

70 -13 

-43 -17 

13 47 

84 125 

164 200 

222 230 

238 248 

180 34 

30 168 







После своей загрузки программа выдала следующую информацию:

Среднее значение амплитуды сигнала в кадре равно -20.375000

Удаляем постоянную составляющую...

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

Нажмите любую клавишу









Графики строились 3 раза т.к. на одном экране уменьшается 256 кадров.



4 Описание работы программы

Данная программа осуществляет разложения сигнала в базисе Уолша.

Разработанная программа выполняет следующие функции:

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

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

3) вычислить среднее арифметическое по формуле ;

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

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

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

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

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

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

Разложение по системе функций Уолша осуществляется следующем способом:

Пусть необходимо апроксимировать сигнал треугольной формы.



Рис.1.

На рис.1 изображены сигнал треугольной формы и этот же сигнал , разложенный по системе функций Уолша.

На отрезке времени [-T/2,T/2] разлагаемый сигнал описывается функцией s(t) = U(t/T+1/2)  (1).

Вычисляем коэффициенты обобщённого ряда Фурье:

   (2)

  (3)

При аппроксимации колебания треугольной формы двумя первыми членами ряда по системе функций Уолша получается приближённое представление ступенчатой формы.

Заключение

В курсовой работе решена задача разработки программы для разложения сигнала в базисе Уолша.

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

Список литературы

1. Бьярн Страуструп. Язык программирования С++.в двух частях.  Пер. с англ. Киев:   "ДиаСофт" , 1993.-296 с.,ил.

2 . Корриган Джон : С++ основы программирования: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил.