Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Числа с фиксированной точкой.
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
qwa
Такой вопрос: пусть имеется некий фильтр, синтезированный в Матлабе. Коэффициенты этого фильтра - дробные числа, числа с плавающей запятой. Допустим,надо перенести этот фильтр на ПЛИС или что-нибудь еще. Короче,надо перевести коэффициенты фильтра в формат с фиксированной точкой. Но числа с фиксированной точкой - это целые числа, а коэффициенты фильтра в исходном виде дробные. Вопрос: как правильно выполнить перевод? Где можно про это прочитать?

Вообще,у меня есть подозрение,что для этого надо дробное число умножить на двойку в степени такой,сколько битов отводится на хранение коэффициентов фильтра.
ViKo
Сначала хорошо бы проверить в Матлабе работу с целыми коэффициентами, а потом можно и использовать.
qwa
Цитата(ViKo @ Feb 8 2015, 22:45) *
Сначала хорошо бы проверить в Матлабе работу с целыми коэффициентами, а потом можно и использовать.

То есть, алгоритм перевода я предложил правильный?

Ну и последний вопросик: пусть вектор b - вектор, в котором хранятся коэффициенты фильтра. Все элементы этого вектора умножаем на двойку в соот. степени. И как теперь объяснить Матлабу,чтобы он использовал новые коэффициенты? Понятно,что надо сперва переключить тип арифметики самого фильтра на fixed-point. А дальше как? Достаточно ли просто обозвать вектор новых коэффициентов так же,как и старый,то есть,просто b? Тогда в Workspace старый вектор будет заменен на новый - и этого будет достаточно?
ViKo
Ну да, как-то так. Я сам не делал. Понятно, что выход нужно будет поделить на ту самую степень двойки (взять нужные разряды).
В ПЛИС и арифметика с числами с плавающей запятой имеется. Тоже не использовал.
Grizzzly
Теория по fixed-point. В MATLAB очень хорошая справка с множеством примеров. Можете поискать по запросу "fixed-point".
Некоторые примеры для фильтров в MATLAB: вот и вот.
V_G
Цитата(qwa @ Feb 9 2015, 04:45) *
Коэффициенты этого фильтра - дробные числа, числа с плавающей запятой.

Вот это - ключевая ошибка. Дробные числа и числа с плавающей точкой - совсем не одно и то же.
Для того, чтобы определиться, следует использовать целые числа, или числа с плавающей точкой, надо посмотреть диапазон изменения коэффициентов фильтра.
Грубо говоря, если все коэффициенты одного порядка, то можно использовать целочисленную арифметику, домножив все коэффициенты на какое-то постоянное число (не обязательно степень двойки) так, чтобы максимальный по модулю коэффициент по максимуму вписывался в целочисленную разрядную сетку.
Если отдельные коэффициенты различаются на 1-2 и более порядков, лучше использовать формат с плавающей точкой.
Матлаб позволяет оценить эффекты квантования (округления коэффициентов): посмотрите, что будет с характеристиками при учете округления коэффициентов до чисел разного формата и разной разрядности.
qwa
Цитата(V_G @ Feb 9 2015, 02:50) *
Вот это - ключевая ошибка. Дробные числа и числа с плавающей точкой - совсем не одно и то же.

Я в курсе. Просто я просмотрел весь вектор коэффициентов,и они все меньше единицы или равны 1.
V_G
В целочисленных процессорах (ADSP2181 к примеру) есть формат чисел 1.15, представляющий числа с фиксированной точкой в диапазоне от -1 до +1. В нем и работает блок МАС (перемножитель-накопитель).
qwa
Моя задача далее будет переносится на ПЛИС.
des00
Цитата(qwa @ Feb 9 2015, 10:06) *
Моя задача далее будет переносится на ПЛИС.

