ЛР6 > Реалізація БІХ-фільтра з використанням TMS320C55x

Тема: Реалізація цифрових фільтрів з нескінченою імпульсною характеристикою на базі цифрового сигнального процесору

Цифрові фільтри з безкінечною імпульсною характеристикою (БІХ-фільтри) широко використовуються у прикладних задачах цифрової обробки сигналів. Практичне завдання, яке надається, демонструє реалізацію БІХ-фільтру за допомогою ЦСП. В теоретичній частині завдання обговорюються деякі практичні питання стосовно реалізації систем реального часу.

Рис. 1. Процес проектування системи для ЦОС.

 

    Як показано на рис. 1, процес проектування системи для ЦОС складається з декількох кроків, таких як: визначення вимог та детальний опис системи; розробка алгоритму та його моделювання; розробка програмного забезпечення та його компіляція з наступною перевіркою у складі системи. У даному завданні, на прикладі реалізації БІХ-фільтру, демонструються головні етапи розробки системи з акцентуванням уваги на розробці програмного забезпечення. Спочатку визначається детальний опис фільтру (його тип, смуга пропускання, границі смуги пропускання, частота коливань у смузі пропускання, затухання у смузі режекції). Потім використовується пакет MATLAB для проектування фільтру та моделювання його роботи. Коли результати моделювання співпадуть з вимогами до системи, починається процес розробки програмного забезпечення. Спочатку розробляється програма мовою С, яка використовує дані в форматі з плаваючою комою, для коректного порівняння отриманих результатів з результатами моделювання системи у пакеті MATLAB. Наступний крок – реалізація алгоритму роботи фільтру з використанням даних у форматі з фіксованою точкою у програмі на мові асемблер. Наприкінці, програма завантажується до ЦСП та перевіряється.

    На рис. 2 зображена блок-схема процесу розробки програмного забезпечення. У минулому розробка програмного забезпечення була переважно сконцентрована на третьому етапі, в той час, як другий етап зовсім не виконувався. З подальшим розвитком компіляторів для ЦСП, у останні роки компілятори мови С знайшли широке використання на першому та другому етапах проектування. При реалізації систем реального часу, інтегрованих з високошвидкісними ЦСП, зазвичай використовують змішані програми – на мові С та асемблеру. У першій частині завдання розглянемо програму, написану мовою С яка обробляє дані у форматі з плаваючою комою.

 

Рис. 2. Розробка програмного забезпечення та практичних завдань з використанням TMS320C55x.

 

Розробка такої програми не потребує знання архітектури ЦСП та аналізу придатності процесора для реалізації заданих алгоритмів. Друге та третє завдання зосереджені на оптимізації тексту програм, написаних мовою С та перетворенню типів даних. Третій етап вимагає найбільше часу, бо програмувати мовою асемблер значно складніше ніж мовою С. Останній етап виконується для порівняння отриманих результатів. Взагалі, доведено, що програма на мові асемблер є більш ефективною для реалізації алгоритмів ЦОС, таких як фільтрація, тому що вимагає інтенсивного використання операцій множення/додавання. Програми, написані мовою С, зручніше використовувати при роботі з даними, коли необхідно їх форматування або сортування.

Розробка БІХ-фільтру

Коефіцієнти цифрового фільтру можуть бути визначені у відповідності до заданої на нього специфікації, за допомогою спеціальних програм для проектування фільтрів (наприклад MATLAB). При проектуванні систем, БІХ-фільтри вищих порядків, зазвичай, представляються у вигляді каскадів або паралельних з’єднань фільтрів другого порядку. Наведена нижче програма пакету MATLAB (файл s671.m у директорії вхідних даних до завдання) демонструє процес створення БІХ-фільтру Баттерворда для низьких частот.

 

%

% s671.m – MATLAB script in Section 6.7.1

%

% Filter specifications

%

Fs=8000;        % Sampling frequency 8 kHz

fc=800;        % Passband cutoff frequency 800 Hz

fs=1600;        % Stopband frequency 1.6 kHz

Rp=1;            % Passband ripple in dB

Rs=20;        % Stopband attenuation in dB

Wp=2*fc/Fs;    % Normalized passband edge frequency

Ws=2*fs/Fs;    % Normalized stopband edge frequency

 

%

% Filter design

%

[N,Wn]=buttord(Wp,Ws,Rp,Rs);    % Filter order selection

[b,a]=butter(N,Wn);        % Butterworth filter design

[Z,P,K]=tf2zp(b,a);        % Transfer function to zero-pole

[sos,G]=zp2sos(Z,P,K);        % Zero-pole to 2nd-order section

 

Ця програма генерує коефіцієнти БІХ-фільтру четвертого порядку, які наведені нижче:

 

