Глинченко А.С. Принципы организации и программирования сигнальных процессоров ADSP-21xx (2000) (1264223), страница 14
Текст из файла (страница 14)
Выходные сигналы звеньев y(n) при прямойформе их реализации вычисляются в соответствии с разностным уравнением:y( n ) = b0 x( n ) + b1 x( n − 1 ) + b2 x( n − 2 ) − a1 y( n − 1 ) − a 2 y( n − 2 ) ,в котором х(n) являются текущими отсчетами входных сигналов звеньев,x(n-1), x(n-2) и y(n-1), y(n-2) – предыдущими (задержанными) отсчетамивходных и выходных сигналов звеньев, b0, b1 , b2 , a1 , a2 - весовымикоэффициентами звеньев.
Каждый отсчет выходного сигнала звенапредставляет взвешенную сумму текущего отсчета входного сигнала и двухпредыдущих отсчетов входного и выходного сигналов звеньев. Выходнойсигнал предыдущего звена является входным сигналом следующего звена.Входной сигнал первого звена является входным сигналом фильтра, авыходной сигнал последнего звена – выходным сигналом фильтра. Входныесигналя всех звеньев умножаются также на масштабные коэффициенты m<1,исключающие переполнения сумматоров фильтра.
Их значения принимаютобычно равными ближайшей целой степени двойки: m ≈2 − r , где r=1, 2, 3,…−коэффициенты сдвига. При этом масштабирование сигналов x(n)осуществляется путем сдвига вправо их двоичных значений на r бит.Отсчеты сигналов x(n-2), x(n-1), y(n-2), y(n-1) размещаются в указаннойпоследовательности в памяти данных процессора по возрастающим адресамв соответствии с порядком включения звеньев, образуя сигнальную памятьфильтра в виде циклического буфера data_buffer длиною 4*L. Коэффициентыr, b2 , b1 , b0 , a2 , a1 образуют память коэффициентов фильтра. В такойпоследовательности они размещаются в циклическом буфере coef_bufferдлиною 6*L памяти программ согласно порядку включения звеньев.Коэффициенты звеньев в каскадной структуре могут иметь максимальные помодулю значения, не превышающие 2.
Для представления их в дробномформате 1.15 все коэффициенты звеньев нужно поделить на 2, а выходныесигналы звеньев y(n) после завершения обработки сдвинуть влево на 1 бит.Задачи инициализации рекурсивного фильтра совпадают с описаннымивыше задачами инициализации нерекурсивного цифрового фильтра. Поэтомуони могут использовать один и тот же модуль подпрограммы инициализациифильтров flt_init. Отличие их заключается только в содержимомподключаемого файла коэффициентов <coef.dat> и файла констант <const.h>.Файл <const.h> для рекурсивного фильтра имеет следующую структуру:.CONST n_sec = <число звеньев>, ldbuf = <4*n_sec>, lcbuf = <6*n_sec>;В файле задается число секций (звеньев) n_sec и зависящие от него значениядлины буфера данных ldbuf и коэффициентов lcbuf, например:77.CONST n_sec = 4, ldbuf = 16, lcbuf = 24;В приводимом модуле подпрограммы обработки прерыванийрекурсивного фильтра iir_proc из подключаемого файла <const.h>передаются значения констант n_sec = L, ldbuf = 4*L и lcbuf = 6*L,объявляются метка входа proc_start, внешние переменные data_buffer иcoef_buffer и в соответствии с разностным уравнением осуществляетсяпокаскадная алгоритмическая обработка очередного отсчета сигнала,который считывается с приемного регистра порта RX0.Обработка выполняется в цикле по числу звеньев фильтра.
В концекаждого цикла осуществляются операции сдвига или обновления сигнальнойпамяти звена в соответствии с операторами присваивания: x(n-2) = x(n-1),x(n-1) = x(n), y(n-2) = y(n-1), y(n-1) = y(n). Входной отсчет следующегозвена приравнивается выходному отсчету предыдущего звена: .Выходной отсчет данных всего фильтра записывается в передающийрегистр последовательного порта TX0.Все коэффициенты и значения данных представляются в формате 1.15.{Модуль подпрограммы обработки рекурсивного фильтра}.M0DULE/ RAM iir_proc;.INCLUDE <const.h>;.EXTERNAL data_buffer, coef_buffer;.ENTRY proc_start;Параметры вызова:I0 = начало буфера сигнальной памятиL0 = 4*L длина буфера сигнальной памяти фильтраI4 = начало буфера коэффициентов звеньевL4 = 5*L длина буфера памяти коэффициентов фильтраM0, M4 = 1Возвращаемые значения:TX0 = выходной отсчет фильтра y(n) (с округлением)I0 = указывает начало буфера данныхI4 = указывает начало буфера коэффициентовL0 = длина буфера сигнальной памятиL4 = длина буфера коэффициентов фильтраM0, M4 = 1Изменяемые регистры:SE, SI, MX0, MX1, MY0, MR, SR, CNTRВремя выполнения: (8* L/2)+5 цикловПредполагается, что все коэффициенты и значения данных представленыв формате 1.15}proc_start: CNTR = n_sec;M1 = − 3;{CNTR = число секций}78SI = RX0;{чтение отсчета данных x(n) с порта SPORT0}DO num UNTIL CE;SE = DM(I4, M4);{число масштабирующих сдвигов r}SR = ASHIFT SI (HI);{промасштабированное значение x(n)}MX0 = DM(I0, M0), MY0 = PM(I4, M4);{чтение x(n-2), b2}MR = MX0*MY0 (SS), MX1 = DM(I0, M0), MY0 = PM(I4, M4);{MR= b2*x(n-2); чтение x(n-1), b1}MR = MR+MX1*MY0 (SS), MY0 = PM(I4, M4);{MR = MR+b1*x(n-1); чтение b0}MR = MR+SR1*MY0 (SS), MX0 = DM(I0, M0), MY0 = PM(I4, M4);{MR = MR+b0*x(n); чтение y(n-2), -a2}MR = MR+MX0*MY0 (SS), MX0 = DM(I0, M1), MY0 = PM(I4, M4);{MR = MR+(-a2*y(n-2); чтение y(n-1), -a1}DM(I0, M0) = MX1, MR = MR+MX0*MY0 (RND);{x(n-2) = x(n-1); MR = MR+(-a1*y(n-1) = y(n)/2 }IF MV SAT MR;{включить насыщение}SR1 = MR1;{SR1 = y(n)/2 c насыщением}SR = IF NOT MV ASHIFT MR1 BY 1 (HI);{SR1 = y(n)}DM(I0, M0)=SR1; {x(n-1) = x(n) }DM(I0, M0)=MX0; {y(n-2) = y(n-1)}DM(I0, M0)=SR1; {y(n-1) = y(n)}num: SI = SR1;{x(n) = y(n)};TX0 = SR1; {запись y(n) из SR1 в регистр передачи SPORT0}RTI;{возврат в главную программу}.ENDMOD;12.3.
ПОДПРОГРАММА ВЫЧИСЛЕНИЯ СИНУСОИДАЛЬНОЙ ФУНКЦИИСинусоидальная функция y = sin(x) широко используется в цифровойобработке сигналов. В данной подпрограмме она аппроксимируетсяформулой:y =sin (x)=3.140625x+0.02026367x2-5.325196x3+0.5446778x4+1.800293x5Аргументом функции является нормированная переменная x, связанная сугловой мерой −180°≤ϕ°<180° или −π≤ϕ [рад]<π соотношениями x = ϕ°/180или x = ϕ [рад]/π, −1≤ x < 1. Непосредственно вычисления по формулевыполняются для первого квадранта, соответствующего значениям 0 ≤ x ≤ 0,5или 0 ≤ ϕ°≤ 90°, 0 ≤ ϕ [рад] ≤ π/2. Для других квадрантов используютсясоотношения: sin(−ϕ)=−sin(ϕ), sin(180-ϕ)=sin(ϕ) и sin(ϕ-180)=−sin(ϕ).Подпрограмма анализирует значение аргумента x и приводит его к первомуквадранту.
Знак результата вычисления при необходимости корректируется сучетом номера квадранта. Значения x представляются в дробном формате1.15. Углу 180° в этом формате соответствует максимальное положительноезначение x 0x7FFF (примерно плюс единица), углуминус 180° -79максимальное (по абсолютной величине) отрицательное значение x 0х8000(минус единица), углу 90° отвечает 16-ричное значение x 0x400 (плюс 0,5).Коэффициенты C1 ,C 2 ,C3 ,C 4 ,C 5 аппроксимирующего полинома инициализированы в буфере sin_coef [5] памяти данных в формате 4.12, содержащем 1разряд знака, 3 разряда целой части и 12 разрядов дробной части.Функцию cos(x) можно вычислить с учетом соотношения:cos(ϕ)=sin(ϕ+π/2).Подпрограмма выполняет вычисления синуса с погрешностью в пределахдвух единиц младшего разряда.{Подпрограмма аппроксимации синусоидальной функции}.MODULE Sin_Approximation;{Параметры вызоваAX0 = аргумент х в формате 1.15Возвращаемые параметрыAR = функция у = sin(x) в формате 1.15Изменяемые регистрыAY0, AF, AR, MY1, MX1, MF, MR, SR, I3, M3, L3, CNTRВремя выполнения 25 циклов }.VAR/DM sin_coef [5];.INIT sin_coef: 0х3240,0х0053, 0хААСС, Ох08В7, 0х1ССЕ;.ENTRY sin;sin:I3=^sin_coef; {Указатель на буфер коэффициентов}М3 = 1;L3 = 0;AY0=0x4000;AR=AX0, AF=AX0 AND AY0; {проверка 2-го или 4-го квадрантов}IF NE AR=−AX0;{если да, то инвертировать выход}AY0=0x7FFF;AR=AR AND AY0;{удаление знакового бита}MY1=AR;MF=AR*MY1 (RND), MX1=DM(I3, M3); {MF = х2 , MX1= C1}MR=MX1*MY1 (SS), MX1=DM (I3, M3); {MR = C1x, MX1= C2}CNTR=3;DO approx UNTIL CE;MR=MR+MX1*MF (SS);approx: MF=AR*MF (RND), MX1=DM (I3, M3);MR=MR+MX1*MF (SS); {MR=MR+ C5 х5}SR=ASHIFT MR0 BY 3 (HI);{приведение sin(x) к}SR=SR OR LSHIFT MR0 BY 3 (LO); {формату 1.15}AR=PASS SR1;IF LT AR=PASS AY0; {если необходимо, то насыщение}80AF=PASS AX0;IF LT AR=−AR;RTS;.ENDM0D;{если необходимо, то инвертировать}12.4.
ПОДПРОГРАММА УМНОЖЕНИЯ МАТРИЦ С ОДИНАРНОЙ ТОЧНОСТЬЮДанная подпрограмма умножает 2 входные матрицы: матрицу X размераRxS (R строк, S столбцов), находящуюся в памяти данных, и матрицу Yразмера SxT (S строк, Т столбцов), находящуюся в памяти инструкций.Матрица-результат Z размера RxT (R строк, Т столбцов) записывается впамять данных.Подпрограмма требует инициализации нескольких регистров перед еевызовом (см. параметры вызова).
Регистр SE должен содержать значение, накоторое производится сдвиг результата каждого умножения для приведенияего к нужному формату. Например, для того чтобы получить матрицурезультат в формате 1.31 умножением матриц формата 1.15, нужноустановить SE в нуль.. M0DULE matmul;{Умножение матриц с одинарной точностьюSZ (i, j ) = ∑ X (i, k ) ⋅ Y (k , j ) ; i = 0...R , j = 0...T ;k =0X – матрица RxS; Y – матрица SxT ; Z – матрица RxT;Параметры вызоваI1 – указатель на Z-матрицу в памяти данныхI2 – указатель на Х-матрицу в памяти данных, сохраняемую по строкамI6 – указатель на Y-матрицу в памяти программ, сохраняемую по строкамL0, L1, L2, L4, L5, L6 = 0, М0 = 1, M1 = S, М4 = 1, M5 = Т;SE – масштабный множительCNTR = RВозвращаемые параметрыБуфер Z, заполненный по строкамИзменяемые регистрыI0, I1, I2, I4, I5, MR, MX0, MY0, SRВремя выполнения – ((S+8)×Т+4)×R+2+2 циклов;}.ENTRY spmm;spmm: DO row_loop UNTIL CE;I5=I6;{ I5 = начало Y }CNTR=M5;DO column_loop UNTIL CE;I0=I2; {Установить I0 на текущую строку X}I4=I5; {Установить I4 на текущий столбец Y}81CNTR=M1;MR=0, MX0=DM(I0,M0), MY0=PM(I4, M5);{Выборка I-го данного}DO element_loop UNTIL CE;element_loop:MR=MR+MX0*MY0(SS),MX0=DM(I0,M0),MY0=PM(I4,M5);SR=ASHIFT MR1 (HI), MY0=DM(I5, M4); {Обновление I5}SR=SR OR LSHIFT MR0 (LO); {Последний сдвиг}column_loop:DM(I1, M0)=SR1; {Сохранение результата}row_loop: MODIFY (I2, M1); {Обновление I2 на следующую строку X}RTS;.ENDM0D;КОНТРОЛЬНЫЕ ВОПРОСЫ1.
Каковы структура ассемблерной программы и основные директивы ассемблера?2. Что понимается под программным модулем и как он объявляется?3. Как объявляются константы в ассемблере ADSP-2181?4. Как объявляются переменные в ассемблере ADSP-2181?5. Как осуществляется инициализация переменных (буферов)?6. Какие директивы используются для межмодульных связей?7. Каково назначение директивы INCLUDE?8. Какие комментарии в модулях подпрограмм являются обязательными?9. Какова структура программ цифровой фильтрации?10. Что нужно изменить в главном модуле программы цифровой фильтрации приисполнении ее сигнальным процессором ADSP-2181?11. Покажите схему подключения АЦП и ЦАП при программной реализациицифровых фильтров.12.