|
Нужна помощь разобраться с asm рутиной FIRа, Моя первая самостоятелсьная FIR рутина... |
|
|
|
Jun 3 2007, 18:35
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
После долгих моих тугодумных мук родил FIR код в asm который будет част проэкта (вызывается из кода С). Почему-то после добавления ее в проэкт (данного файла asm) - проэкт не компилируется - падает ессно на этой рутине выдавая кучу ошибок. Первая из них весьма странная мне, не могу понять что его не устраивает. Может подскажете чего я не вижу: Код .mmregs .global _p_buffer_in,_p_buffer_out,_dline,_fcoeff,_fir_ord,_p_buff_lenth .global _fir_processing
_fir_processing: ; saving regs content into stack pshm ar0; used as delay line and coeff. cycling addressing increment pshm ar1; holds input data array start address pshm ar2 ; holds pointer to filter coeff. array addressing pshm ar3; holds pointer to delay line array addressing pshm ar4; holds output data array start address pshm ar5; holds output data array nop nop ; Initialization stm #1,ar0 ;set increment step for cycling buffers mvdm *(_fir_ord),BK ;set cyclic buffer size (for delay line and coeff buffer) stm #_p_buff_in,ar1 ;load data_in array start address stm #_fcoeff,ar2 ;load coeff. array start address stm #_dline,ar3 ;load delay line array start address stm #_p_buffer_out,ar4 ;load output data buffer array address mvdm *(_p_buff_length)-1,brc ;load BRC with processing data block length (PROC_BUFFER_LENGTH) nop nop ; Filtration rptb fir_loop_end-1 ; repeat FIR routine for entire processing data buffer mvdd *ar1+,*ar3+% ; load next input sample from input proc. array into delay line array rptz a,_fir_ord-1 ; FIR order less 1 iterations per each input data sample mac *ar2+0%,*ar3+0%,a ; MAC operation on cyclic delay line and coeff. arrays rnd a ; round off value in acc. A to 16 bits sth a,*ar4+ ; store output value into data output array fir_loop_end: popm ar5 popm ar4 popm ar3 popm ar2 popm ar1 popm ar0 Первая ошибка которую выдает компилятор: Цитата > ERROR ! at line 29: [E0004] Expecting dual memory addressing mvdd *ar1+, *ar3+% Дальше еще есть кучу ошибок, подозреваю что некоторые завязаны на предыдущих, посему буду исправлять по одной от первой к последней с перекомпиляцией после каждой. Итак, что ему не нравиться в mvdd ? Она-то вроде перекидывает из памяти в память, и вроде у меня так и есть в коде....  Что я в упор не вижу ????? Кроме того, если видите у другие ошибки в коде алгоритма - буду благодарен за указание таковых... P.S. Все переменные в данном asm определены в основном С коде.
|
|
|
|
|
 |
Ответов
|
Jun 4 2007, 14:13
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126