а какая разница ? 99.9 процентов выше 1.15 - 1.18 вряд ли прыгнете
Hose
Синтез фильтра в матлабе и оптимизация под фпга - вещи несовместимые.
Если вы хотите получить действительно минимальный ресурс и максимальное быстродействие, то читайте дальше)
Тему правильно было бы назвать "разрядности внутри цифровых фильтров"
На примере fir:
1) вам необходимо получить импульсную характеристику фильтра. Как получить оптимальную импульсную под ваши задачи - отдельная тема, допустим что вы поверили матлабу (что, кстати, очень зря).
2) вам придется реализовать два фильтра (в математике это не сложно): с плавучкой и без.
Оптимизировать будете отдельно каждый. И в конце сделаете выбор.
... пеиемножение чисел в плавучке это перемножение мантисс и сложение экспонент, на первый взгляд кажется, что эта операция возможна в лучшей частотке, чем цлочисленное перемножение, но если вы используете эмбедед умножитель фпга, то возникают нюансы; опятьже блоки до и после фильтра могут не использовать плавучку и возникают накладные потери ресурса и задержки на переходы...
3) дискретизируете по уровню отсчеты импульсной (коэффициенты): это нелинейная операция и в ней не все так однозначно как кажется.
Определяете максимальный коэффициент, нормируете относительно него , умножаете на степень двойки. В математике смотрите результат, ужасаетесь, меняете "степень двойки" ( тоесть подбираете разрядность пока она не устроит вас ) (оно конечно же считается, но мы занимаемся тем что не описано в книжках и статьях разных умников) ... смотрите фчх, неравномерность ачх в полосе в масштабе 0.01дб, ачх в полосе подавления и в интересующих вас местах, также не плохо построить гвз, если оно не очевидно для вас по фчх или критично для вас.
Важно понимать, что разрядность фильтра и длинна импульсной связаны, увеличивать их нужно вместе.
4) оптимизируете коэффициенты. часто разрядности нехватает и получить нужно лучшее подавление или другие характеристики в установленной разрядности, например если это формирование сигнала для цап. Для этого в верхнюю формулу добавляете еще один коэффициент как множитель, пишете програмку перебора, устанавливаете критерии поиска этого коэффициента. Выигрыш от этой процедуры основан на том, что дискретизация по уровню - операция не линейная. Оценить выигрыш от этой процедуры оч сложно. Выигрыш ощутимый. Коэффициент в больших пределах гонять не надо, так чтобы коэффициенты шевелились в пределах разряда. Далее начинаете такимже образом шевелить коэффициенты по отдельности, но парами (симметрично относительно центрального коэффициента). Есть смысл оптимицировать только несколько крайних.
Можно также поиграться с длиной импульсной.
Далее, если вам не удалось получить требуемых характеристик, то можете начать двигать фазу дискретизации импульсной. На простом приаере: коэффициенты 2,5,10,5,2 могут быть преобразованны в 1,3,7,7,3,1 количество коэффициентов стало четным, но и макс коэффициент стал в 1.5 раза меньше. Иногда помогает.
Симметричность коэффициентов это свойство линейной фчх и оно прилично экономит ресурс при реализации, но опять же вы бог-создатель системы и вам виднее чем жертвовать ради хотелок заказчика, тоесть можете использовать плавный сдвиг фазы дискретизации.
Не забывайте про разрядности сумматоров внутри фильтра: после умножения разрядность увеличивается сами знаете как, всю ее тащить нет смысла, но и обрезать до выходной разрядности фильтра нельзя. Разрядность этих сумматоров также поле для оптимизации. Она завязана на распределение амплитуд коэффициентов фильтра. Стоит заметить, что разрядность коэффициентов это оптимизация умножителей, а внутренних регистров - сумматоров, очевидно, что от оптимизации сумматоров выиграш в разы меньше по ресурсам и частотке.

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

Все

Или можно попросить больше денег у заказчика, поставить чипак пожирнее, забабахать разрядность с запасом и не заморачиваться на все эти процедуры, тратя целый час своей жизни...
des00
Цитата(Hose @ Feb 9 2015, 13:15) *
Синтез фильтра в матлабе и оптимизация под фпга - вещи несовместимые.....

Или просто задействовать Fixed-Point Toolchain в FDAtool и получить результат сравнимый или чуть хуже по качеству, но раз в 10 быстрее....
Hose
Не надо забывать, что и матлаб и тулы под него стоят денег.
Оцените сколько фильтров вы оптимизируете, сколько стоят тулзы или риск использования ворованного по.
ViKo
Это не ворованное, а трофейное... rolleyes.gif
des00
Цитата(Hose @ Feb 9 2015, 15:43) *
Не надо забывать, что и матлаб и тулы под него стоят денег.
Оцените сколько фильтров вы оптимизируете, сколько стоят тулзы или риск использования ворованного по.

Да, но и вам тоже не стоит забывать что изначальный вопрос ТС и ваш ответ в пункте 1 уже подразумевают использование сего софта для решения задачи, после расчета фильтра в FDAtool 3-4 клика мышкой и готов результат.
qwa
Hose
Благодарю, что вы так все подробно расписали, но боюсь, что я и половины не понял )) Дело в том,что с ПЛИС я вообще никогда не работал и ничего под них не проектировал, да и ЦОС, собственно, только-только начал заниматься. Мне бы рекомендацию получить на какую-нибудь книжку или статью (можно и на английском),где рассказывается подробно и понятно про квантование в цифровых системах (это ведь так называется,я не напутал?).

