Реферат: Разложение сигнала в базисе Уолша
Название: Разложение сигнала в базисе Уолша Раздел: Рефераты по информатике Тип: реферат | ||||||||||||||||
Разложение сигнала в базисе Уолша Пояснительная записка к курсовой работе по дисциплине "Прикладное программирование" Разработал студент группы 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:
После своей загрузки программа выдала следующую информацию: Среднее значение амплитуды сигнала в кадре равно -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). Вычисляем коэффициенты обобщённого ряда Фурье:
При аппроксимации колебания треугольной формы двумя первыми членами ряда по системе функций Уолша получается приближённое представление ступенчатой формы. Заключение В курсовой работе решена задача разработки программы для разложения сигнала в базисе Уолша. Разработан алгоритм решения поставленной задачи , составлена и отлажена программа на языке С++ , реализующая указанный алгоритм. С её помощью проведено тестирование прогрвммы , проанализированы полученные результаты. Анализ результатов показал , что поставленная задача успешно решена. Список литературы 1. Бьярн Страуструп. Язык программирования С++.в двух частях. Пер. с англ. Киев: "ДиаСофт" , 1993.-296 с.,ил. 2 . Корриган Джон : С++ основы программирования: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил. |