реклама на сайте
подробности

 
 
> Нужна помощь разобраться с asm рутиной FIRа, Моя первая самостоятелсьная FIR рутина...
Саша Z
сообщение Jun 3 2007, 18:35
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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 ? Она-то вроде перекидывает из памяти в память, и вроде у меня так и есть в коде.... cranky.gif Что я в упор не вижу ?????

Кроме того, если видите у другие ошибки в коде алгоритма - буду благодарен за указание таковых...

P.S. Все переменные в данном asm определены в основном С коде.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BratherLU
сообщение Jun 5 2007, 14:07
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 16-05-06
Пользователь №: 17 126



Да незачта.В своем проекте дописал чуть-чуть
Код
*.c
...
const unsigned short fir_ord=150;
...
*.asm
    .ref _fir_ord
    .ref _IN_BUFF
    .ref _OUT_BUFF
    ...;Only for test in Simulator
    stm        #0x2000,ar4
    stm        #0x2100,ar3

    stm        #_IN_BUFF,ar2
    stm        #_OUT_BUFF,ar5

    stm        #151,bk
    stm        #1,ar0
    nop
;дальше Ваш код без изменений
Filtration
    rptb fir_loop_end-1       ; repeat FIR routine for entire processing data buffer
    mvdd *ar2+,*ar3+0%        ; load next input sample from input proc. array into delay line array
   ;ar3 указывает на самый старый отсчет все ОК
    ld #0, a                ; reset A
    rpt *(_fir_ord)                         ; FIR order (here equal to the number of FIR coefs)
                                 ;iterations per each input data sample
    mac *ar4+0%,*ar3+0%,a       ; MAC operation on cyclic delay line and coeff. arrays
;ar3 снова указывает на тот же самый старый отсчет все ОК
    add #1, 15, a           ; Это я бы убрал на время отладки
    sth a,*ar5+           ; store output value into data output array
fir_loop_end:

Все должно работать ничего в Вашем куске не менял, указатели меняются как положено

Сообщение отредактировал BratherLU - Jun 5 2007, 14:14
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 5 2007, 14:52
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Саша Z @ Jun 3 2007, 17:35) *
Кроме того, если видите у другие ошибки в коде алгоритма - буду благодарен за указание таковых...

Мне кажется, у вас имеется логическая ошибка в программе фильтрации. Данные вы кладёте в циклический буфер, это хорошо, но затем вы циклически крутите буфер коэффициентов, это плохо.

Должно быть так.

1) Вы записали новое данное в циклический буфер, указатель стал указывать на самую старую выборку.

2) Установили начало буфера коэффициентов.

3) Обработали 151 сампл, выдали результат, указатель опять указывает на самую старую выборку.

4) Перешли к пункту 1, пока не закончатся исходные данные.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Jun 5 2007, 15:58
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(=GM= @ Jun 5 2007, 18:52) *
Мне кажется, у вас имеется логическая ошибка в программе фильтрации. Данные вы кладёте в циклический буфер, это хорошо, но затем вы циклически крутите буфер коэффициентов, это плохо.

Должно быть так.

1) Вы записали новое данное в циклический буфер, указатель стал указывать на самую старую выборку.

2) Установили начало буфера коэффициентов.

3) Обработали 151 сампл, выдали результат, указатель опять указывает на самую старую выборку.

4) Перешли к пункту 1, пока не закончатся исходные данные.


Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового sample), т.е. таким образом экономим пункт 2).
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jun 5 2007, 18:13
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Саша Z @ Jun 5 2007, 15:58) *
Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового sample), т.е. таким образом экономим пункт 2).

Вот что должно получиться по классике (х1 - самая старая выборка)

Код
x1 x2 x3 x4 x5 x6 x6 x8 x9 - буфер входных выборок
k1 k2 k3 k4 k5                   - буфер коэффициентов

На первом этапе j=0 вычисляем сумму y(j) = Σx(i+j)•k(i), i=0,1,…,5. То есть

y(0)=x(1)•k(1)+x(2)•k(2)+x(3)•k(3)+x(4)•k(4)+x(5)•k(5)

На втором этапе j=1 самая старая выборка х(1) уйдёт в небытие, получим

x2 x3 x4 x5 х6 х7 х8 х9 - буфер входных выборок
k1 k2 k3 k4 k5               - буфер коэффициентов

