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

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