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

Как маштабируем результат фильтра ?

Не могу сообразить что-то: есть FIR в ассемблере 16-битного процессора (fixed point), результат каждого последующего sample записывается в аккумуляторе который скажем 32 бит, из которого его нужно сохраняет в буфер результатов. Не догоняю как правильно маштабировать результат, т.е. как брать только старшие знАчимые 16 бит. Нужно-ли определять или старшие 16 бит аккумулятора = 0, то брать нижнее слово, если-же есть значимые биты в старшем слове аккумулятора то сдвигат его влево пока старший знАчимый бит не станет битом 31 и затем брать старшее слово из аккумлятора ?

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


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

если данные напр. 12бит коэфф. 12бит... произведение 24 ...

считаем в 32 битах

(считаем весь фильтр без округления)

точка округления - отбрасывания зависит от длины фильтра

(надо помнить, что одно сложение может добавить 1 бит)

напр при длине фильтра 64 -в худшем случае добавляется 6 бит

итого 30 бит значащих....

что не надо отбрасываем(округляем ) снизу....

старшие тоже убиваем....оставляем сколько надо значащих....

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

и поэтому там может быть напр. 0x0 или 0xF)

 

вариант - коэффициенты фильтра нормированы на единичный коэфф. передачи....

тогда запас аккумулятора по сложению - может быть меньше

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


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

если данные напр. 12бит коэфф. 12бит... произведение 24 ...

считаем в 32 битах

(считаем весь фильтр без округления)

точка округления - отбрасывания зависит от длины фильтра

(надо помнить, что одно сложение может добавить 1 бит)

напр при длине фильтра 64 -в худшем случае добавляется 6 бит

итого 30 бит значащих....

что не надо отбрасываем(округляем ) снизу....

старшие тоже убиваем....оставляем сколько надо значащих....

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

и поэтому там может быть напр. 0x0 или 0xF)

 

вариант - коэффициенты фильтра нормированы на единичный коэфф. передачи....

тогда запас аккумулятора по сложению - может быть меньше

 

Спасибо.

У меня на данный момент 10 бит коэфф. и 10 бит данные, длинна фильтра = 150 (точнее порядок = 150, значит 151 коэффициент). Значит на основании сказанного вами: произведение 20 бит + 8 бит на сложение (worst case) и того имеем до 28 бит не учитывая старший бит знака, так ? Если это правильно, то нужно видимобрать старший бит аккумулятора (знаковый), к нему пристыковывать 15 верхних бит из тех 28и, остальное отбрасывать, я ошибаюсь ?

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


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

Саша Z>Если это правильно, то нужно видимобрать старший бит аккумулятора (знаковый), к нему пристыковывать 15 верхних бит из тех 28и, остальное отбрасывать, я ошибаюсь ?

 

я думаю, что если вы честно умножаете 10x10 (в дополнительный коде)в 32битовой сетке, то происходит "расширение" знака - т.е. в результате перемножения все старшие биты(выше 20_го) - знаковые

...

поэтому наверно можно брать просто столько бит сколько надо...

с учетом нормировки фильтра (если это 1 ), то надо брать начиная с 20+1 и те, которые ниже...

все это в случае если данные у вас в дополнительном коде!

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


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

Не могу сообразить что-то: есть FIR в ассемблере 16-битного процессора (fixed point), результат каждого последующего sample записывается в аккумуляторе который скажем 32 бит, из которого его нужно сохраняет в буфер результатов. Не догоняю как правильно маштабировать результат, т.е. как брать только старшие знАчимые 16 бит. Нужно-ли определять или старшие 16 бит аккумулятора = 0, то брать нижнее слово, если-же есть значимые биты в старшем слове аккумулятора то сдвигат его влево пока старший знАчимый бит не станет битом 31 и затем брать старшее слово из аккумлятора ?

Ведь объяснял же Вам. Суммируете модули коэффициентов и сравнивайте результат с 1. Из этого элементарно определяется разрядность аккумулятора, гарантирующая непереполнение. Старшие разряды и сохраняете. Все.

В приложении к Вашим 10 разрядным к-там и данным единица занимает 20 разрядов (умножитель в режиме fractional, к-ты имеют формат 1.9, данные 1.9, результат умножения 1.19). Получите сумму меньшую единицы - значит 20 разрядов Вам хватит. Сохраняйте старшие из этих 20 разрядов. Получите сумму большую единицы - ее двоичный логарифм округленный вверх до ближайшего целого даст Вам число дополнительных, свыше 20, разрядов. Сохраняйте старшие разряды уже из этого числа разрядов.

Совершенно необязательно дополнительные 8 разрядов при длине фильтра 150.

