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

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

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

Разработал студент группы 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 с., ил.

Для подготовки данной применялись материалы сети Интернет из общего доступа