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