При длине 150 и 10 р. к-тах и данных Вы до 32-х разрядной границы аккумулятора просто никогда не доберетесь. Сумма модулей и покажет Вам, до какой границы Вы доберетесь, сколько останется до 32-х разрядов. Остаток можете смело добавить на разрядность к-тов.

Сумма модулей отсчетов импульсной характеристики цифрового фильтра является критерием устойчивости этого самого фильтра. Любого, и КИХ (FIR) и БИХ (IIR). Если сумма меньше 1, то фильтр устойчив. Из чего и следует, что для КИХ фильтра, который устойчив всегда, эта сумма модулей есть просто напроосто максимально возможное число на выходе фильтра. Поэтому она и может быть использована для расчета выходной, "непереполняющейся", разрядности, или для определения разрядности к-тов и/или данных, гарантирующей неперпеолнение при выбранной разрядности аккумулятора.

Вычислять сумму модулей - все равно, что подать на вход фильтра сигнал, являющийся знаком импульсной характеристики. Т.е. сигнал по знаку повтояет импульсную характеристику.

Для БИХ фильтров более удобный критерий устойчивости - положение его полюсов.

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

Подать ему на вход единичный импульс (дельта-импульс) и записать отклик до тех пор, пока он не спадет до малого уровня. Это отрезок импульсной характеристики. Ее начало. Вот найти сумму ее модулей, взять запас, поскольку это только отрезок, хотя и несущий основную энергию, но все же не вся ИХ. И сравнить с 1.

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


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

Ведь объяснял же Вам. Суммируете модули коэффициентов и сравнивайте результат с 1. Из этого элементарно определяется разрядность аккумулятора, гарантирующая непереполнение. Старшие разряды и сохраняете. Все.

В приложении к Вашим 10 разрядным к-там и данным единица занимает 20 разрядов (умножитель в режиме fractional, к-ты имеют формат 1.9, данные 1.9, результат умножения 1.19). Получите сумму меньшую единицы - значит 20 разрядов Вам хватит. Сохраняйте старшие из этих 20 разрядов. Получите сумму большую единицы - ее двоичный логарифм округленный вверх до ближайшего целого даст Вам число дополнительных, свыше 20, разрядов. Сохраняйте старшие разряды уже из этого числа разрядов.

Совершенно необязательно дополнительные 8 разрядов при длине фильтра 150.

При длине 150 и 10 р. к-тах и данных Вы до 32-х разрядной границы аккумулятора просто никогда не доберетесь. Сумма модулей и покажет Вам, до какой границы Вы доберетесь, сколько останется до 32-х разрядов. Остаток можете смело добавить на разрядность к-тов.

Сумма модулей отсчетов импульсной характеристики цифрового фильтра является критерием устойчивости этого самого фильтра. Любого, и КИХ (FIR) и БИХ (IIR). Если сумма меньше 1, то фильтр устойчив. Из чего и следует, что для КИХ фильтра, который устойчив всегда, эта сумма модулей есть просто напроосто максимально возможное число на выходе фильтра. Поэтому она и может быть использована для расчета выходной, "непереполняющейся", разрядности, или для определения разрядности к-тов и/или данных, гарантирующей неперпеолнение при выбранной разрядности аккумулятора.

Вычислять сумму модулей - все равно, что подать на вход фильтра сигнал, являющийся знаком импульсной характеристики. Т.е. сигнал по знаку повтояет импульсную характеристику.

Для БИХ фильтров более удобный критерий устойчивости - положение его полюсов.

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

Подать ему на вход единичный импульс (дельта-импульс) и записать отклик до тех пор, пока он не спадет до малого уровня. Это отрезок импульсной характеристики. Ее начало. Вот найти сумму ее модулей, взять запас, поскольку это только отрезок, хотя и несущий основную энергию, но все же не вся ИХ. И сравнить с 1.

 

 

А кстати (сорри, а кажется начинаю идти по кругу... :cranky: ), если учесть тот факт что в плане маштабирования входного сигнала я его умножаю, скажем на 2^12 после чего делаю round (в fixed point), коефф. умножаю на 2^10 и round, почему будет не правильно просто результат каждого цикла (т.е. выходной samlpe) в аккумуляторе делить на 2^10 (сдвиг на 10 разрядов вправо) - компенсация мштабирования коеффицеинтов, брать нижнее слово (нижние 16 бит) и затем при компоновке сигнала обратно в исходный формат (flоаting) делить результат на 2^12 (компенсация маштабирования входнго сигнала) ? Я говорю только о FIRе на данный момент.

 

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

Мне кажется оно как-то отчасти перекликается с теорией scaling в fixed point (но могу ошибаться) в разделе Sclaing in Fixed Point Arithmetics книги A Course in Digital Signal Processing by Boaz Porat. Могу вам выслать сканы (4 страницы)

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


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

