Аппаратно программные средства цифровой обработки сигналов ГУК guk / Гук лаб 2
.docxСанкт-Петербургский Государственный университет телекоммуникаций
им. проф. М. А. Бонч-Бруевича
Лабораторная работа №1
«Программная реализация файловой модели
на языке С»
12 Вариант
Выполнил студент группы Р-25М Снопков Ст. И.
Проверил доцент кафедры ЦОС __________ И. И. Гук
Цель работы:
Изучить основные правила реализации программного кода в рамках файловой
модели, закрепить знания языка программирования С++, реализовать
программный код простейшей программы.
Дано:
Необходимо реализовать программный код алгоритма масштабирования входных
отсчетов. Входные отсчеты представлены в виде входного файла. Выходные –
должны находиться в выходном файле. Входные и выходные отсчеты – это 16-ти
разрядные целые числа.
Разработка алгоритма для простейшего выражения (рис.1)
Рис.1. Алгоритм простейшей программы.
Распределение процедуры обработки по функциям
1. Функция main(). Выполняет вызов функции инициализации алгоритма, открытие
входного и выходного файлов, создание контекстной структуры, содержащей все
переменные данного алгоритма, создание и инициализацию указателя на контекстную
структуру, инициализацию организацию цикла считывания и записи данных во
входной и выходной файлы, где кроме этого вызывается функция обработки входного
буфера, и в конце – выполняет корректный выход из процедуры обработки (закрытие
входного и выходного файлов). Соответствует рис. 1.
2. Функция инициализации начального состояния. Выполняет инициализацию
контекстной структуры.
3. Функция запуска процедуры обработки. Выполняет обработку входного буфера и
формирование выходного буфера (рис .2).
Начало
Инициализация начального состояния
Обработка данных из вх. буфера и запись результата в вых. буфер
Конец
Рис. 2 Функция запуска процедуры обработки.
Разработка программного кода
Файл с функцией запуска процедуры обработки.
#include "prjMPY.h"
Void runMPY(CONTEXMPY*pCntx)
{
word16 *pInpBuff;
word16 *pOutBuff;
word16 lenBuff;
word32 constA;
word32 count;
word16 coeff;
pInpBuff = pCntx->pInpBuff;
pOutBuff = pCntx->pOutBuff;
lenBuff = pCntx->lenBuff;
constA = pCntx->constA;
for(count = 0; count <lenBuff; count++)
{
coeff = *pInpBuff++;
coeff *= constA;
*pOutBuff++ = coeff;
}
}
Файл main.cpp. Содержит функцию main().
#include "prjMPY.h"
int main(void)
{
FILE *pInpFile;
FILE *pOutFile;
word32 len;
printf("START PROGRAMS!\n");
pInpFile = fopen("Inp.dat","rb");
if(pInpFile == NULL)
{
printf("ERROR, INPUT FILE!\n");
printf("\nPress ENTER to stop... \n");
getchar();
return 2;
}
printf("OPEN INPUT FILE SUCSESFUL!\n");
pOutFile = fopen("out.dat","wb");
if(pOutFile == NULL)
{
printf("ERROR, OUT FILE\n");
printf("\nPress ENTER to stop... \n");
getchar();
return 1;
}
printf("GREAT OUTPUT FILE SUCSESFUL!\n");
pCntx = &cntx;
initMPY(pCntx);
len = SAZEBUFF;
while(len == SAZEBUFF)
{
len = fread(pCntx->pInpBuff,sizeof(word16),SAZEBUFF,pInpFile);
runMPY(pCntx);
fwrite(pCntx->pOutBuff, sizeof(word16), len, pOutFile);
}
printf("STOP PROGRAMS!\n");
printf("\nPress ENTER to stop... \n");
getchar();
fclose(pInpFile);
fclose(pOutFile);
return 0;
}
Файл с функцией начальной инициализации.
#include "prjMPY.h"
Void initMPY(CONTEXMPY* pCntx)
{
pCntx->pInpBuff = inpBuff;
pCntx->pOutBuff = outBuff;
pCntx->lenBuff = SAZEBUFF;
pCntx->constA = MASHTAB;
}
Файл, в котором создаются все константы, массивы, контекстные структуры,
которые являются глобальными для данного проекта.
#include "prjMPY.h"
CONTEXMPY* pCntx;
CONTEXMPY cntx;
word16 inpBuff[SAZEBUFF];
word16 outBuff[SAZEBUFF];
Заголовочный файл, содержащий объявление всех функций, констант,
контекстных структур, массивов, а так же необходимые макросы.
#include <stdio.h>
#define SAZEBUFF 120
#define MASHTAB 5
typedefint word32;
typedef short word16;
typedef char word8;
typedefstruct
{
word16 *pInpBuff;
word16 *pOutBuff;
word16 lenBuff;
word32 constA;
}
CONTEXMPY;
voidinitMPY(CONTEXMPY* pCntx);
voidrunMPY(CONTEXMPY* pCntx);
extern CONTEXMPY* pCntx;
extern CONTEXMPY cntx;
extern word16 inpBuff[];
extern word16 outBuff[];
Отладка программного кода
Рис.3. Анализ результатов выполнения программы в Matlab.
Открыв входной и выходной файлы (int.dat и out.dat) в программе Matlab можно убедиться в корректной работе разработанного кода (рис. 3) — масштабирование входного сигнала в 5 раз.
Выводы по проделанной работе
Набран программный код алгоритма масштабирования входных отсчетов среде программирования wvDev-C++. Входные отсчеты представлены в виде входного файла (сгенерирован синусоидальный сигнал в программе Matlab). Входные и выходные отсчеты – это 16-ти разрядные целые числа. Программа запущена на выполнение и работает корректно, при этом результат работы контролируется программой Matlab.Изучены основные правила реализации программного кода в рамках файловой модели, закреплены знания языка программирования С.
Санкт-Петербург
2013 год