y(1)=x(2)•k(1)+x(3)•k(2)+x(4)•k(3)+x(5)•k(4)+x(6)•k(5)

На третьем этапе j=2 самая старая выборка х(2) уйдёт в небытие, получим

x3 x4 x5 х6 х7 х8 х9 - буфер входных выборок
k1 k2 k3 k4 k5          - буфер коэффициентов

y(2)=x(3)•k(1)+x(4)•k(2)+x(5)•k(3)+x(6)•k(7)+x(8)•k(5)

Ну и так далее.

А что у вас? Указатель передвигается на х(2) и одновременно другой указатель на k(2). Вроде бы не получается. По крайней мере, у меня с ходу не получилось.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Jun 6 2007, 06:57
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(=GM= @ Jun 5 2007, 22:13) *
Вот что должно получиться по классике (х1 - самая старая выборка)

Код
x1 x2 x3 x4 x5 x6 x6 x8 x9 - буфер входных выборок
k1 k2 k3 k4 k5                   - буфер коэффициентов

На первом этапе j=0 вычисляем сумму y(j) = Σx(i+j)•k(i), i=0,1,…,5. То есть

y(0)=x(1)•k(1)+x(2)•k(2)+x(3)•k(3)+x(4)•k(4)+x(5)•k(5)

На втором этапе j=1 самая старая выборка х(1) уйдёт в небытие, получим

x2 x3 x4 x5 х6 х7 х8 х9 - буфер входных выборок
k1 k2 k3 k4 k5               - буфер коэффициентов

y(1)=x(2)•k(1)+x(3)•k(2)+x(4)•k(3)+x(5)•k(4)+x(6)•k(5)

На третьем этапе j=2 самая старая выборка х(2) уйдёт в небытие, получим

x3 x4 x5 х6 х7 х8 х9 - буфер входных выборок
k1 k2 k3 k4 k5          - буфер коэффициентов

y(2)=x(3)•k(1)+x(4)•k(2)+x(5)•k(3)+x(6)•k(7)+x(8)•k(5)

Ну и так далее.

А что у вас? Указатель передвигается на х(2) и одновременно другой указатель на k(2). Вроде бы не получается. По крайней мере, у меня с ходу не получилось.



Ну давайте смотреть...
Начнем пожалуй как и вы, с базисной функции которую нужно имплементировать, т.е. конволюции сигнала с transfer function фильтра, то бишь его коеффициентами:

y[n] = x[n]h[0] + x[n-1]h[1] + x[n-2]h[2] +....+x[n-(N-1)]h[N-1]

где: x - samples вхдпдного сигнала, h - коефф. transfer function фильтра, y - ессно выходные samples.

значит:
y[0] = x[0]h[0] + 0h[1] + 0h[2]+ ...+ 0 = x[0]h[0]
y[1] = x[1]h[0] + x[0]h[1]
y[2] = x[2]h[0] + x[1]h[1] + x[0]h[2]
y[3] = x[3]h[0] + x[2]h[1] + x[1]h[2] + x[0]h[3]
и т.д.

В аккумуляторе каждый раз выполняется:
y[n] = h[n]х[n-i] где i - индексация коефф. фильтра.
Кстати, в такой реализации коефф. фильтра должны располагаться в прямом порядке в буфере - т.е. по возрастающим адресам (как и в буфере линии задержки кида подгружаются входные данные), изначально буфер задержки конечно-же обнулен.
Как мы знаем, всегда выполняется полное-кол-во итераций (согласно порядку/длинне фильтра) для каждого нового sample, значит pointer в буфере коефф. должен всегда проходить полный цикл и к началу следующего возвращаться обратно на первый коеффициент. Что и делает циркулярная адресация буфера коеффициентов. Длинна цирк. адресации буфера коефф. и линии задержки - одинакова (что дает возможность одновременной циркуляции по единиму циклу в BK), но в линию задержки, как вы правильно сказали, каждый новый цикл подгружается новый input.
В вашем примере вы ведь тоже в буфере коефф. каждый раз (после каждого цикла) возвращаетесь на начало (т.е. на первый коефф.), но делаете видимо это отдельной инструкцией загрузки pointerа начала буфера коеффициентов.
Go to the top of the page
 
+Quote Post
-=ВН=-
сообщение Jun 6 2007, 07:28
Сообщение #7


Местный
***

Группа: Новичок
Сообщений: 210
Регистрация: 3-11-06
Пользователь №: 21 936



