BratherLU 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба ..., т.е. ушла на 1 вперед (ее начало в 0х2000). Но в приципе это кажется логично ибо изначально указатель линии задержки инкрементировался до входа в цикл (mvdd *ar1+,*ar3+%), т.е. он по идее опережает инкремент коеффициентов на 1. Вроде все логично, так ? Если это правильно - верну обратно "оперативный" вариант и проверю еще раз... После обсчета каждой выборки указатель внутри линии задержки должен ув-ся(или уменьшаться на единицу) и указывать на самый новый (или старый отсчет) после подгрузки очередного отсчета, а указатель на коэффициенты до повторяющихся маков всегда должен указывать на начало массива коэффициентов PS Новый/старый и +- 1 зависит от того в какую сторону подгружаете отсчеты в буфер и в каком порядке у Вас лежат коэффициенты фильтра Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба После обсчета каждой выборки указатель внутри линии задержки должен ув-ся(или уменьшаться на единицу) и указывать на самый новый (или старый отсчет) после подгрузки очередного отсчета, а указатель на коэффициенты до повторяющихся маков всегда должен указывать на начало массива коэффициентов PS Новый/старый и +- 1 зависит от того в какую сторону подгружаете отсчеты в буфер и в каком порядке у Вас лежат коэффициенты фильтра OK, в моем случае коеффициенты расположены в прямом порядке (т.е. индексация коеффициентов от 0 до 150ого идет по старшинству адресов а буфере памяти). Заполнение линии задержки тоже последовательное (от начала буфера т.е. младшего адреса к старшему). В ar0 = 1, т.е. incerement. Хочу еще раз уточнить на свою тупую голову детали: Длинна линии задержки FIRа равна его порядку (т.е. 150 в моем случае), что на 1 меньше кол-ва коеффициентов (151 у меня). Так ? Число повторений внутреннего цикла (mac) должно быть равно порядку, т.е. 150, но т.к. инструкция rpt делает на 1 больше повторений в цикле поэтому загружаем в RC (число коефф. - 2), т.е. 149 (или число повторений должно быть равно числу коефф. ?) . Моя проблема это то что новые входные samples загружаются в линию задержки через один адрес, а не послеовательно один адрес за другим. Это при том что адресация коеффициентво (в mac) идет вроде правильная - последовательная. Значит думаю проблема у меня где-то в соотношении числа повторений внутреннего цикла (mac) к длинне линии задержки.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Еще раз в данной реализации -> длина линии задержки (151) == числу коэффициентов FIR(151) == число маков(151) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Еще раз в данной реализации -> длина линии задержки (151) == числу коэффициентов FIR(151) == число маков(151) Проверил у себя в программе - так и есть, но все-равно поинтер в линии задержки прыгает через один про загрузке след. входного sample. Странно Кстати, в дебаггере при проходе цикла маков: rpt *(_fir_ord) ; _fir_ord = 150 mac *ar4+0%, ar3+0%, a прохождение не заходит во внутрь самого цикла маков (ни с F10, ни с F11), посему нет возможности отследить адресацию линии задержки (ar3) внутри цикла маков...только по выходу из него... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Давйте кусочек кода начиная с внешнего цикла (там где новый отсчет подгружается) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Давйте кусочек кода начиная с внешнего цикла (там где новый отсчет подгружается) Большое спасибо, сочту за хороший урок.. :) 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 5 июня, 2007 Опубликовано 5 июня, 2007 (изменено) · Жалоба Да незачта.В своем проекте дописал чуть-чуть *.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: Все должно работать ничего в Вашем куске не менял, указатели меняются как положено Изменено 5 июня, 2007 пользователем BratherLU Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Кроме того, если видите у другие ошибки в коде алгоритма - буду благодарен за указание таковых... Мне кажется, у вас имеется логическая ошибка в программе фильтрации. Данные вы кладёте в циклический буфер, это хорошо, но затем вы циклически крутите буфер коэффициентов, это плохо. Должно быть так. 1) Вы записали новое данное в циклический буфер, указатель стал указывать на самую старую выборку. 2) Установили начало буфера коэффициентов. 3) Обработали 151 сампл, выдали результат, указатель опять указывает на самую старую выборку. 4) Перешли к пункту 1, пока не закончатся исходные данные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Да незачта.В своем проекте дописал чуть-чуть *.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: вам, рутина работает. Теперь приступаю к имлементации IIRов второго порядка которых у меня 15 в проэкте (все параллеьны)....подозреваю что и тут ваша помощь окажется трудно-переоценимой.... ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Мне кажется, у вас имеется логическая ошибка в программе фильтрации. Данные вы кладёте в циклический буфер, это хорошо, но затем вы циклически крутите буфер коэффициентов, это плохо. Должно быть так. 1) Вы записали новое данное в циклический буфер, указатель стал указывать на самую старую выборку. 2) Установили начало буфера коэффициентов. 3) Обработали 151 сампл, выдали результат, указатель опять указывает на самую старую выборку. 4) Перешли к пункту 1, пока не закончатся исходные данные. Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового sample), т.е. таким образом экономим пункт 2). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
=GM= 0 5 июня, 2007 Опубликовано 5 июня, 2007 · Жалоба Да но буфер коефф. тоже можно крутить циклически таким образом избегая его переадресации в начале каждого цикла (каждого нового 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). Вроде бы не получается. По крайней мере, у меня с ходу не получилось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 6 июня, 2007 Опубликовано 6 июня, 2007 · Жалоба Вот что должно получиться по классике (х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а начала буфера коеффициентов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=ВН=- 0 6 июня, 2007 Опубликовано 6 июня, 2007 · Жалоба ... Кстати, в такой реализации коефф. фильтра должны располагаться в прямом порядке в буфере - т.е. по возрастающим адресам (как и в буфере линии задержки кида подгружаются входные данные), изначально буфер задержки конечно-же обнулен. Все правильно Вы написали, за исключением расположения к-тов в буфере. Они там в инверсном порядке должны располагаться. Иначе Вы получите: y0=x0*h[N-1]; y1=x0*h[N-2]+x1*h[N-1]; ... И вместо свертки Вы вычисляете корреляцию. Для симметричного фильтра это пофигу. Для анти и асимметричных фильтров - нет. С инверсным расположением будет то, что надо :) Впрочем допускаю, что Вы к-ты нумеруете задом наперед :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 6 июня, 2007 Опубликовано 6 июня, 2007 · Жалоба Все правильно Вы написали, за исключением расположения к-тов в буфере. Они там в инверсном порядке должны располагаться. Иначе Вы получите: 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евского сайта, или если хотите могу вам замейлить). Не вижу там намека на инвертацию последовательности коеффициентов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=ВН=- 0 6 июня, 2007 Опубликовано 6 июня, 2007 · Жалоба Да нет, честно говоря не вижу проблемы инверсии адресации коеффициентов в данной имплементации. Если например посмотреь только на первый цикл (для первого вסםגמםעם 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. Там дано расположение к-тов по адресам. Они там расположены именно в инверсном порядке. В тексте же программы неудачно использован симметричный фильтр. У него начало и конец абсолютно одинаковы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться