Скачиваний:
18
Добавлен:
15.03.2015
Размер:
183.95 Кб
Скачать

Государственный университет телекоммуникаций им. проф. М. А. Бонч-Бруевича

кафедра «Цифровой обработки сигналов»

Лабораторная работа № 3

«Программная реализация на языке С++

файловой модели KИХ фильтра»

3 Вариант

Выполнил студент группы р-714м Труфанов В. И.

Проверил доцент кафедры ЦОС __________ И. И. Гук

Цель работы:

Реализовать в рамках файловой модели программный код KИХ фильтра

согласно заданного варианта.

Дано:

В качестве исходных данных необходимо использовать результат, полученный в

лабораторной работе № 1. Входной сигнал представляет собой единичный

импульс амплитудой 1024 единиц, сформированный в программе EDSW.

Результат работы фильтра должен находиться в выходном файле. Входные и

выходные отсчеты – это 16-ти разрядные целые числа.

Синтез фильтра

Коэффициенты синтезированного КИХ фильтра

b0

b1

b2

b3

b4

b5

b6

b7

b8

6.2865-002

0

-2.9817-001

0

3.7830-001

0

-2.9817-001

0

6.2865-002

221

0

-1047

0

1328

0

-1047

0

221

m=8.5737-001 M=2^12=4096.

Разработка программного кода фильтра

1. Основные требования файловой модели

Файловая модель – это стиль программирования, который подразумевает:

- Наличие одного заголовочного файла на проект.

- Разбиение алгоритма на функции.

- Размещение каждой функции в отдельном файле.

- Создание всех глобальных переменных в отдельном файле.

- Передача параметров между функциями через контекстную структуру.

- Функция main() выполняет только считывание/запись данных и вызов

интерфейсных функций проекта, и не содержит программного кода,

соответствующего разрабатываемому алгоритму.

- Размещение входных и выходных данных в соответствующих файлах.

- Запрет на использования статических переменных. При

необходимости такие переменные заменяются глобальными.

- Запрет на создание переменных, констант, функций и т.д. в

заголовочном файле проекта.

2. Блок схемы для всех функций разрабатываемого алгоритма

Алгоритмы функций main() и runKIX() идентичены и приведены во 2 лабораторной работе.

Алгоритмы функций initKIX() и cnvKIX() приведены на рис.1.

Рис.1. Алгоритмы функций initKIX() и cnvKIX().

3. Листинги всех файлов

Листинг файла prjKIX.h

#include <stdio.h>

#define SAZEBUFF 120

#define MASHTAB 12

#define NAMBERCOEFF 9

typedef int word32;

typedef short word16;

typedef char word8;

typedef struct

{

word16 *pInpBuff;

word16 *pOutBuff;

word16 lenBuff;

word32 constA;

word16* pCoeff;

word16* pShift;

word16 namberCoeff;

}

CONTEXKIX;

void initKIX(CONTEXKIX* pCntx);

void runKIX(CONTEXKIX* pCntx);

word16 cnvKIX(word16* pCotff, word16* pShift, word16 namberCoeff, word32 constA);

extern CONTEXKIX* pCntx;

extern CONTEXKIX cntx;

extern word16 inpBuff[];

extern word16 outBuff[];

extern word16 coeffBuff[];

extern word16 shiftBuff[];

Листинг файла constantrj.cpp

#include "prjKIX.h"

CONTEXKIX* pCntx;

CONTEXKIX cntx;

word16 inpBuff[SAZEBUFF];

word16 outBuff[SAZEBUFF];

word16 coeffBuff[] = {221,0,-1047,0,1328,0,-1047,0,221};

word16 shiftBuff[NAMBERCOEFF];

Листинг функции initKIX()

#include "prjKIX.h"

void initKIX(CONTEXKIX* pCntx)

{

word32 count;

pCntx->pInpBuff = inpBuff;

pCntx->pOutBuff = outBuff;

pCntx->lenBuff = SAZEBUFF;

pCntx->constA = MASHTAB;

pCntx->pCoeff = coeffBuff;

pCntx->pShift = shiftBuff;

pCntx->namberCoeff = NAMBERCOEFF;

for(count = 0; count < SAZEBUFF; count++) pCntx->pInpBuff[count] = 0;

for(count = 0; count < NAMBERCOEFF; count++) pCntx->pShift[count] = 0;

}

Листинг функции runKIX()

#include "prjKIX.h"

void runKIX(CONTEXKIX*pCntx)

{

word16 *pInpBuff;

word16 *pOutBuff;

word16 lenBuff;

word32 constA;

word32 count;

word16 coeff;

word16* pCoeff;

word16* pShift;

word16 namberCoeff;

pInpBuff = pCntx->pInpBuff;

pOutBuff = pCntx->pOutBuff;

lenBuff = pCntx->lenBuff;

constA = pCntx->constA;

pCoeff = pCntx->pCoeff;

pShift = pCntx->pShift;

namberCoeff = pCntx->namberCoeff;

for(count = 0; count < lenBuff; count++)

{

coeff = *pInpBuff++;

*pShift = coeff;

coeff = cnvKIX(pCoeff, pShift, namberCoeff, constA);

*pOutBuff++ = coeff;

}

}

Листинг функции main()

#include "prjKIX.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;

initKIX(pCntx);

len = SAZEBUFF;

while(len == SAZEBUFF)

{

len = fread(pCntx->pInpBuff,sizeof(word16),SAZEBUFF,pInpFile);

runKIX(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;

}

Экспериментальная проверка работы программного кода фильтра

b0

b1

b2

b3

b4

b5

b6

b7

b8

Рассчитанные

221

0

-1047

0

1328

0

-1047

0

221

Реальные

221

0

-1047

0

1328

0

-1047

0

221

Отношение

1

1

1

1

1

Графики с расчетной и реальной АЧХ представлены на рис.2 и рис.3.

Рис.2 График с рассчитанной АЧХ КИХ-фильтра.

Рис.2 График с реальной АЧХ КИХ-фильтра.

Выводы по проделанной работе

Синтезирован Полосовой фильтр восьмого порядка с конечной импульсной характеристикой (КИХ). Длина ИХ (количество коэффициентов) N нечетная, импульсная характеристика симметричная.

Обладает тремя принципиально важными с практической точки зрения свойствами:

а) абсолютно устойчив;

б) коэффициенты разностного уравнения (передаточной функции) представляют собой отсчеты импульсной характеристики.

в) обладает линейной ФЧХ.

Расчетные и реальные результаты совпадают. Графики АЧХ имеют общий вид с небольшими расхождениями.

2012 год