b = [0.0098, 0.0393, 0.0590, 0.0393, 0.0098]

a = [1.0000, – 1.9908, 1.7650, – 0.7403, 0.1235].

 

Потім БІХ-фільтр четвертого порядку поділяється на дві секції фільтрів другого порядку, представлених матрицями коефіцієнтів sos та наскрізним коефіцієнтом посилення G. Розклавши коефіцієнти матриці sos, визначеної раніше, отримаємо дві матриці:

 

            (1),

 

де, для спрощення, наскрізний коефіцієнт посилення у рівній мірі врахували у конфігурації кожного каскаду другого порядку (тобто, змінилися відповідним чином значення коефіцієнтів матриці b). Це робиться наступним чином – добувається значення квадратного кореню від наскрізного коефіцієнту посилення, та помножується на значення коефіцієнтів матриці b. Далі, розроблений фільтр Баттерворда буде використано для практичного застосування з процесором TMS320C55x.

 

    1. Відкрийте програму MATLAB. Напишіть программу для обчислення коефіціентів фільтру Баттерворда для низьких частот (як у прикладі, наведеному вище). Перевірте її працездатність. Запишіть обчислені коефіцієнти.

 

Реалізація програми на мові С з використанням даних у форматі з плаваючою комою

 

Реалізація БІХ-фільтру у прямій канонічній формі, що складається з К секцій другого порядку, здійснюється за наступними формулами:

 

 

Приклад програми на мові С, яка реалізує одну секцію фільтра другого порядку, наведено нижче:

 

temp = input[n];

for (k=0; k < IIR_SECTION; k++)

{

w[k] [0] = temp – a[k] [1]*w[k] [1] – a[k] [2] *w[k] [2];

temp = b[k] [0]*w[k] [0] + b[k] [1]*w[k] [1] + b[k] [2]*w[k] [2];

w[k] [2] = w[k] [1];                /* w(n – 2) < – w(n – 1)    */

w[k] [2] = w[k] [1];                /* w(n – 1) < – w(n)        */

}

output[n] = temp;

 

де a[] [] та b[] [] коефіцієнти матриці (фільтру), які були описані раніше, а w[] [] – масив відліків сигналу m = 0,1,2 для розрахунку вихідного сигналу фільтра. Порядковий індекс k вказує на k – ту секцію БІХ-фільтру другого порядку.

Як було зазначено у попередніх роботах, апаратні можливості побудови циклів, однотактні команди множення/додавання та присутність циклічного методу адресації є трьома найпривабливішими характеристиками ЦСП. Щоб врахувати зазначені можливості процесора, програма на мові С повинна використовувати циклічні буфери замість двомірних масивів. Оператори мови С повинні враховувати особливості виконання операцій множення/додавання у ЦСП. Наведений нижче приклад програми – це реалізація БІХ-фільтру, що складається з Ns секцій другого порядку, з каскадним з’єднанням. Підпрограма реалізації БІХ-фільтру (iir.c) четвертого порядку, написана мовою С з використанням формату даних з плаваючою комою, наведена нижче (включена в директорію вхідних даних до цього завдання):

 

/*

iir.c – IIR direct form II biquads implementation

prototype: void iir(int *, int, int *, float *, int, float *);

 

Entry: arg0: pointer to the input sample buffer

arg1: size of the input sample buffer

arg2: pointer to the output sample buffer

arg3: pointer to the coefficients array

arg4: number of second-order IIR sections

arg5: pointer to the filter delay-line buffer

 

Return: None

*/

 

 

#define CHECK_OVERFLOW 1

#if CHECK_OVERFLOW

static     float w_max=-1.,w_min=1.;

#endif

 

void iir(int *x, int Nx, int *y, float *coef, int Ns, float *w)

{

int i,j,n,m,k,l,p;

float temp, w_0;

 

m=Ns*5; /* Setup for circular buffer coef[] */

k=Ns*2; /* Setup for circular buffer d[] */

 

for (j=0,l=0,n=0; n<Nx; n++) /* IIR filter */

{

w_0 = (float)(x[n]/32767.0); /* Q15 to float */

for (i=0; i<Ns; i++)

{

w_0 -= *(w+l) * *(coef+j); j++; l=(l+Ns)%k;

w_0 -= *(w+l) * *(coef+j); j++;

     temp = *(w+l);

     *(w+l) = w_0;

     #if CHECK_OVERFLOW

for (p=0;p<k;p++)

{

if (w_max <= w_0) w_max = w_0;

if (w_min > w_0) w_min = w_0;

}

#endif             

w_0 = temp * *(coef+j); j++;

w_0 += *(w+l) * *(coef+j); j++; l=(l+Ns)%k;

w_0 += *(w+l) * *(coef+j); j=(j+1)%m; l=(l+1)%k;

#if CHECK_OVERFLOW

for (p=0;p<k;p++)

{

if (w_max <= w_0) w_max = w_0;

if (w_min > w_0) w_min = w_0;

}

#endif         

}

y[n] = (int)(w_0*32767); /* Q15 format output */

}

}

 