Кстати,с Матлабом нет никаких проблем - у меня есть доступ к лицензионной версии Матлаба одной из последних версий с Signal Processing Toolbox на борту.
des00
Цитата(qwa @ Feb 11 2015, 05:11) *
Кстати,с Матлабом нет никаких проблем - у меня есть доступ к лицензионной версии Матлаба одной из последних версий с Signal Processing Toolbox на борту.

Зачем вам что, то кроме матлаба? Help - Fixed Point Conversion. Там есть все + куча примеров.
Hose
Когда я был преподавателем, основная масса студентов меня ненавидили, потомучто я, используя правило "знание некоторых принципов заменяет знание многих фактов", занудно вшурупивал в их мозги принципы мироздания. Но 99.9% желают иметь методические рекомендации, которые позволят решить поставленную задачу.
//я слегка пьян, поэтому более занудлив чем обычно
я не могу посоветовать литературу, поскольку я не согласен с авторами. Они пишут методички, подрузамевая что исполнитель безукоризненно понимает условия своей задачи.
Методичка:
Осмелюсь предположить, что у вас фир фильтр. В большинстве случаев вам достаточно 14 разрядов на коэффициенты. Берете отчеты импульсной или коэффициенты фильтра, ищете максимальный, делите на него все отчеты, в результате получаете массив цифирей с максимальной равной 1. Далее умножаете на (2^13 -1) (один разряд на знак и минус один, потомучто так надо). Затем каждый отчет округляете. Для фир фильтра оптимально использовать функцию округления round.
Эти коэффициенты используете для построения фир фильтра на плис. Разрядность коэффициентов будет 14, при разрядности входных данных 16, внутренние регистры сумматоров дожны иметь разрядность 14 + 16 + log(количество коэффициентов, 2). Конечно такой фильтр будет иметь отличный от 1 коэффициент усиления. На выходе имеет смысл забрать разрядност (после нормировки) на log(заужение полосы,2)+1 больше чем было на входе.
qwa
Цитата(Hose @ Feb 11 2015, 08:10) *
Берете отчеты импульсной или коэффициенты фильтра, ищете максимальный, делите на него все отчеты, в результате получаете массив цифирей с максимальной равной 1.

Как я понимаю,это имеет смысл делать только если коэффициенты изначально не дробные числа,меньшие единицы?

Цитата(Hose @ Feb 11 2015, 08:10) *
Эти коэффициенты используете для построения фир фильтра на плис. Разрядность коэффициентов будет 14, при разрядности входных данных 16, внутренние регистры сумматоров дожны иметь разрядность 14 + 16 + log(количество коэффициентов, 2).

Как получается такая формула?
2 - это основание логарифма?

Цитата(Hose @ Feb 11 2015, 08:10) *
На выходе имеет смысл забрать разрядност (после нормировки) на log(заужение полосы,2)+1 больше чем было на входе.

А вот этот момент я совсем не понял. Что имеется в виду?
Hose
1) как это сделать? - я верно понял вопрос? Если вы не знаете как делать такие операции в матлабе, то это пустой разговор.
2) 16 + 14 это разрядность числа на выходе умножителя 16 рязрядного числа с 14 разрядным. + лог( количества сумм, 2) это прирост разрядности при суммировании. Двойка - основание логарифма.
3) на входе была разрядность 16, на выходе станет больше. Например фильтр второго порядка с кое 1,1. На входе 5,6,5,6,5,6,5,6, на выходе 5.5, 5.5, 5.5, .... Видно что разрядность увеличилась?
qwa
Цитата(Hose @ Feb 12 2015, 07:44) *
1) как это сделать? - я верно понял вопрос? Если вы не знаете как делать такие операции в матлабе, то это пустой разговор.

Нет.
Я имел в виду следующее - при нормировке коэффициентов указанным Вами методом, получается вектор чисел, меньших или равных единице. Так вот,вопрос был такой: имеет ли смысл делать такую нормировку, если исходные коэффициенты и так числа,меньшие или равные единице? Я думаю,что в таком случае смысла это делать нет.

Цитата(Hose @ Feb 12 2015, 07:44) *
2) 16 + 14 это разрядность числа на выходе умножителя 16 рязрядного числа с 14 разрядным. + лог( количества сумм, 2) это прирост разрядности при суммировании. Двойка - основание логарифма.

Но почему именно логарифм? Я не понимаю. Это некая условность, или есть какие-то условия,откуда он берется?


