|
|
  |
Нужна помощь разобраться с asm рутиной FIRа, Моя первая самостоятелсьная FIR рутина... |
|
|
|
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) к длинне линии задержки....
|
|
|
|
|
Jun 5 2007, 12:25
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(BratherLU @ Jun 5 2007, 16:03)  Еще раз в данной реализации -> длина линии задержки (151) == числу коэффициентов FIR(151) == число маков(151) Проверил у себя в программе - так и есть, но все-равно поинтер в линии задержки прыгает через один про загрузке след. входного sample. Странно Кстати, в дебаггере при проходе цикла маков: Код rpt *(_fir_ord) ; _fir_ord = 150 mac *ar4+0%, ar3+0%, a прохождение не заходит во внутрь самого цикла маков (ни с F10, ни с F11), посему нет возможности отследить адресацию линии задержки (ar3) внутри цикла маков...только по выходу из него...
|
|
|
|
|
Jun 5 2007, 13:02
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(BratherLU @ Jun 5 2007, 16:45)  Давйте кусочек кода начиная с внешнего цикла (там где новый отсчет подгружается) Большое спасибо, сочту за хороший урок.. 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:
|
|
|
|
|
Jun 5 2007, 14:07
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 5 2007, 14:52
|

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

|
Цитата(Саша Z @ Jun 3 2007, 17:35)  Кроме того, если видите у другие ошибки в коде алгоритма - буду благодарен за указание таковых... Мне кажется, у вас имеется логическая ошибка в программе фильтрации. Данные вы кладёте в циклический буфер, это хорошо, но затем вы циклически крутите буфер коэффициентов, это плохо. Должно быть так. 1) Вы записали новое данное в циклический буфер, указатель стал указывать на самую старую выборку. 2) Установили начало буфера коэффициентов. 3) Обработали 151 сампл, выдали результат, указатель опять указывает на самую старую выборку. 4) Перешли к пункту 1, пока не закончатся исходные данные.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 5 2007, 14:55
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(BratherLU @ Jun 5 2007, 18:07)  Да незачта.В своем проекте дописал чуть-чуть Код *.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 меньше)....вот и у нас такая путанница вышла... В общем, мой большой  вам, рутина работает. Теперь приступаю к имлементации IIRов второго порядка которых у меня 15 в проэкте (все параллеьны)....подозреваю что и тут ваша помощь окажется трудно-переоценимой....
|
|
|
|
|
Jun 5 2007, 15:58
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(=GM= @ Jun 5 2007, 18:52)  Мне кажется, у вас имеется логическая ошибка в программе фильтрации. Данные вы кладёте в циклический буфер, это хорошо, но затем вы циклически крутите буфер коэффициентов, это плохо.
Должно быть так.
1) Вы записали новое данное в циклический буфер, указатель стал указывать на самую старую выборку.
2) Установили начало буфера коэффициентов.
3) Обработали 151 сампл, выдали результат, указатель опять указывает на самую старую выборку.
4) Перешли к пункту 1, пока не закончатся исходные данные. Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового sample), т.е. таким образом экономим пункт 2).
|
|
|
|
|
Jun 5 2007, 18:13
|

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). Вроде бы не получается. По крайней мере, у меня с ходу не получилось.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jun 6 2007, 06:57
|
Знающий
   
Группа: Свой
Сообщений: 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а начала буфера коеффициентов.
|
|
|
|
|
Jun 6 2007, 07:28
|
Местный
  
Группа: Новичок
Сообщений: 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]; ... И вместо свертки Вы вычисляете корреляцию. Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет. С инверсным расположением будет то, что надо  Впрочем допускаю, что Вы к-ты нумеруете задом наперед
|
|
|
|
|
Jun 6 2007, 08:04
|
Знающий
   
Группа: Свой
Сообщений: 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]; ... И вместо свертки Вы вычисляете корреляцию. Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет. С инверсным расположением будет то, что надо  Впрочем допускаю, что Вы к-ты нумеруете задом наперед  Да нет, честно говоря не вижу проблемы инверсии адресации коеффициентов в данной имплементации. Если например посмотреь только на первый цикл (для первого вסםגמםעם sample), то получается как раз y[0] = x[0[0]h[0] (при придложенной вами инвертации порядка коефф. получили-бы: y[0] = x[0]h[N-1]) Вот пример такого типа реализации FIRа от TI: SPRU173 (можно скачать с TIевского сайта, или если хотите могу вам замейлить). Не вижу там намека на инвертацию последовательности коеффициентов.
|
|
|
|
|
Jun 6 2007, 08:52
|
Местный
  
Группа: Новичок
Сообщений: 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. Там дано расположение к-тов по адресам. Они там расположены именно в инверсном порядке. В тексте же программы неудачно использован симметричный фильтр. У него начало и конец абсолютно одинаковы.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|