Аппаратно программные средства цифровой обработки сигналов ГУК guk / Гук лаб 3
.docxГосударственный университет телекоммуникаций им. проф. М. А. Бонч-Бруевича
кафедра «Цифровой обработки сигналов»
Лабораторная работа № 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 год