|
В Данной реализации длина линии задержки==число коэффициентов FIR А так совет пусть не эффективно но наглядно - отлаживайтесь по частям - добейтесь, чтоб после обсчета ОДНОЙ выборки у Вас указатели внутри буферов оказались там где должны оказаться раз уж взялись за циклическую адрессацию. Ну типа -> ... инициализация ar3,ar4, ... stm #1,ar0 stm #(число коэффициентов FIR),bk stm #(число коэффициентов FIR -1),brc ld #0x00,a nop nop ... ;//(подгружаем отсчет в линию задержки) ld #0x00,a rptb _loop_end-1 mac *ar4+0%,*ar3+0%,a _loop_end ;//(указатели ar4, ar3 при таком контексте будет такими же как и до rptb) ... и т.д. Смотрите в симуляторе как где и что меняется и где заканчивается. Заведется это - перепишите уже как Вам нравится с использованием rpt внутри и rptb снаружи На перед скажу, если Ваш FIR считает правильно то подав на вход сигнал - дельта функцию (единичный импульс) на выходе получите вектор коэффициентов фильтра
Сообщение отредактировал BratherLU - Jun 4 2007, 14:17
|
|
|
|
|
Jun 4 2007, 18:18
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(BratherLU @ Jun 4 2007, 18:13)  В Данной реализации длина линии задержки==число коэффициентов FIR А так совет пусть не эффективно но наглядно - отлаживайтесь по частям - добейтесь, чтоб после обсчета ОДНОЙ выборки у Вас указатели внутри буферов оказались там где должны оказаться раз уж взялись за циклическую адрессацию. Ну типа -> ... инициализация ar3,ar4, ... stm #1,ar0 stm #(число коэффициентов FIR),bk stm #(число коэффициентов FIR -1),brc ld #0x00,a nop nop ... ;//(подгружаем отсчет в линию задержки) ld #0x00,a rptb _loop_end-1 mac *ar4+0%,*ar3+0%,a _loop_end ;//(указатели ar4, ar3 при таком контексте будет такими же как и до rptb) ... и т.д. Смотрите в симуляторе как где и что меняется и где заканчивается. Заведется это - перепишите уже как Вам нравится с использованием rpt внутри и rptb снаружи На перед скажу, если Ваш FIR считает правильно то подав на вход сигнал - дельта функцию (единичный импульс) на выходе получите вектор коэффициентов фильтра Да, спасибо, так и сделал (проверочную рутину с rptb). по выходу из цикла (_loop_end), ar4 (коефф.) действительно вернулся на начало (0х2100) а вот ar3 (линия задержки) оказалась на 0х2001, т.е. ушла на 1 вперед (ее начало в 0х2000). Но в приципе это кажется логично ибо изначально указатель линии задержки инкрементировался до входа в цикл (mvdd *ar1+,*ar3+%), т.е. он по идее опережает инкремент коеффициентов на 1. Вроде все логично, так ? Если это правильно - верну обратно "оперативный" вариант и проверю еще раз... Насчет проверки рутины подачей импульса - это вы правы, импульс на входе LTI системы (которой и являются наши фильтры) даст передаточную функцию системы, то бишь коеффициенты фильтра...хороший способ само-проверки...
|
|
|
|
|
Jun 5 2007, 08:49
|
Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126