Цитата(Hose @ Feb 12 2015, 07:44) *
3) на входе была разрядность 16, на выходе станет больше. Например фильтр второго порядка с кое 1,1. На входе 5,6,5,6,5,6,5,6, на выходе 5.5, 5.5, 5.5, .... Видно что разрядность увеличилась?

А нет возможности убрать усиление? Для этого вроде же достаточно поделить выходную последовательность на ту же двойку в степени,что и умножали коэффициенты,или я не прав?
Hose
Если максимальный кое равен 1, то вы поделите все кое на 1 и они останутся неизменными. Это универсальное решение.

Сложение 2-х чисел даст "прирост разрядности" 1 бит - это хорошо видно из примера. сложение 4х чисел даст "прирост разрядности" 2 бита: а + б + ц + д = (а + б) + (ц + д) в каждой скопке был "прирост разрядности" на 1 и при суммировании скобок прирост 1. И так дальше ... Присложеннии 16и чисел "прирост разрядности" 4 бита. Уже запахло логарифмом... Дальше не буду объяснять
Строго говоря, термин прирост разрядности при суммировании применять нельзя, поэтому он в кавычках, это, скорее, ВОЗМОЖНОСТЬ прироста разрядности, которую нужно не упустить, а сам прирост возникает на фильтре и зависит от спектральной плотности сигнала и ачх фильтра.
В примере с 5,6,5,6,5.... Выход первого фильтра 5.5, 5.5, .... Можно сколько угодно долго гонять через такой же фильтр, дальнейшего прироста разрядности не будет.

В примере с 5,6,5,6.... Усиление 1. До фильтра квантование по уровню было с шагом 1, на выходе стало 0.5.
qwa
Решил промоделировать в Матлабе - получилось что-то не очень.

Последовательность моих шагов: фильтр смоделировал в FdaTool, привел к арифметике с ФТ (соот.,настроил все разрядности). Сделал экспорт в Workspace. Импульсная характеристика - норм, пропустил квантованный синус - норм. Решил промоделировать,как это будет на ПЛИС. Ну то есть вектор коэффициентов умножить на двойку в соот. степени,и выходные отсчеты так же поделить на ту же двойку. Итак, я вытащил коэффициенты фильтра командой get. Умножил весь вектор на двойку,округлил командой round. Записал полученный вектор при помощи команды set. Натравил фильтр с исправленным вектором коэффициентов на все тот же синус,результат поделил на двойку. Понятно,что на выходе ожидается синус. Но его там нет,а есть какая-то кракозябра. В может быть вероятный косяк?
qwa
Решил промоделировать в Матлабе - получилось что-то не очень.

Последовательность моих шагов: фильтр смоделировал в FdaTool, привел к арифметике с ФТ (соот.,настроил все разрядности). Сделал экспорт в Workspace. Импульсная характеристика - норм, пропустил квантованный синус - норм. Решил промоделировать,как это будет на ПЛИС. Ну то есть вектор коэффициентов умножить на двойку в соот. степени,и выходные отсчеты так же поделить на ту же двойку. Итак, я вытащил коэффициенты фильтра командой get. Умножил весь вектор на двойку,округлил командой round. Записал полученный вектор при помощи команды set. Натравил фильтр с исправленным вектором коэффициентов на все тот же синус,результат поделил на двойку. Понятно,что на выходе ожидается синус. Но его там нет,а есть какая-то кракозябра. В может быть вероятный косяк?
V_G
Начнимте с простого: ваша ПЛИС просто синус без фильтрации пропускает?
Или с фильтрацией, но с минимальным порядком?
Если да, то после этого можно усложнять фильтр
Hose
Отладочная схема:
Нужно к импульсной фильтра дописать нулей так чтобы получилось кратное двойке число и взять фурье.
Результатом будет ачх фильтра.

Если в симулинке, то:
Гегератор дельта-функции
Фильтр
Анализатор спектра
Осцил

Начать стоит с высокой разрядности, например 16 и малого порядка фильтра, например 5, тогда ачх фильтра будет близка к расчетной и результаты будет не сложно привести тут. И постепенно уменьшать разрядность.

qwa
Цитата(V_G @ Feb 23 2015, 05:46) *
Начнимте с простого: ваша ПЛИС просто синус без фильтрации пропускает?
Или с фильтрацией, но с минимальным порядком?
Если да, то после этого можно усложнять фильтр

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

Цитата(Hose @ Feb 23 2015, 20:43) *
Отладочная схема:
Нужно к импульсной фильтра дописать нулей так чтобы получилось кратное двойке число и взять фурье.
Результатом будет ачх фильтра.

Если в симулинке, то:
Гегератор дельта-функции
Фильтр
Анализатор спектра
Осцил

