Разложение сигнала в базисе Уолша
Пояснительная записка к курсовой работе по дисциплине "Прикладное программирование"
Разработал студент группы 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 с., ил.
|