На бирже курсовых и дипломных проектов можно найти образцы готовых работ или получить помощь в написании уникальных курсовых работ, дипломов, лабораторных работ, контрольных работ, диссертаций, рефератов. Так же вы мажете самостоятельно повысить уникальность своей работы для прохождения проверки на плагиат всего за несколько минут.

ЛИЧНЫЙ КАБИНЕТ 

 

Здравствуйте гость!

 

Логин:

Пароль:

 

Запомнить

 

 

Забыли пароль? Регистрация

Повышение уникальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp», которое позволит вам всего за несколько минут, выполнить повышение уникальности любого файла в формате MS Word. После такого повышения уникальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, etxt.ru или advego.ru. Программа «StudentHelp» работает по уникальной технологии и при повышении уникальности не вставляет в текст скрытых символов, и даже если препод скопирует текст в блокнот – не увидит ни каких отличий от текста в Word файле.

Результат поиска


Наименование:


курсовая работа Синтез и программная реализация БИХ-фильтра

Информация:

Тип работы: курсовая работа. Добавлен: 24.05.2012. Сдан: 2011. Страниц: 17. Уникальность по antiplagiat.ru: < 30%

Описание (план):


Государственный университет телекоммуникаций им. Бонч-Бруевича
кафедра «Цифровой обработки  сигналов» 
 
 
 
 
 
 
 
 
 
 
 
 

Курсовая  работа
«Синтез и программная  реализация БИХ-фильтра» 
 

Вариант № _17_ 
 
 
 
 

Выполнил студент  группы № Р610м _________Шафоростов В. А. 

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

2011 год 

Цель  работы:
Синтезировать полученные знания и  реализовать программный  код фильтра с  бесконечной импульсной характеристикой  для цифрового  сигнального процессора компании Texas Instrument (TI) семейства TMS320C6000.
Дано:
1. Частота дискретизации  – 8000 Гц .
2. Полоса пропускания  – 1200Гц.
3. Полоса задерживания  – 2400Гц.
4. Отклонение  в полосе пропускания –   1 дБ.
5. Отклонение в полосе задерживания –   -30дБ
7. Метод расчёта – билинейное |Z-преобразование
8. Тип аппроксимации: Баттерворта 

            Синтез БИХ в программе FD-3
 
Структурная схема 


Передаточная  функция 


Где,   K=3,    количество каскадов
          M=2,    порядок нерекурсивной части каждого каскада
          N=2,    порядок рекурсивной части каждого каскада
         a и b, коэффициенты каждого каскада
Разностное  уравнение каждого каскада имеет вид: 


    Таблица коэффициентов  каждого каскада приведена ниже 

Карта нулей и полюсов

График  АЧХ
 
 
 

Импульсная  характеристика
 
 

    Таблица коэффициентов b и a для каждого каскада, а так же  масштабный множиель m.
    Табл1.
  I  каскад II –каскад III  каскад
b0 0.222231 0.222231 0.222231
b1 0.222231 0.444462 0.444462
b2 0 0.222231 0.222231
a0 1 1 1
a1 0.775979 0.577814 0.263231
a2 -0.576084 -0.173593 0
m 0.857375 0.857375 1
    Целочисленные значения коэффициентов.
    Табл2.
  I  каскад II –каскад III  каскад
b0 195 195 227
b1 195 390 455
b2 0 195 227
a1 794 591 269
a2 -590 -178 0
 
 
 
 
 
 
 
 
            РАЗРАБОТКА АЛГОРИТМА:
 
    Алгоритм  будет состоять из четырёх основных функций: main.cpp, initBIX.cpp (инициализация начального состояния), runBIX.cpp (обработка коэффициентов) и cnvBIX.cpp (функция свёртки).
    Так же будут созданы: prjBIX.h – заголовочный файл и constantBIX.cpp – файл констант.
    Ниже приведены блок схемы реализуемых функций:
1. Функции main: 
 

 
 
 
 
 
 
 
 
 
 

2. Функция инициализации начального состояния initBIX: 

 

3. Функция runBIX: 
 

 
 
 
 

4. Функций cnvBIX: 

 
 
 

          РЕАЛИЗАЦИЯ  ПРОГРАММНОГО КОДА
 
    Программная реализация кода будет основана на файловой модели, которая подразумевает:
      Наличие одного заголовочного файла на проект;
      Размещение каждой функции в отдельном файле;
      Создание всех глобальных переменных в отдельном файле;
      Передача параметров между функциями через контекстную структуру;
      Функция main() выполняет только считываение/запись данных и вызов интерфейсных функций проекта, и не содержит программного кода, соответствующего разрабатываемому алгоритму;
      Размещение входных и выходных данных в соответствующих файлах;
      Запрет на создание переменных, констант и т.п. в заголовочном файле проекта.
    Ниже  представлены листинги программного кода каждой функции: 
 

Функция main 

#include "prjBIX.h" 

