Тема: Дослідження ефектів переповнення та насичення акумулятора процесора 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 власний фільтр та реалізуйте його на ЦСП. Перевірте його перехідну характеристику.
В. Використайте розроблений фільтр для обробки аудіо-сигналу, використовуючі вхідний файл з завдання Б.