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

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

Ну давайте смотреть...

Начнем пожалуй как и вы, с базисной функции которую нужно имплементировать, т.е. конволюции сигнала с 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а начала буфера коеффициентов.

Бестолковое объяснение надо сказать, но вы правы в одном, сдвиг есть.

 

Я сказал, что указатель передвигается на х(2) и одновременно другой указатель на k(2), это так.

Но в команде mvdd *ar2+,*ar3+0% не обратил внимания на последний значок "%", означающий циклическую адресацию с индексом 1. Так что, когда указатель данных переходит на х(2) и одновременно другой указатель на k(2), данная команда для нового цикла передвигает указатель данных на х(3).

 

Кстати, вам везде можно делать такую адресацию *arn+% вместо *arn+0%, поскольку у вас индекс равен 1, заодно и ar0 не надо мучить.

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


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

Бестолковое объяснение надо сказать, но вы правы в одном, сдвиг есть.

 

Я сказал, что указатель передвигается на х(2) и одновременно другой указатель на k(2), это так.

Но в команде mvdd *ar2+,*ar3+0% не обратил внимания на последний значок "%", означающий циклическую адресацию с индексом 1. Так что, когда указатель данных переходит на х(2) и одновременно другой указатель на k(2), данная команда для нового цикла передвигает указатель данных на х(3).

 

Кстати, вам везде можно делать такую адресацию *arn+% вместо *arn+0%, поскольку у вас индекс равен 1, заодно и ar0 не надо мучить.

 

Объяснять я умею плохо, согласен, но не понял что вы имеете ввиду во втором параграфе (вы не заметили % или я не заметил ?). В целом в самой рутине ошибки нет, думаю вы уже поняли, исключая тот факт о котором упомянул =BH=, сейчас себя перепроверяю - есть подозрение что он прав насчет расположения коефф. в буфере, сейчас с этим разбираюсь. МОя рутина работает как надо (фильтр проверен по анализу результата в Матлабе на тестовом сигнале), но кажется меня спасло симметричность фильтра (был-бы он анти-симметричен - видимо не работал бы без инверсии расположения коеффициентов).

 

Сейчас проверяю...

 

P.S. ar0 не мучается. В него одноразово загружена 1 и все. Хотя оно может работать и как вы сказали (может быть), т.е. без ar0, я еще слабо знаю семантику данного ассемблера.

 

Плохо, что не видите. Вот и посмотрите на 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. Там дано расположение к-тов по адресам.

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

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

 

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

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


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

... не понял что вы имеете ввиду во втором параграфе (вы не заметили % или я не заметил ?). В целом в самой рутине ошибки нет, думаю вы уже поняли, исключая тот факт о котором упомянул =BH=, сейчас себя перепроверяю - есть подозрение что он прав насчет расположения коэфф. в буфере, сейчас с этим разбираюсь. Моя рутина работает как надо (фильтр проверен по анализу результата в Матлабе на тестовом сигнале), но кажется меня спасло симметричность фильтра (был-бы он анти-симметричен - видимо не работал бы без инверсии расположения коэффициентов).

1) Не заметил я, отсюда весь сыр-бор загорелся(:-).

2) Не путайте нумерацию коэффициентов и содержимое этих самых коэффициентов. Скажем, никто не запрещает загрузить их задом-наперед.

3) Ошибок вроде нет, но программу фильтрации вам ещё шлифовать и шлифовать(:-).

Например, вместо rptb fir_loop_end-1 можно использовать rptbd fir_loop_end-1, имеем уменьшение на 2 МС.

 

Кстати, давно не работал с этим процом, компилятор принимает rptz a,_fir_ord-1 вместо rptz a,#_fir_ord-1? Вроде бы в команде должна стоять решетка (#).

ar0 не мучается. В него одноразово загружена 1 и все

Одна команда, одно слово, ни вреда, ни пользы, хотя можно обойтись, если подумать.

Давайте вместо "не мучить" поставлю "не использовать", пойдёт?

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


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

1) Не заметил я, отсюда весь сыр-бор загорелся(:-).

2) Не путайте нумерацию коэффициентов и содержимое этих самых коэффициентов. Скажем, никто не запрещает загрузить их задом-наперед.

3) Ошибок вроде нет, но программу фильтрации вам ещё шлифовать и шлифовать(:-).

Например, вместо rptb fir_loop_end-1 можно использовать rptbd fir_loop_end-1, имеем уменьшение на 2 МС.

 

Кстати, давно не работал с этим процом, компилятор принимает rptz a,_fir_ord-1 вместо rptz a,#_fir_ord-1? Вроде бы в команде должна стоять решетка (#).

 

Одна команда, одно слово, ни вреда, ни пользы, хотя можно обойтись, если подумать.

Давайте вместо "не мучить" поставлю "не использовать", пойдёт?

 

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

 

Насчет комамнды, у меня нужна косвенная адресация для _fir_ord (ибо данная константа определена во внешнем C файле и передается в asm код). Посему заменена на:

ld #0, а
rpt *(_fir_ord)

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


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

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

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

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

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

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

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

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

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

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