ЛР3(б) > Робота ЦСП з даними у форматі з фіксованою точкою: переповнення, насичення акумулятора, квантування коефіцієнтів

Тема: Дослідження ефектів переповнення та насичення акумулятора процесора C55x. Режим запобігання переповнень. Квантування коефіцієнтів для створення КІХ та БІХ фільтрів.

Завдання В

Ефекти переповнення та насичення

Переповненням називають ефект, коли число перевищує вміст акумулятора. Переповнення може виникнути, наприклад, при обчислені алгоритму цифрової фільтрації сигналів. Інколи переповнення виникає, коли здійснюється передача даних до пам’яті, навіть коли акумулятор не переповнився. Це тому, що акумулятори процесору С55х (АС0-АС3) мають довжину 40 біт, в той час як розмір комірки пам’яті, зазвичай, визначається 16- бітовими словами. Є декілька способів обробки переповнень. Процесор С55х має внутрішній запобіжник переповнення, який встановлює режим насичення даних, якщо сталося переповнення.

У даному завданні використовується підпрограма ovf_sat.asm (вона розташована в директорії з вхідними даними), написана мовою асемблер, яка генерує дві послідовності – синусний та лінійно-зростаючий сигнали без захисту від переповнення. Текст підпрограми наведено нижче:

 

.def    _ovftest

.bss    buff,(0x100)

.bss    buff1,(0x100)

;

;Code start

;

_ovftest

bclr SATD ; Clear saturation bit if set

xcc start,T0!=#0 ; If T0!=0, set saturation bit

bset SATD

start

pshboth XAR5 ; Save XAR5

mov #0,AC0

amov #buff,XAR5 ; Set buffer pointer

rpt #0x100-1 ; Clear buff

mov AC0,*AR5+

amov #buff1,XAR5 ; Set buffer pointer

rpt #0x100-1 ; Clear buff1

mov AC0,*AR5+

mov #0x80-1,BRC0 ; Initialize loop counts for addition

amov #buff+0x80,XAR5 ; Initialize buffer pointer

rptblocal add_loop_end-1

add #0x140<<#16,AC0 ; Use upper AC0 as a ramp up counter

mov hi(AC0),*AR5+ ; Save the counter to buffer

add_loop_end

mov #0x80-1,BRC0 ; Initialize loop counts for subtraction

mov #0,AC0

amov #buff+0x7f,XAR5 ; Initialize buffer pointer

rptblocal sub_loop_end-1

sub #0x140<<#16,AC0 ; Use upper AC0 as a ramp down counter

mov hi(AC0),*AR5- ; Save the counter to buffer

sub_loop_end

mov #0x100-1,BRC0 ; Initialize loop counts for sinewave

amov #buff1,XAR5 ; Initialize buffer pointer

mov mmap(@AR0),BSA01; Initialize base register

mov #40,BK03 ; Set buffer as size 40

mov #20,AR0 ; Start with an offset of 20 samples

bset AR0LC ; Active circular buffer

rptblocal sine_loop_end-1

mov *ar0+<<#16,AC0 ; Get sine value into high AC0

sfts AC0,#9 ; Scale the sine value

mov hi(AC0),*AR5+ ; Save scaled value

sine_loop_end

mov #0,T0 ; Return 0 if no overflow

xcc     set_ovf_flag,overflow(AC0)

mov #1,T0 ; Return 1 if overflow detected

set_ovf_flag

bclr AR0LC ; Reset circilar buffer bit

bclr SATD ; Reset saturation bit

popboth XAR5 ; Restore AR5

ret

В підпрограмі наступний фрагмент коду використовується для постійного додавання константи 0×140 до змісту акумулятора AC0 (формування лінійно-зростаючого сигналу):

 

rptblocal add_loop_end-1

add #0x140<<#16,AC0

mov hi(AC0),*AR5+

add_loop_end

Змінене значення зберігається в комірці пам’яті, адресу якої вказує регістр-вказівник AR5. Вміст акумулятору AC0 буде збільшуватися доти, поки не настане переповнення. Після його виникнення, позитивне число в AC0 відразу стане негативним. Але, якщо в процесорі С55х встановлено режим запобігання переповненню (використання насищення), то при виникненні переповнення значення числа в акумуляторі буде обмежене найбільшим числом 0×7FFFFFFF.

    Друга частина коду наведеної підпрограми виконує зсув вліво значень відліків синусоїди, записаних в пам’яті даних (це рівнозначно виконанню операції множення на число, кратне ступені 2). При відсутності обмеження даних за допомогою насищення, цей зсув спричинить появу переповнення.

    Текст основної програми expC.c наводиться нижче:

/* ——————————————–

exp3c.c

Understand overflow

———————————————– */

#define    BUF_SIZE 40

int sineTable[BUF_SIZE]={

0x0000,0x000f,0x001e,0x002d,0x003a,0x0046,0x0050,0x0059,

0x005f,0x0062,0x0063,0x0062,0x005f,0x0059,0x0050,0x0046,

0x003a,0x002d,0x001e,0x000f,0x0000,0xfff1,0xffe2,0xffd3,

0xffc6,0xffba,0xffb0,0xffa7,0xffa1,0xff9e,0xff9d,0xff9e,

0xffa1,0xffa7,0xffb0,0xffba,0xffc6,0xffd3,0xffe2,0xfff1};

extern int ovftest(int, int *);

void main()

{

int ovrflow_flag;

int *ptr=sineTable;

while(1)

{

ovrflow_flag=0;

ovrflow_flag=ovftest(ovrflow_flag, ptr);

if (ovrflow_flag != 0)

ovrflow_flag=ovftest(ovrflow_flag, ptr);

}

}

Вона використовується для виклику підпрограми ovf_sat.asm та переключення процесора в режим запобігання переповненню.

1. Створіть новий проект у середовищі CCS; назвіть його expС та збережіть його у відповідній директорії. Напишіть програму expС.с на основі наведеного вище коду та збережіть її у відповідній директорії. Скопіюйте командний файл лінкера exp.cmd з попередньої лабораторної роботи, та збережіть його у відповідній директорії. Додайте обидва файла до проекту. Додайте до проекту файл ovf_sat.asm. Підключить бібліотеку засобів динамічної підтримки rst55.lib (розташована у директорії C:\ti\c5500\cgtools\lib). Запустіть програму на компіляцію.

2. Завантажте програму до процесора. Встановіть точки переривання в рядках 32 та 34 файлу expС.c (команда перевірки прапорця переповнення та
перша закриваюча за нею дужка).

3. Відкрийте графічні вікна для відображення синусоїди (змінна buff1) та лінійно-зростаючого сигналу (змінна buff). Приклад настройки графічного вікна для відображення змінної buff1 показаний на рис.2.


Рис.2. Приклад настройки графічного вікна для виведення змінної buff1.

4. Запускаючи програму на виконання за допомогою команди RUN, прослідкуйте за обчисленням даних процесором в режимах без запобігання переповненню та з запобіганням.

Завдання Г

Ефект квантування коефіцієнтів

Однією з найпоширеніших задач цифрової обробки сигналів є фільтрація. Процесор С55х може використовуватися для реалізації КІХ та БІХ фільтрів (відповідно FIR та IIR), коефіцієнти яких часто представлені 16-розрядними цілими числами. Завдяки використанню програмного забезпечення з фіксованою точкою для застосування фільтрів, ефект впливу квантування коефіцієнтів має вагомий вплив на поведінку фільтра. Особливо цей ефект помітно впливає на реалізацію фільтрів, які розраховувались за допомогою програм проектування фільтрів, таких як MATLAB, в яких використовують числа з плаваючою точкою для представлення коефіцієнтів.

В даному завданні буде досліджуватись поведінка IIR фільтру четвертого порядку.

Нижче наведена програма на мові асемблер, яка реалізує вказаний IIR фільтр низьких частот:

 

; expd_IIR.asm – 4th Order IIR filter

;

MASK .set 0xFFFF

.def _iir4

.def _init_iir4

;

; Original coefficients 0-1800Hz 4th order IIR LPF

; with sampling frequency 8000Hz

;

; int b[5]={0.0072, 0.00287, 0.0431, 0.0287, 0.0072};

; int a[5]={1.0000, -2.16860,2.0097,-0.8766, 0.1505};

;

.data;        Q13 formatted coefficients

coeff    ; b0, b1, b2, b3, b4

.word 0x003B&MASK, 0x00EB&MASK

.word 0x0161&MASK, 0x00EB&MASK, 0x003B&MASK

; -a1, -a2, -a3, -a4

.word 0x4564&MASK, -0x404F&MASK

.word 0x1C0D&MASK, -0x04D1&MASK

.bss x,5        ; x delay line