А кстати (сорри, а кажется начинаю идти по кругу... :cranky: ), если учесть тот факт что в плане маштабирования входного сигнала я его умножаю, скажем на 2^12 после чего делаю round (в fixed point), коефф. умножаю на 2^10 и round, почему будет не правильно просто результат каждого цикла (т.е. выходной samlpe) в аккумуляторе делить на 2^10 (сдвиг на 10 разрядов вправо) - компенсация мштабирования коеффицеинтов, брать нижнее слово (нижние 16 бит) и затем при компоновке сигнала обратно в исходный формат (flоаting) делить результат на 2^12 (компенсация маштабирования входнго сигнала) ? Я говорю только о FIRе на данный момент.

Почему неправильно? Правильно. Только потери лишние. Да и зачем, если Вы все равно потом во флоат преобразуете?

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

Я Вам про другое писал - сначала нужно выбрать, как масштабировать к-ты и данные при заданной разрядности аккумулятора. И как это сделать.

 

 

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

Мне кажется оно как-то отчасти перекликается с теорией scaling в fixed point (но могу ошибаться) в разделе Sclaing in Fixed Point Arithmetics книги A Course in Digital Signal Processing by Boaz Porat. Могу вам выслать сканы (4 страницы)

Не нужно мне никаких сканов. Я же Вам написал теор. обоснование - оно вытекает из одного из критериев устойчивости фильтров.

Это в теории цифровой обработки ( в данном случае) нужно смотреть.

По цифровой обработке, кстати, есть классические книги и классические авторы.

Самая классическая - Л. Рабинер, Б. Гоулд. Теория и применение цифровой обработки сигналов.

В оргинале: L.R. Rabiner and B. Gold. Theory and Application of Digital Signal Processing.

Оппенгейм, Шафер - еще одна пара классиков. A. V. Oppenheim, R.V. Schafer. Писавших и отдельно друг от друга, как и Рабинер с Гоулдом, кстати. Их нужно читать.

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


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

Почему неправильно? Правильно. Только потери лишние. Да и зачем, если Вы все равно потом во флоат преобразуете?

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

Я Вам про другое писал - сначала нужно выбрать, как масштабировать к-ты и данные при заданной разрядности аккумулятора. И как это сделать.

 

Не нужно мне никаких сканов. Я же Вам написал теор. обоснование - оно вытекает из одного из критериев устойчивости фильтров.

Это в теории цифровой обработки ( в данном случае) нужно смотреть.

По цифровой обработке, кстати, есть классические книги и классические авторы.

Самая классическая - Л. Рабинер, Б. Гоулд. Теория и применение цифровой обработки сигналов.

В оргинале: L.R. Rabiner and B. Gold. Theory and Application of Digital Signal Processing.

Оппенгейм, Шафер - еще одна пара классиков. A. V. Oppenheim, R.V. Schafer. Писавших и отдельно друг от друга, как и Рабинер с Гоулдом, кстати. Их нужно читать.

 

ОК, гляну еще раз насчет критериев в книге.

Значит, имея 32-битный аккумулятор (31 разряд, 32ой - знак) и ежели сумма модулей коеффициентов равна скажем 2.5, получаем один доп. разряд требуемый результату Т.е. на сигнал и на коефф. по максимуму отойдет 30 разрядов. Для запаса, можно наверно брать скажем, 15 бит на сигнал, 12 бит на коефф. (в сумме получаем 28 бит), затем как результат брать 16 старших бит из 28..так ?

 

Насчет книги, да Оппенгем и Шафер - классика, как и Боаза Пората. Вы видимо о ней не в курсе, а она как и Оппенгейма идет как книга курса во многих западных универах и наряду и Оппенгеймом/Шафером является настольной DSP bible у многих инженеров, большинство из вещей там весьма доходчиво поясняются. Я бы заранее не пренебрегал тем о чем просто не знаю....

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


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

Вы видимо о ней не в курсе, а она как и Оппенгейма идет как книга курса во многих западных универах и наряду и Оппенгеймом/Шафером является настольной DSP bible у многих инженеров, большинство из вещей там весьма доходчиво поясняются. Я бы заранее не пренебрегал тем о чем просто не знаю....

Да я то как раз знаю, что это за книга. Потому и написал, что читать нужно классиков. Но это Ваши проблемы, кого хотите, того и читайте.

Забыл. При 32-х разрядном аккумуляторе и сумме 2.5 оставляйте 3 разряда на целую часть, включая знак и 29 на дробную. Потому что -2.5 (минус 2.5) представляются как -3 + 0.5. -3 не влезут в 2 разряда целой части. Только в 3 разряда.

Соответсвенно к-ты можно взять 16 разрядными, т.е. умножить их на 32768. На данные 14, если умножитель использовать в integer режиме, и 13, если умножитель во fractional.

Изменено пользователем -=ВН=-

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


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