Начать стоит с высокой разрядности, например 16 и малого порядка фильтра, например 5, тогда ачх фильтра будет близка к расчетной и результаты будет не сложно привести тут. И постепенно уменьшать разрядность.

Это к коэффициентам надо дописать нули? Мне надо дописать нуль к каждому коэффициенту? Просто вы говорите словами,которые вам-то понятны,а остальным (без вашего опыта) - вряд ли.
Hose
Например коэффициенты в 8 разрядах:
-19, 0, 78, 127, 78, 0, -19
дописываем нулей:
-19, 0, 78, 127, 78, 0, -19, 0, 0,0,0,0,0,0,0,0,0,0,0.......0;
Должен получиться массив данных длинной, например 1024.
Берем фурье
.....

thermit
Цитата(qwa @ Feb 24 2015, 03:53) *
Фильтрация есть. Более того - фильтрация лишь часть общей задачи,но для начала хотелось бы разобраться с этим.
Разумеется,было бы разумно использовать минимум коэффициентов. Используя терминологию Матлаба, я использовал метод синтеза Equiripple (он же метод Паркса-Макклелланда или метод замен Ремеза).


Это к коэффициентам надо дописать нули? Мне надо дописать нуль к каждому коэффициенту? Просто вы говорите словами,которые вам-то понятны,а остальным (без вашего опыта) - вряд ли.


у вас есть же доступ к матлабу? ну и воспользуйтесь функцией freqz. она честно посчитает частотную х-ку фильтра. а нули и ффт... это не совсем то. вернее, вообще говоря, совсем не то.
Hose
Матлаб сушит ваши мозги, от того и тестируете потом фильтры синусами)
От чего же оно не то, товарищ термит?
Grizzzly
Цитата(thermit @ Feb 24 2015, 08:25) *
у вас есть же доступ к матлабу? ну и воспользуйтесь функцией freqz. она честно посчитает частотную х-ку фильтра. а нули и ффт... это не совсем то. вернее, вообще говоря, совсем не то.

Почему же не то?
Если мы откроем код функции freqz
Код
open freqz
, то увидим, что там вычисляется fft с дополнением нулями.
thermit
Цитата(Hose @ Feb 24 2015, 09:49) *
Матлаб сушит ваши мозги, от того и тестируете потом фильтры синусами)
От чего же оно не то, товарищ термит?



Матлаб сушит то, что и сушить обычно нечего.
Тестирование фильтра синусами вполне обычная практика. Ибо частотная х-ка фильтра это и есть тестирование фильтра синусами, вернее, комплексными экпонентами. А вот дпф только частный ее (ЧХ) случай.
Впрочем, каждый поступает так как считает нужным.

Цитата
Grizzzly:
Почему же не то?
Если мы откроем код функции freqz то увидим, что там вычисляется fft с дополнением нулями.


И не только.


Grizzzly
Цитата(thermit @ Feb 24 2015, 11:35) *
А вот дпф только частный ее (ЧХ) случай.

АЧХ есть модуль от преобразования Фурье импульсной характеристики. Какой тогда будет общий случай? Функция передачи?
thermit
Цитата(Grizzzly @ Feb 24 2015, 12:33) *
АЧХ есть модуль от преобразования Фурье импульсной характеристики. Какой тогда будет общий случай?


АЧХ есть модуль z-преобразования импульсной характеристики.
andyp
Цитата(Grizzzly @ Feb 24 2015, 10:47) *
Если мы откроем код функции freqz
Код
open freqz
, то увидим, что там вычисляется fft с дополнением нулями.


У состоятельных пацанов значения полиномов вычисляются в случае неравномерной сетки частот. В Октаве только FFT.
andyp
Цитата(thermit @ Feb 24 2015, 12:45) *
АЧХ есть модуль z-преобразования импульсной характеристики.


АЧХ определяется как количественная харакеристка реакции линейной системы на гармонические воздействия. Здесь первичны дифференциальные (непрерывный случай) или разностные уравнения (дискретный случай) и понятие передаточной функции. В дискретном случае АЧХ - модуль передаточной функции рассчитанной на единичном круге. В непрерывном - модуль передаточной функции при s = jw.
qwa
Короче,я взял и ручками написал обычный КИХ фильтр и провернул с ним фокус с коэффициентами. Фильтрация прошла успешно. Правда,такая модель совсем не то,что первая,но уже кое-что! biggrin.gif Думаю,в первой модели где-то выскочило переполнение,это надо потестить.
Grizzzly
thermit, andyp, спасибо, доказали. Внимательнее посмотрел, увидел во freqz для неравномерной сетки деление полиномов ПФ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.