Автор работы: Пользователь скрыл имя, 20 Декабря 2011 в 02:32, курсовая работа
Цель работы: Синтезировать полученные знания и реализовать программный код фильтра с бесконечной импульсной характеристикой для цифрового сигнального процессора компании Texas Instrument (TI) семейства TMS320C6000.
word16 *pShiftB2; //Указатель на буфер задержки
word16 *pShiftA3; //Указатель на буфер задержки
word16 *pShiftB3; //Указатель на буфер задержки
word16 namberCoeff; //Порядок фильтра
//Инициализация локальных переменных
pInpBuff = pCntx -> pInpBuff; //Указатель на входной буфер
pOutBuff = pCntx -> pOutBuff; //Указатель на выходной буфер
lenBuff = pCntx -> lenBuff; //Размер входного и выходного буферов
constA = pCntx -> constA; //Маштабирующий коэффициент
pCoeffA1 = pCntx -> pCoeffA1; //Указатель на буфер коэффициентов фильтра
pCoeffB1 = pCntx -> pCoeffB1; //Указатель на буфер коэффициентов фильтра
pCoeffA2 = pCntx -> pCoeffA2; //Указатель на буфер коэффициентов фильтра
pCoeffB2 = pCntx -> pCoeffB2; //Указатель на буфер коэффициентов фильтра
pCoeffA3 = pCntx -> pCoeffA3; //Указатель на буфер коэффициентов фильтра
pCoeffB3 = pCntx -> pCoeffB3; //Указатель на буфер коэффициентов фильтра
pShiftA1 = pCntx -> pShiftA1; //Указатель на буфер задержки
pShiftB1 = pCntx -> pShiftB1; //Указатель на буфер задержки
pShiftA2 = pCntx -> pShiftA2; //Указатель на буфер задержки
pShiftB2 = pCntx -> pShiftB2; //Указатель на буфер задержки
pShiftA3 = pCntx -> pShiftA3; //Указатель на буфер задержки
pShiftB3 = pCntx -> pShiftB3; //Указатель на буфер задержки
namberCoeff = pCntx -> namberCoeff; //Порядок фильтра
//Цикл обработки и записи
for(count = 0; count < lenBuff; count++)
{
//Чтение текущего отсчёта
coeff = *pInpBuff++;
//Запись текущего отсчёта в нулевую ячейку линии задержки
//*pShift = coeff;
//Вычисление выходного
pShiftB1[0] = coeff;
coeff = cnvBIX(pCoeffB1, pShiftB1, namberCoeff, constA);
coeff += cnvBIX(pCoeffA1, pShiftA1, namberCoeff, constA);
pShiftA1[1] = coeff;
pShiftB2[0] = coeff;
coeff = cnvBIX(pCoeffB2, pShiftB2, namberCoeff, constA);
coeff += cnvBIX(pCoeffA2, pShiftA2, namberCoeff, constA);
pShiftA2[1] = coeff;
pShiftB3[0] = coeff;
coeff = cnvBIX(pCoeffB3, pShiftB3, namberCoeff, constA);
coeff += cnvBIX(pCoeffA3, pShiftA3, namberCoeff, constA);
pShiftA3[1] = coeff;
//Запись текущего отсчёта
*pOutBuff++ = coeff;
}
}
Функция cnvBIX
#include "prjBIX.h"
word16 cnvBIX(word16* pCoeff,word16* pShift,word16 namberCoeff, word32 constA)
{
word16 coeffX;
word16 coeffB;
word32 count;
word32 coeff;
word32 rezult;
//Корректировка значения
namberCoeff--;
//Установка указателей на конец буферов отсчетов и коэффициентов
pShift+=namberCoeff;
pCoeff+=namberCoeff;
//Чтение текущего отсчета
coeffX=*pShift--;
//Чтение соответствующего коэффициента фильтра
coeffB=*pCoeff--;
//Инициализации начального значения результата
rezult=coeffX*coeffB;
for(count = 0; count<namberCoeff;count++)
{
//Чтение текущего отсчета
coeffX = *pShift--;
//Запись текущего отсчета в следующую ячейку
pShift[2]=coeffX;
//Чтение соответствующего коэффициента фильтра
coeffB = *pCoeff--;
//Умножение отсчета на коэффициент
coeff = coeffX * coeffB;
//Накопление результата
rezult += coeff;
}
//Нормирование результата суммирования
// rezult >>= constA;
if(rezult > 0) {
rezult >>= constA;
}
else {
rezult = -rezult;
rezult >>= constA;
rezult = -rezult;
}
//Выход из функции
return rezult;
}
Заголовочный файл prjBIX.h:
//Определение макросов
#define SAZEBUFF 120 //Размер входного и выходного буферов
#define MASHTAB 10 //Маштабирующий коэффициент
#define NAMBERCOEFF 3//порядок
фильтра
//Определение оригинальных имен стандартных типов
typedef int word32;
typedef short word16;
typedef char word8;
//Объявление типа контекстной структуры
typedef struct
{
word16 *pInpBuff; //Указатель на входной буфер
word16 *pOutBuff; //Указатель на выходной буфер
word16 lenBuff; //Размер входного и выходного буферов
word32 constA; //Маштабирующий коэффициент
word16 *pCoeffA1; //Указатель на буфер коэфф. фильтра
word16 *pCoeffB1; // Указатель на буфер коэфф. фильтра
word16 *pCoeffA2; // Указатель на буфер коэфф. фильтра
word16 *pCoeffB2; // Указатель на буфер коэфф. фильтра
word16 *pCoeffA3; // Указатель на буфер коэфф. фильтра
word16 *pCoeffB3; // Указатель на буфер коэфф. фильтра
word16 *pShiftA1; // Указатель на буфер задержки
word16 *pShiftB1; // Указатель на буфер задержки
word16 *pShiftA2; // Указатель на буфер задержки
word16 *pShiftB2; // Указатель на буфер задержки
word16 *pShiftA3; // Указатель на буфер задержки
word16 *pShiftB3; // Указатель на буфер задержки
word16 namberCoeff; //Порядок фильтра
} CONTEXMPY;
//Объявление функций проекта
void initBIX(CONTEXMPY* pCntx);
void runBIX(CONTEXMPY* pCntx);
word16 cnvBIX(word16 *pCoeff,
word16 *pShift, word16 namberCoeff, word32 constA);
//Объявление переменных, массивов и т.д.
extern CONTEXMPY* pCntx; //Указатель на контекстную структуру
extern CONTEXMPY cntx; //Контекстная структура
extern word16 inpBuff[]; //Массив входных данных
extern word16 outBuff[];
//Массив выходных данных
extern word16 coeffBuffA1[]; //Massiv for inp data
extern word16 coeffBuffB1[];
//Massiv for inp data
extern word16 coeffBuffA2[]; //Massiv for inp data
extern word16 coeffBuffB2[];
//Massiv for inp data
extern word16 coeffBuffA3[]; //Massiv for inp data
extern word16 coeffBuffB3[];
//Massiv for inp data
extern word16 shiftBuffA1[]; // //Massiv for out data
extern word16 shiftBuffB1[];
// //Massiv for out data
extern word16 shiftBuffA2[]; // //Massiv for out data
extern word16 shiftBuffB2[];
// //Massiv for out data
extern word16 shiftBuffA3[]; // //Massiv for out data
extern word16 shiftBuffB3[];
// //Massiv for out data
Для реализации проекта в CCS необходимо в CCS создать проект, в который перенести файлы из проекта созданного в DevCPP— «main.cpp», «cnvBIX.cpp», «runBIX.cpp», «initBIX.cpp», «constant.cpp» и «prjBIX.h». При создании кода для цифровых сигнальных процессоров (ЦСП) необходимо распределить память процессора. В семейства TMS320C6000 для этого существует так называемый механизм секций: все функции и данные размещаются в поименованных секциях, а сами секции размещаются в различных областях памяти. Существует стандартный набор секций, который должен быть определен всегда. Однако можно назначить дополнительные секции и разместить в них код функций и данные разработанного алгоритма. Реализуется данный механизм при помощи файла «standard.cmd». В лабораторной работе используется стандартное распределение памяти и стандартный набор секций для режима симуляции (то есть при использовании программной модели процессора). В блоке MEMORY указаны имена областей памяти, их начальный адрес и длина. В блоке SECTIONS – имена секций и область памяти, где они расположены. Файл «prjBIX.h» к проекту не подключается. В этом нет необходимости, так как в CCS подключение заголовочных файлов, которые в файлах проекта указаны директивой «#include», происходит автоматически. И последний файл, который подключается к проекту — это файл библиотеки «rts6400.lib». Этот файл необходим для того, что бы CCS смог корректно преобразовать С++ кода к бинарному виду для выбранного типа сигнального процессора.
Для создания нового проекта в среде CCS необходимо в главном меню программы выбрать пункт «Project->New...». Появиться окно «Project Creation», где задаються основные параметры проекта. В начале в поле «Location» определяется место расположения папки проекта, как отмечалось в предыдущих работах, желательно выбрать место на FLASH-накопителе студента. Затем определяется имя проекта в поле «Project Name». В рассматриваем примере — это «prjBIX_CCS». Проверить, что бы параметры в полях «Project Type» и «Target». Обычно их менять не требуется. Обратить внимание, что в случае использования CCS нет необходимости предварительно, до создания проекта, создавать папку для его хранения. При определении имени проекта папка создается автоматически. Для завершения создания проекта нажмите кнопку «Finish». Вид CCS после создания проекта.
При создании кода для цифровых сигнальных процессоров (ЦСП) необходимо распределить память процессора. В семейства TMS320C6000 для этого существует так называемый механизм секций: все функции и данные размещаются в поименованных секциях, а сами секции размещаются в различных областях памяти. Существует стандартный набор секций, который должен быть определен всегда. Однако можно назначить дополнительные секции и разместить в них код функций и данные разработанного алгоритма. Реализуется данный механизм при помощи файла «standard.cmd». В лабораторной работе используется стандартное распределение памяти и стандартный набор секций для режима симуляции (то есть при использовании программной модели процессора). Для рассматриваемого примера файл «standard.cmd» можно создать следующим образом. В главном меню CCS выбрать пункт «File->New->Source File».
standard.cmd:
MEMORY
{
IPRAM : origin = 0x0, len = 0x10000
IDRAM : origin = 0x80000000, len = 0x300000
}
SECTIONS
{
.text > IPRAM
.switch > IPRAM
.bss > IPRAM
.cinit > IPRAM
.const > IPRAM
.far > IPRAM
.stack > IPRAM
.cio > IPRAM
.sysmem > IPRAM
}
Затем необходимо подключить к проекту созданный файл. Это можно сделать через главное меню CCS выбрав пункт «Project->Add Files to Project. Появиться окно «Add Files to Project». Здесь в поле «Папка» необходимо выбрать папку, где расположен проект. В поле «Тип файла» выбрать из выпадающего списка позицию «Linker Command File (*.cmd, *.lcf)». В поле выбора файлов должен остаться только файл «standard». Щелкаем на нем мышкой. Имя выбранного файла должно появиться в поле «Имя файла». Затем нажимаем кнопку «Открыть». Все, файл подключен к проекту. Аналогичным образом подключают файлы «main.cpp», «cnvBIX.cpp», «runBIX.cpp»,«initBIX.cpp», «constant.cpp». При этом в поле «Тип файла» необходимо выбрать — «С++ Source Files (*.cpp, *.cc, *.cxx)».
Информация о работе Синтез и программная реализация БИХ-фильтра