Да я то как раз знаю, что это за книга. Потому и написал, что читать нужно классиков. Но это Ваши проблемы, кого хотите, того и читайте.

 

Во первых, спасибо насчет фильтра - переверну порядок коеффициентов для общей правильности.

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

 

Насчет книги, в мне знакомых кругах - он классика наряду с Оппенгеймом/Шафером, и круги эти включают весьма достойные мозги и универы. Оппенгейм конечно "отец" (скажем вместе с Рабинером) DSP, что отнюдь не умаляет достоинтсв мною упомянутой книги. Проблемой это вообще не вижу. Мое недопонимание совершенно не имеет отношения к уровню/качеству данной книги (хотя она мне черезвычайно помогла в универском курсе DSP - по ней толком и учил, лектор хоть сам по себе и толковый был, но объяснял хреново, все по слайдам из то-же книги. В результате купил ее (не дешова) что меня и спасло в результате (60% с потока завалило экзамен с первой попытки).

 

Но вам благодарен за помощь (хоть иногда и в не очень тактичной форме ;) , ну да ладно).

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


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

Во первых, спасибо насчет фильтра - переверну порядок коеффициентов для общей правильности.

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

 

Насчет книги, в мне знакомых кругах - он классика наряду с Оппенгеймом/Шафером, и круги эти включают весьма достойные мозги и универы. Оппенгейм конечно "отец" (скажем вместе с Рабинером) DSP, что отнюдь не умаляет достоинтсв мною упомянутой книги. Проблемой это вообще не вижу. Мое недопонимание совершенно не имеет отношения к уровню/качеству данной книги (хотя она мне черезвычайно помогла в универском курсе DSP - по ней толком и учил, лектор хоть сам по себе и толковый был, но объяснял хреново, все по слайдам из то-же книги. В результате купил ее (не дешова) что меня и спасло в результате (60% с потока завалило экзамен с первой попытки).

 

Но вам благодарен за помощь (хоть иногда и в не очень тактичной форме ;) , ну да ладно).

За нетактичность прошу прощения. А читать - читайте Пората, если Вам нравится, что с Вами сделаешь :)

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


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

За нетактичность прошу прощения. А читать - читайте Пората, если Вам нравится, что с Вами сделаешь :)

 

Но и Оппенгеймом не побрезгую... :biggrin:

А кстати, если не секрет, что именно вам не нравиться в Порате ? Мне интересно еще один опытный взгляд на его изложение. Какие темы ? что именно в них ?

 

Для БИХ фильтров более удобный критерий устойчивости - положение его полюсов.

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

Подать ему на вход единичный импульс (дельта-импульс) и записать отклик до тех пор, пока он не спадет до малого уровня. Это отрезок импульсной характеристики. Ее начало. Вот найти сумму ее модулей, взять запас, поскольку это только отрезок, хотя и несущий основную энергию, но все же не вся ИХ. И сравнить с 1.

 

Вот как раз, окончив FIR подошел к IIRам (у меня их там 15 штук, узкополсные bandpass). Хотелось-бы уточнить пару вещей:

Вы говорите "для устойчивиги IIRa..." - так ведь реально проэктируются то IIRа-то устойчивые, зачем кому-нить вообще делать неустойчивый IIR ? Если так, то вами упомянутый метод оценки разрядности можно всегда использовать и с IIRами, так ?

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


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

Но и Оппенгеймом не побрезгую... :biggrin:

А кстати, если не секрет, что именно вам не нравиться в Порате ? Мне интересно еще один опытный взгляд на его изложение. Какие темы ? что именно в них ?

 

Вы говорите "для устойчивиги IIRa..." - так ведь реально проэктируются то IIRа-то устойчивые, зачем кому-нить вообще делать неустойчивый IIR ? Если так, то вами упомянутый метод оценки разрядности можно всегда использовать и с IIRами, так ?

Общий уровень.

 

Почти так. Дается оценка верхней границы выходных результатов в ИИР.

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


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

ОК, после короткого перерыва вернулись к теме....

Написал рутину IIRa, работает как положено, но, пока использую очень грубое маштабирование в 16 бит fixed-point: коеффициенты фильтра второго порядка, вида: b0/(1-a1z^-1-a2z^-2), т.е. а1, а2 и b0 - умножаются на 2^10 после чего вводятся в рутину IIR. В рутине после каждого цикла (цикл обратной связи IIRа второго порядка) результат делиться на на 2^10 (смещение вправо на 10 разрядов) во избежание промежуточных overflow. Затем, на выходе из цикла обратной связи то что получилось умножается на b0, после чего результат опять делиться на 2^10 и готов к выходу.

 

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

 

Как вообще можно учитывать сложение результатов отдельных фильтров в банке фильтров в плане маштабирования выхода ?

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


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

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

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

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

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

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

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

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

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

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