|
Цитата(Саша Z @ Jun 4 2007, 22:18)  ..., т.е. ушла на 1 вперед (ее начало в 0х2000). Но в приципе это кажется логично ибо изначально указатель линии задержки инкрементировался до входа в цикл (mvdd *ar1+,*ar3+%), т.е. он по идее опережает инкремент коеффициентов на 1. Вроде все логично, так ? Если это правильно - верну обратно "оперативный" вариант и проверю еще раз... После обсчета каждой выборки указатель внутри линии задержки должен ув-ся(или уменьшаться на единицу) и указывать на самый новый (или старый отсчет) после подгрузки очередного отсчета, а указатель на коэффициенты до повторяющихся маков всегда должен указывать на начало массива коэффициентов PS Новый/старый и +- 1 зависит от того в какую сторону подгружаете отсчеты в буфер и в каком порядке у Вас лежат коэффициенты фильтра
|
|
|
|
|
Jun 5 2007, 11:48
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(BratherLU @ Jun 5 2007, 12:49)  После обсчета каждой выборки указатель внутри линии задержки должен ув-ся(или уменьшаться на единицу) и указывать на самый новый (или старый отсчет) после подгрузки очередного отсчета, а указатель на коэффициенты до повторяющихся маков всегда должен указывать на начало массива коэффициентов
PS Новый/старый и +- 1 зависит от того в какую сторону подгружаете отсчеты в буфер и в каком порядке у Вас лежат коэффициенты фильтра OK, в моем случае коеффициенты расположены в прямом порядке (т.е. индексация коеффициентов от 0 до 150ого идет по старшинству адресов а буфере памяти). Заполнение линии задержки тоже последовательное (от начала буфера т.е. младшего адреса к старшему). В ar0 = 1, т.е. incerement. Хочу еще раз уточнить на свою тупую голову детали: Длинна линии задержки FIRа равна его порядку (т.е. 150 в моем случае), что на 1 меньше кол-ва коеффициентов (151 у меня). Так ? Число повторений внутреннего цикла (mac) должно быть равно порядку, т.е. 150, но т.к. инструкция rpt делает на 1 больше повторений в цикле поэтому загружаем в RC (число коефф. - 2), т.е. 149 (или число повторений должно быть равно числу коефф. ?) . Моя проблема это то что новые входные samples загружаются в линию задержки через один адрес, а не послеовательно один адрес за другим. Это при том что адресация коеффициентво (в mac) идет вроде правильная - последовательная. Значит думаю проблема у меня где-то в соотношении числа повторений внутреннего цикла (mac) к длинне линии задержки....
|
|
|
|
Сообщений в этой теме
Саша Z Нужна помощь разобраться с asm рутиной FIRа Jun 3 2007, 18:35 BratherLU 1 - В mvdd можно использовать только регистры ar... Jun 4 2007, 05:16 Саша Z Цитата(BratherLU @ Jun 4 2007, 09:16) 1 -... Jun 4 2007, 05:59 BratherLU В Conventions описано как праввильно делать вызов ... Jun 4 2007, 08:54 Саша Z Цитата(BratherLU @ Jun 4 2007, 12:54) В C... Jun 4 2007, 10:14 BratherLU mvdk *(_p_buff_length-1),brc сорри Вас запутал и... Jun 4 2007, 11:06 Саша Z Цитата(BratherLU @ Jun 4 2007, 15:06) mvd... Jun 4 2007, 11:27 BratherLU ld #0x00,a
rpt *(_fir_ord)
rptz действительно не ... Jun 4 2007, 11:58 Саша Z Цитата(BratherLU @ Jun 4 2007, 15:46) ld ... Jun 4 2007, 12:03 BratherLU Коэффициенты тоже должны быть выровнены по соответ... Jun 4 2007, 12:07 Саша Z Цитата(BratherLU @ Jun 4 2007, 16:07) Коэ... Jun 4 2007, 12:28 BratherLU Еще смотрите - что у вас в BK и в ar0 если все ок ... Jun 4 2007, 12:43 Саша Z Цитата(BratherLU @ Jun 4 2007, 16:43) Еще... Jun 4 2007, 13:07 BratherLU Еще раз в данной реализации -> длина линии заде... Jun 5 2007, 12:03 Саша Z Цитата(BratherLU @ Jun 5 2007, 16:03) Еще... Jun 5 2007, 12:25 BratherLU Давйте кусочек кода начиная с внешнего цикла (там ... Jun 5 2007, 12:45 Саша Z Цитата(BratherLU @ Jun 5 2007, 16:45) Дав... Jun 5 2007, 13:02 BratherLU Да незачта.В своем проекте дописал чуть-чуть
Код*.... Jun 5 2007, 14:07 =GM= Цитата(Саша Z @ Jun 3 2007, 17:35) Кроме ... Jun 5 2007, 14:52  Саша Z Цитата(=GM= @ Jun 5 2007, 18:52) Мне каже... Jun 5 2007, 15:58   =GM= Цитата(Саша Z @ Jun 5 2007, 15:58) Да но ... Jun 5 2007, 18:13    Саша Z Цитата(=GM= @ Jun 5 2007, 22:13) Вот что ... Jun 6 2007, 06:57     -=ВН=- Цитата(Саша Z @ Jun 6 2007, 10:57) ...
Кс... Jun 6 2007, 07:28      Саша Z Цитата(-=ВН=- @ Jun 6 2007, 11... Jun 6 2007, 08:04       -=ВН=- Цитата(Саша Z @ Jun 6 2007, 12:04) Да нет... Jun 6 2007, 08:52     =GM= Цитата(Саша Z @ Jun 6 2007, 05:57) Ну дав... Jun 6 2007, 09:10      Саша Z Цитата(=GM= @ Jun 6 2007, 13:10) Бестолко... Jun 6 2007, 09:33       =GM= Цитата(Саша Z @ Jun 6 2007, 08:33) ... не... Jun 6 2007, 10:01        Саша Z Цитата(=GM= @ Jun 6 2007, 14:01) 1) Не за... Jun 6 2007, 10:36 Саша Z Цитата(BratherLU @ Jun 5 2007, 18:07) Да ... Jun 5 2007, 14:55
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|