Перейти к содержанию
    

Нужна помощь разобраться с asm рутиной FIRа

..., т.е. ушла на 1 вперед (ее начало в 0х2000). Но в приципе это кажется логично ибо изначально указатель линии задержки инкрементировался до входа в цикл (mvdd *ar1+,*ar3+%), т.е. он по идее опережает инкремент коеффициентов на 1. Вроде все логично, так ?

Если это правильно - верну обратно "оперативный" вариант и проверю еще раз...

После обсчета каждой выборки указатель внутри линии задержки должен ув-ся(или уменьшаться на единицу) и указывать на самый новый (или старый отсчет) после подгрузки очередного отсчета, а указатель на коэффициенты до повторяющихся маков всегда должен указывать на начало массива коэффициентов

 

PS Новый/старый и +- 1 зависит от того в какую сторону подгружаете отсчеты в буфер и в каком порядке у Вас лежат коэффициенты фильтра

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После обсчета каждой выборки указатель внутри линии задержки должен ув-ся(или уменьшаться на единицу) и указывать на самый новый (или старый отсчет) после подгрузки очередного отсчета, а указатель на коэффициенты до повторяющихся маков всегда должен указывать на начало массива коэффициентов

 

PS Новый/старый и +- 1 зависит от того в какую сторону подгружаете отсчеты в буфер и в каком порядке у Вас лежат коэффициенты фильтра

 

OK, в моем случае коеффициенты расположены в прямом порядке (т.е. индексация коеффициентов от 0 до 150ого идет по старшинству адресов а буфере памяти). Заполнение линии задержки тоже последовательное (от начала буфера т.е. младшего адреса к старшему). В ar0 = 1, т.е. incerement.

 

Хочу еще раз уточнить на свою тупую голову детали:

Длинна линии задержки FIRа равна его порядку (т.е. 150 в моем случае), что на 1 меньше кол-ва коеффициентов (151 у меня). Так ?

Число повторений внутреннего цикла (mac) должно быть равно порядку, т.е. 150, но т.к. инструкция rpt делает на 1 больше повторений в цикле поэтому загружаем в RC (число коефф. - 2), т.е. 149 (или число повторений должно быть равно числу коефф. ?) .

Моя проблема это то что новые входные samples загружаются в линию задержки через один адрес, а не послеовательно один адрес за другим. Это при том что адресация коеффициентво (в mac) идет вроде правильная - последовательная. Значит думаю проблема у меня где-то в соотношении числа повторений внутреннего цикла (mac) к длинне линии задержки....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз в данной реализации -> длина линии задержки (151) == числу коэффициентов FIR(151) == число маков(151)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз в данной реализации -> длина линии задержки (151) == числу коэффициентов FIR(151) == число маков(151)

 

Проверил у себя в программе - так и есть, но все-равно поинтер в линии задержки прыгает через один про загрузке след. входного sample. Странно

 

Кстати, в дебаггере при проходе цикла маков:

rpt *(_fir_ord)    ; _fir_ord = 150
mac *ar4+0%, ar3+0%, a

прохождение не заходит во внутрь самого цикла маков (ни с F10, ни с F11), посему нет возможности отследить адресацию линии задержки (ar3) внутри цикла маков...только по выходу из него...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давйте кусочек кода начиная с внешнего цикла (там где новый отсчет подгружается)

 

 

Большое спасибо, сочту за хороший урок.. :)

 

BRC предварительно загружен кол-вом samples в буфере входных данных.

_fir_ord = 150

 

; 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
    
        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

    add #1, 15, a            ; round off value in acc. A to 16 bits - replaces rnd a instruction
    sth a,*ar5+            ; store output value into data output array
fir_loop_end:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да незачта.В своем проекте дописал чуть-чуть

*.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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да незачта.В своем проекте дописал чуть-чуть

*.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:

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

 

 

Большое спасибо, проверю еще раз у меня в цельном коде на ссответствие.

 

.

..

 

Проверил - Огромное Спасибо - есть bug - у меня в начале asm кода BK загружался порядком фильтра (150) а не числом коефф. - стандартная путанница понятий (у меня порядок фильтра и кол-во коеф.. - разные вещи хоть и железно связанные друг с другом, а нередко важе в литературе говорят о них как об одном числе (но упоминая ессно о кол-ве элементов delay на 1 меньше)....вот и у нас такая путанница вышла...

 

В общем, мой большой :a14: вам, рутина работает. :biggrin:

 

Теперь приступаю к имлементации IIRов второго порядка которых у меня 15 в проэкте (все параллеьны)....подозреваю что и тут ваша помощь окажется трудно-переоценимой.... ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

 

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

 

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

 

Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового sample), т.е. таким образом экономим пункт 2).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового 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). Вроде бы не получается. По крайней мере, у меня с ходу не получилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот что должно получиться по классике (х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а начала буфера коеффициентов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Кстати, в такой реализации коефф. фильтра должны располагаться в прямом порядке в буфере - т.е. по возрастающим адресам (как и в буфере линии задержки кида подгружаются входные данные), изначально буфер задержки конечно-же обнулен.

Все правильно Вы написали, за исключением расположения к-тов в буфере. Они там в инверсном порядке должны располагаться. Иначе Вы получите:

y0=x0*h[N-1];

y1=x0*h[N-2]+x1*h[N-1];

...

И вместо свертки Вы вычисляете корреляцию.

Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет.

С инверсным расположением будет то, что надо :) Впрочем допускаю, что Вы к-ты нумеруете задом наперед :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все правильно Вы написали, за исключением расположения к-тов в буфере. Они там в инверсном порядке должны располагаться. Иначе Вы получите:

y0=x0*h[N-1];

y1=x0*h[N-2]+x1*h[N-1];

...

И вместо свертки Вы вычисляете корреляцию.

Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет.

С инверсным расположением будет то, что надо :) Впрочем допускаю, что Вы к-ты нумеруете задом наперед :)

 

Да нет, честно говоря не вижу проблемы инверсии адресации коеффициентов в данной имплементации.

Если например посмотреь только на первый цикл (для первого вסםגמםעם sample), то получается как раз

y[0] = x[0[0]h[0] (при придложенной вами инвертации порядка коефф. получили-бы: y[0] = x[0]h[N-1])

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да нет, честно говоря не вижу проблемы инверсии адресации коеффициентов в данной имплементации.

Если например посмотреь только на первый цикл (для первого вסםגמםעם 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. Там дано расположение к-тов по адресам.

Они там расположены именно в инверсном порядке.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...