Цитата(Саша Z @ Jun 6 2007, 10:57) *
...
Кстати, в такой реализации коефф. фильтра должны располагаться в прямом порядке в буфере - т.е. по возрастающим адресам (как и в буфере линии задержки кида подгружаются входные данные), изначально буфер задержки конечно-же обнулен.

Все правильно Вы написали, за исключением расположения к-тов в буфере. Они там в инверсном порядке должны располагаться. Иначе Вы получите:
y0=x0*h[N-1];
y1=x0*h[N-2]+x1*h[N-1];
...
И вместо свертки Вы вычисляете корреляцию.
Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет.
С инверсным расположением будет то, что надо smile.gif Впрочем допускаю, что Вы к-ты нумеруете задом наперед smile.gif
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Jun 6 2007, 08:04
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(-=ВН=- @ Jun 6 2007, 11:28) *
Все правильно Вы написали, за исключением расположения к-тов в буфере. Они там в инверсном порядке должны располагаться. Иначе Вы получите:
y0=x0*h[N-1];
y1=x0*h[N-2]+x1*h[N-1];
...
И вместо свертки Вы вычисляете корреляцию.
Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет.
С инверсным расположением будет то, что надо smile.gif Впрочем допускаю, что Вы к-ты нумеруете задом наперед smile.gif


Да нет, честно говоря не вижу проблемы инверсии адресации коеффициентов в данной имплементации.
Если например посмотреь только на первый цикл (для первого вסםגמםעם sample), то получается как раз
y[0] = x[0[0]h[0] (при придложенной вами инвертации порядка коефф. получили-бы: y[0] = x[0]h[N-1])

Вот пример такого типа реализации FIRа от TI: SPRU173 (можно скачать с TIевского сайта, или если хотите могу вам замейлить). Не вижу там намека на инвертацию последовательности коеффициентов.
Go to the top of the page
 
+Quote Post
-=ВН=-
сообщение Jun 6 2007, 08:52
Сообщение #9


Местный
***

Группа: Новичок
Сообщений: 210
Регистрация: 3-11-06
Пользователь №: 21 936



Цитата(Саша Z @ Jun 6 2007, 12:04) *
Да нет, честно говоря не вижу проблемы инверсии адресации коеффициентов в данной имплементации.
Если например посмотреь только на первый цикл (для первого вסםגמםעם sample), то получается как раз
y[0] = x[0[0]h[0] (при придложенной вами инвертации порядка коефф. получили-бы: y[0] = x[0]h[N-1])

Вот пример такого типа реализации FIRа от TI: SPRU173 (можно скачать с TIевского сайта, или если хотите могу вам замейлить). Не вижу там намека на инвертацию последовательности коеффициентов.

Плохо, что не видите. Вот и посмотрите на 1 цикл.
На примере 4-х точечного фильтра.
К-ты фильтра h0,h1,h2,h3. h0 в младшем адресе, h3 в старшем. AR4 указывает на h0.
Буфер данных, тоже 4-х точечный, располагаемый по адресам
A0-A3.
Изначально буфер обнулен.
В AR3 содержится адрес A0 до записи первого входного отсчета.
Как только Вы его записали, AR3 станет равным A1.
Вот и смотрите. Первое выходное значение будет h0*[A1]+h1*[A2]+h2*[A3]+h3*[A0].
Здесь под [A0],[A1],[A2],[A3] обозначено содержимое ячеек по адресам A0-A3.
Т.к. по адресам A1-A3 находится 0, а в ячейке с адресом A0 находится x0, то в результате получается h3*x0.
А техасовский пример Вы зря упомянули. Вы с ним не разобрались совершенно. Я даже не поленился его посмотреть. Там все абсолютно правильно. Посмотрите хотя бы картинку на странице 77. Там дано расположение к-тов по адресам.
Они там расположены именно в инверсном порядке.
В тексте же программы неудачно использован симметричный фильтр. У него начало и конец абсолютно одинаковы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Саша 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 4 2007, 14:13
|- - Саша Z   Цитата(BratherLU @ Jun 4 2007, 18:13) В Д...   Jun 4 2007, 18:18
|- - BratherLU   Цитата(Саша Z @ Jun 4 2007, 22:18) ..., т...   Jun 5 2007, 08:49
|- - Саша Z   Цитата(BratherLU @ Jun 5 2007, 12:49) Пос...   Jun 5 2007, 11:48
- - 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
|- - =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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016