int main(void)
{
   
  
    word32 count; 
   
 
    pCntx=&cntx;
   
   
    initBIX(pCntx);
   
   for(count=0;count<10;count++)
   {
    asm(" nop "); 

    runBIX(pCntx);
       
    asm(" nop ");   
       
   }    

    return(0);
} 
 
 
 

Функция инициализации начального состояния initBIX 

//функция инициализации  начального состояния разрабатываемого проекта
#include "prjBIX.h" 

void initBIX(CONTEXMPY *pCntx)
{
    //Локальные  переменные
    word32 count; //переменная цикла
   
    pCntx -> pInpBuff = inpBuff; //Указатель на входной  буфер
    pCntx -> pOutBuff = outBuff; //Указатель на выходной буфер
    pCntx -> lenBuff  = SAZEBUFF; //Размер входного  и выходного буферов
    pCntx -> constA   = MASHTAB; //Маштабирующий коэффициент
   
    pCntx -> pCoeffA1   = coeffBuffA1;//Указатель на  буфер A коэффициентов фильтра
    pCntx -> pCoeffB1   = coeffBuffB1;//Указатель на  буфер B коэффициентов фильтра
   
    pCntx -> pCoeffA2   = coeffBuffA2;//Указатель на  буфер A коэффициентов фильтра
    pCntx -> pCoeffB2   = coeffBuffB2;//Указатель на  буфер B коэффициентов фильтра
   
    pCntx -> pCoeffA3   = coeffBuffA3;//Указатель на  буфер A коэффициентов фильтра
    pCntx -> pCoeffB3   = coeffBuffB3;//Указатель на  буфер B коэффициентов фильтра
     

    pCntx -> pShiftA1   = shiftBuffA1;//Указатель на  буфер задержки
    pCntx -> pShiftB1   = shiftBuffB1;//Указатель на буфер задержки
   
    pCntx -> pShiftA2   = shiftBuffA2;//Указатель на  буфер задержки
    pCntx -> pShiftB2   = shiftBuffB2;//Указатель на  буфер задержки
   
    pCntx -> pShiftA3   = shiftBuffA3;//Указатель на буфер задержки
    pCntx -> pShiftB3   = shiftBuffB3;//Указатель на  буфер задержки
     

    pCntx -> namberCoeff = NAMBERCOEFF;//Порядок фильтра
  
   //Обнуление  массива входных коффициентов
   for(count = 0; count < SAZEBUFF; count++) pCntx -> pInpBuff[count] = 0;
  
   //Обнуление линии задержки
   for(count = 0; count < NAMBERCOEFF; count++) pCntx -> pShiftA1[count] = 0;
   for(count = 0; count < NAMBERCOEFF; count++) pCntx -> pShiftB1[count] = 0;
  
   for(count = 0; count < NAMBERCOEFF; count++) pCntx -> pShiftA2[count] = 0;
   for(count = 0; count < NAMBERCOEFF; count++) pCntx -> pShiftB2[count] = 0;
  
   for(count = 0; count < NAMBERCOEFF; count++) pCntx -> pShiftA3[count] = 0;
   for(count = 0; count < NAMBERCOEFF; count++) pCntx -> pShiftB3[count] = 0;
  
  
}
Функция runBIX 

//Функция обработки  входного буфера и записи результата  в выходной буфер 

#include "prjBIX.h"
  
void runBIX(CONTEXMPY* pCntx)
{
    //Объявление  локальных переменных
    word16 *pInpBuff; //Указатель на входной буфер
    word16 *pOutBuff; //Указатель на выходной буфер
    word16 lenBuff;   //Размер входного и выходного  буферов
    word32 constA;    //Маштабирующий коэффициент
    word32 count;     //Переменная цикла
    word16 coeff;     //Переменная для хранения промежуточных  результатов
   
    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; //Порядок фильтра
   
    //Инициализация  локальных переменных
    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 необходимо в 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)».
Заголовочный  файл «prjBIX.h» к проекту не подключается. В этом нет необходимости, так как в CCS подключение заголовочных файлов, которые в файлах проекта указаны директивой «#include», происходит автоматически. И последний файл, который подключается к проекту — это файл библиотеки «rts6400.lib». Этот файл необходим для того, что бы CCS смог корректно преобразовать С++ кода к бинарному виду для выбранного типа сигнального процессора. Подключение производиться так же как это было рассмотрено выше. Необходимый файл находиться в директории, где установлена отладочная среда CCS, в папке «Директория установки CCS\C6000\cgtools\lib\». Выберите папку размещения файла библиотеки в поле «Папка», Укажите в поле «Тип файла» — «Object and Library Files (*.o; *.l)», Щелкните по имени «rts6400» (после этого оно должно появиться в поле «Имя файла») и нажмите кнопку «Открыть». Окно «Add Files to Project» для случая подключения библиотеки «rts6400.lib
и т.д.................


Перейти к полному тексту работы


Скачать работу с онлайн повышением уникальности до 90% по antiplagiat.ru, etxt.ru или advego.ru


Смотреть полный текст работы бесплатно


Смотреть похожие работы


* Примечание. Уникальность работы указана на дату публикации, текущее значение может отличаться от указанного.