Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК МПСС.doc
Скачиваний:
38
Добавлен:
09.11.2019
Размер:
11 Mб
Скачать

2. Реализация бих фильтра на симуляторе dsk5510

Программная реализация БИХ фильтра аналогична реализации КИХ фильтра, однако, добавляется дополнительная линия задержки и дополнительный цикл накопления с умножением для обработки коэффициентов А.

  1. Необходимо создать папку «laba_4» и в ней папку «exp_1».

  2. Скопировать в папку с проектом все файлы из папки «exp_1» работы №3.

  3. Внести изменения в файл «filter.h» в соответствии с листингом 2.1.

Листинг 2.1 – Листинг файла «filter.h»

#include <stdio.h>

#define LENBUF 120

#define LENFILTER_B 8

#define LENFILTER_A 8

//коэффициенты фильтра умноженные на число 512

int coeffBuff_b[]={8,-12,21,-19,19,-9,4,0};//(0.2)/2

//8,-12,21,-19,19,-9,4,0};//(0.2)/2

//28,61,98,116,95,62,26,7};//(0.4)/2

//61,6,-93,-13,93,16,-61,-9};//полосовой

int coeffBuff_a[]={512,-2275,4770,-5966,4757,-2401,708,-94};//(0.2)/2

//512,-2275,4770,-5966,4757,-2401,708,-94};//(0.2)/2

//512,-787,1315,-1120,854,-393,130,-19};//(0.4)/2

//512,9,482,5,338,18,58,3};//полосовой

//входной буфер

int inp_buf[LENBUF];

//выходной буфер

int out_buf[LENBUF];

//буфер линии задержки

int SimplBuff_b[LENFILTER_B];

int SimplBuff_a[LENFILTER_A];

//вспомогательная переменная

int coeff;

//счетчики

int count;

int count_run;

int count_con;

//функция запуска фильтрации

int run_filter()

{

for(count_run=0;count_run<LENBUF;count_run++)

{

//чтение входного отсчета

coeff=inp_buf[count_run];

//запись текущего отсчета в линию задержки

SimplBuff_b[0]=coeff;

//запуск функции свертки сигнала

coeff=convolution();

//запись выходного отсчета в линию задержки

SimplBuff_a[0]=coeff;

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

out_buf[count_run]=coeff;//+150;

}

return 0;

}

//функция осуществляющая свертку сигнала

int convolution()

{

//вспомогательные переменные

long int coeff_mxb,coeff_mxa;

long int summ_b,summ_a;

long int tmp1,tmp2,tmp3,tmp4;

//-----------------------------------------------------------------------------

for(summ_b=0,count_con=0;count_con<LENFILTER_B;count_con++)

{

//чтение текущего отсчета из линии задержки

tmp1=SimplBuff_b[count_con];

//чтение коэффициента фильтра

tmp2=coeffBuff_b[count_con];

//перемножение отсчета с коэффициентом фильтра

coeff_mxb=tmp1*tmp2;

//накопление результата

summ_b +=coeff_mxb;

}

//цикл сдвига линии задержки на единицу вправо

for(count_con=LENFILTER_B-1;count_con>0;count_con--)

{

SimplBuff_b[count_con]=SimplBuff_b[count_con-1];

}

//-----------------------------------------------------------------------------

//цикл сдвига линии задержки на единицу вправо

for(count_con=LENFILTER_A-1;count_con>0;count_con--)

{

SimplBuff_a[count_con]=SimplBuff_a[count_con-1];

}

for(summ_a=0,count_con=1;count_con<LENFILTER_A;count_con++)

{

//чтение текущего отсчета из линии задержки

tmp3=SimplBuff_a[count_con];

//чтение коэффициента фильтра

tmp4=coeffBuff_a[count_con];

//перемножение отсчета с коэффициентом фильтра

coeff_mxa=tmp3*tmp4;

//накопление результата

summ_a +=coeff_mxa;

}

//нахождения разности сумм и деление на 512

return (summ_b-summ_a)>>9;

}

//функция очистки линии задержки

void ClearSimpleBuff()

{

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

SimplBuff_b[count]=0;

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

SimplBuff_a[count]=0;

}

  1. Файл «main.c» остается без изменений.

  2. Скомпилировать и загрузить проект в симулятор.

Тестирование БИХ фильтра