Коефіцієнти фільтру в цьому прикладі та масив відліків сигналу зконфігуровані як циклічні буфери (див. рис. 3).

Рис. 3. Конфігурація коефіцієнтів фільтру та масиву відліків сигналу для реалізації БІХ-фільтру

 

Масив відліків сигналу містить два елементи та для кожної секції фільтру другого порядку. Зміст регістра-вказівника даного масиву вказує на перший елемент у буфері. Вектор коефіцієнтів фільтру представлений п’ятьма елементами () для кожної секції фільтру, а регістр-вказівник масиву коефіцієнтів фільтру вказує на перший коефіціент . Циклічне збільшення значень регістрів-вказівників задається наступними командами: та , де m та k – це розміри масиву коефіцієнтів фільтра та масиву відліків сигналу відповідно.

Головна програма expa.c, написана мовою С, що використовується для виклику підпрограми БІХ-фільтру, наведена нижче:

 

/*

exp6a.c – Direct form II – IIR function implementation

         in floating-point C and using signal generator

*/

#define M 128 /* Number of samples per block */

#define Ns 2 /* Number of 2nd order sections */

 

/* Low-pass IIR filter coefficients */

float C[Ns*5]={ /* i=section number */

/* A[i][1],A[i][2],B[i][2],B[i][0],B[i][1] */

-0.8659, 0.2139, 0.0992, 0.0992, 0.1984,

-1.1249, 0.5770, 0.0992, 0.0992, 0.1984};

/* IIR filter delay line:

w[]=w[i][n-1],w[i+1][n-1],…,w[i][n-2],w[i+1][n-2],… */

float w[Ns*2];

 

int out[M];

int in[M];

 

/* IIR filter function */

extern void iir(int*, int, int *, float *, int, float *);

 

/* Software signal generator */

extern void signal_gen2(int *, unsigned int);

 

 

void main(void)

{

int i;

 

/* Initialize IIR filter delay line */

for (i=0; i<Ns*2;i++)

w[i]=0;

 

/* IIR filter experiment start */

for (;;)

{

signal_gen2(in,M); /* Generate a block of samples */

iir(in,M,out,C,Ns,w); /* Filter a block of samples */

}

}

 

Ця програма викликає програму генератора сигналів signal_gen2.с для створення вибірки даних вхідного сигналу. Потім, викликається функція БІХ-фільтру (iir.с) яка виконує алгоритм фільтрації. Фільтр низьких частот, що використовується для даного завдання – це фільтр Баттерворда четвертого порядку, який був спроектований у пакеті MATLAB. Дві тимчасові змінні temp та w_0 використовуються для тимчасового зберігання даних.

 

Зробіть наступні кроки для виконання завдання А:

1. Створіть новий проект у середовищі CCS; назвіть його expА та збережіть його у відповідній директорії. Напишіть програму exp6А.с на основі наведеного вище коду. Скопіюйте командний файл лінкера exp6.cmd з директорії вхідних даних до завдання. Додайте до проекту файли exp6А.с, exp6.cmd,

iir.c, signal_gen.c та sine.asm. Підключить бібліотеку засобів динамічної підтримки rst55.lib (розташована у директорії C:\ti\c5500\cgtools\lib). Запустіть програму на компіляцію. Фільтр низьких частот послабить високочастотні складові вхідного сигналу, згенерованого програмою генератора сигналів , signal_gen.c, який використовує рекурсивну функцію генератора синусних сигналів sine.asm для відтворення трьох синусних сигналів з частотами 800 Гц 1,8 кГц та 3,3 кГц.

2. Завантажте програму до процесора. Відкрийте чотири графічних вікна для перегляду вхідного сигналу, його спектру, вихідного сигналу та його спектру. Параметри налагодження графічних вікон наведені в лабораторній роботі № 5.

3. Встановіть точку переривання в 38 рядку головної програми exp6А.с (оператор виклику функції генератора сигналу). Запустіть програму на виконання в режимі анімації. Проаналізуйте отриманий результат. На виході фільтру повинен бути присутній чистий синусний сигнал з частотою 800 Гц.

 Завдання для самостійної робо 

А. Доопрацюйте вхідні дані таким чином, щоб в них були присутні інші частотні складові. Перевірте результат фільтрації даних за допомогою наведеної програми.

Б. У середовищі MATLAB розрахуйте власний БІХ-фільтр та реалізуйте його на ЦСП. Перевірте його працеспроможність на тестовому сигналі.