.bss y,4        ; y delay line

.text

_init_iir4

pshboth XAR5

amov        #x,XAR5

rpt        #4

mov        #0, *AR5+

amov        #y, XAR5

rpt        #3

mov        #0, *AR5+

popboth XAR5

ret

;

;    4th Order IIR filter

;    Entry T0 = sample

;    Exit T0 = filtered sample

;

_iir4

pshboth    XAR5

pshboth    XAR6

bset        SATD

bset        SXM

amov        #x,XAR5

amov        #y,XAR6

amov        #coeff,XCDP

bset        FRCT

||    mov        T0,*AR5    ; x[0] = indata

;

;    perform IIR filter

;

mpym    *AR5+,*CDP+,AC0    ; AC0=x[0]*bn[0]

||    rpt        #3                ; i=1,2,3,4

macm        *AR5+,*CDP+,AC0    ; AC0+=x[i]*bn[i]

rpt        #3                ; i=0,1,2,3

macm        *AR6+,*CDP+,AC0    ; AC0+=y[i]*an[i]

amov        #y+2,XAR5

amov        #y+3,XAR6

sfts        AC0,#2            ; Scale to Q15 format

||    rpt        #2

mov        *AR5-,*AR6-        ; Update y[]

mov        hi(AC0),*AR6

||    mov        hi(AC0),T0            ; return y[0] in T0

amov        #x+3,XAR5

amov        #x+4,XAR6

bclr        FRCT

||    rpt        #3

mov        *AR5-,*AR6-        ; Update x[]

popboth    XAR6

popboth    XAR5

bclr        SXM

bclr        SATD

||    ret

.end

Даний фільтр спроектований на частоту вибірки, яка дорівнює 8кHz. Його частота зрізу дорівнює 1800Hz. Підпрограма _init_iir4 встановлює комірки пам’яті буферів x та y в 0 (ініціалізує фільтр). Підпрограма _iir4 реалізує функцію IIR фільтру, тобто фільтрує вхідний сигнал. Вказівник сторінки пам’яті даних (CDP) використовується для зчитування коефіцієнтів фільтру. Допоміжні регістри AR5 та AR6 вказують адреси буферів даних x та y, відповідно. Призначення програми – фільтрація вхідних даних, які представлені змінною indata. Результат роботи фільтра зберігається змінною outdata. Для визову підпрограми фільтра використовується основна програма expD.c.

1. Створіть новий проект у середовищі CCS; назвіть його expD та збережіть його у відповідній директорії. Скопіюйте командний файл лінкера expD.cmd, файли expD.c та EXPD_IIR.asm з директорії вхідних даних до лабораторної роботи, та збережіть їх у відповідній директорії. Додайте всі файли до проекту. Підключить бібліотеку засобів динамічної підтримки rst55.lib (розташована у директорії C:\ti\c5500\cgtools\lib). Запустіть програму на компіляцію.

2. Завантажте програму до процесора. За допомогою команди View→Memory відкрийте вікно перегляду змісту пам’яті даних (в полі адреса вкажіть ім’я змінної х).
В комірці пам’яті де розташована змінна indata, вкажіть значення вхідного сигналу (наприклад, 0х0020), а для змінної outdata встановіть значення 0х0000. За допомогою команди View→Graph відкрийте графічне вікно перегляду, та налаштуйте його у відповідності до рис.3.

 


Рис.3. Приклад настройки графічного вікна для виведення змінної outdata.

 

Стартовий адрес – комірка пам’яті, де розташована змінна outdata. Встановіть пробну точку в файлі expD.c в рядку з командою

outdata = iir4(indata);
За допомогою команди Debuge→Probe Point підключіть пробну точку до графічного вікна. Запустіть програму на виконання в режимі анімації. На графічному екрані відображається поведінка фільтра при подачі на його вхід постійного значення (перехідна характеристика фільтру).

3. Для досліду явища впливу квантування на коефіцієнти фільтру змініть значення MASK, яке задане в підпрограмі _ii4( ), написаной мовою асемблер. Знову запустіть програму на виконання в режимі анімації. Розгляньте, яким чином змінилась поведінка фільтра.

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

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

Б. Для завдання Г – розрахуйте в середовищі MATLAB власний фільтр та реалізуйте його на ЦСП. Перевірте його перехідну характеристику.

В. Використайте розроблений фільтр для обробки аудіо-сигналу, використовуючі вхідний файл з завдання Б.