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

Farrow fractional delay filter в симулинке. Кто-нибудь делал?

Создал Fractional Delay Filter в матлабе, просимулировал, результаты удовлетворили. Руководствуясь структурой подобного фильтра из хелпа (там farrow-структура приведена) , попробовал собрать такой фильтр на Altera DSP Builder элементах, т.е. взял четыре (для третьего порядка) SingleRate FIR фильтра из Altera DSP Builder Advanced Blockset, подставил туда коэффициенты из матлабовского fractional delay фильтра, умножители и элементы сложения также взял из Advanced Blockset. Короче, скопировал структурную схему из матлабовского хелпа. Просимулировал (разумеется с fixed-point данными). Фильтры первого (линейная аппроксимация) и второго порядка дают нормальные результаты, при дальнейшем увеличении порядка наблюдается лажа. Т.е. по идее при увеличении порядка фильтра точность задержки должна увеличиваться, а она по ходу уменьшается, причем очень резко, как будто что-то вообще капитально накрывается. Есть подозрение, что дело в опциях разрядности элементов. Хотя я уже по-моему все возможные варианты перепробовал с разрядностью. Не поделитесь соображениями? Может кто просто делал подобный фильтр задержки?

Изменено пользователем RoadRunner

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


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

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

если фильтры реализовали правильно, то 99% ошибка в вычислении выходного полинома.

 

ЗЫ. в ручную, без всяких матлабов интерполятор фарроу пишется за 10-15 минут до 4 го порядка влючительно %)

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


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

в ручную, без всяких матлабов интерполятор фарроу пишется за 10-15 минут до 4 го порядка влючительно

Не сомневаюсь, что если точно знать что и как делать, можно и за 5 минут написать :biggrin:

 

Я за DSP Builder взялся еще по той причине, что фильтр надо будет на почти две сотни каналов размножить, и еще кучу всего налепить плюс к этому - у меня такой плисины нету)). А в бидере, насколько я понял, используется сериализатор, просто частота повышается, за счет этого логику дублировать не надо. А с частотой у меня проблем нет, запас большой, можно хоть в 100 раз увеличивать. Руками все это писать не надо - красота!

 

Может есть материал какой по фарроу фильтрам задержки, киньте плиз, если не трудно. В сети искал, но кроме мудреных талмудов с километровыми формулами ничего не нашел. Да и они по теории больше..

 

99% ошибка в вычислении выходного полинома

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

Изменено пользователем RoadRunner

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


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

Может есть материал какой по фарроу фильтрам задержки, киньте плиз, если не трудно. В сети искал, но кроме мудреных талмудов с километровыми формулами ничего не нашел. Да и они по теории больше..

Здесь смотрели?

 

farrow

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


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

Здесь смотрели?

 

farrow

 

угу, первым делом. Хорошая статья, я на неё и опирался, когда делал. Теорию она идеально разжевывает. На практике же делаю все как там (ну и в матлабовском хелпе), получается хрень.

Есть подозрение, что в коэффициентах фильтра проблема. На втором порядке полинома все путем - там коэффициенты целые: -1, 0, 1... На третьем порядке появляются типа 1,1666667 и т.д. Тут все и накрывается. Наверное тут собака зарыта, только что это означает применительно к схеме, не соображу.

Изменено пользователем RoadRunner

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


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

Тут еще попутно другой вопрос возникает. После умножителей (которые вне ких-фильтров находятся) лавинообразно нарастает длина данных с фиксированной точкой, что вроде логично: при умножении разрядность вдвое должна возрастать. Возникает вопрос, а как тогда этот алгоритм с фиксированной точкой реализовывать вообще? При четырех КИХах разрядность на выходе за сотню переваливает, это при 24-разрядных данных на входе

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


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

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

Изменено пользователем RoadRunner

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


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

Возникает вопрос, а как тогда этот алгоритм с фиксированной точкой реализовывать вообще?

все вычисления ведете с плавающей точкой + правила округления не забывайте %)

 

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


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

все вычисления ведете с плавающей точкой + правила округления не забывайте %)

По-моему, элементы DSP Bulderа не поддерживают плавающую точку. Да и в матлабе когда симулировал, я фильтр делал с фиксированной точкой - отличные результаты получились. Знал бы я как он там внутри все умножает и округляет, так бы и сделал без вопросов. А плавающую точку на плисине.. не знаю, не делал конечно, но по-моему ахтунг еще тот :biggrin:

Без плавающей то вообще никак?

Изменено пользователем RoadRunner

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


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

Тут еще попутно другой вопрос возникает. После умножителей (которые вне ких-фильтров находятся) лавинообразно нарастает длина данных с фиксированной точкой, что вроде логично: при умножении разрядность вдвое должна возрастать. Возникает вопрос, а как тогда этот алгоритм с фиксированной точкой реализовывать вообще? При четырех КИХах разрядность на выходе за сотню переваливает, это при 24-разрядных данных на входе

Отбрасываете от результата ненужные старшие и/или младшие биты (это в простом случае, для уменьшения ошибки необходимо округление). Ненужность конкретных бит определяется входными данными.

Наверняка поможет гугл -> fixed point rounding / binary scaling и т.п.

 

Update: можно считать и в плавучке, как уважаемый des00 посоветовал. Если позволяет быстродействие, то особенно ничего сложного нет, у Альтеры даже какие-то готовые мегафункции были под это дело (ALTFP*).

Изменено пользователем AndrewS6

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


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

блин писал про одно, думал про другое %) в фиксированной точке конечно (она будет "плавать" по разрядности, потому и написал так) + округления и выравнивание точки при вычислениях.

 

Знал бы я как он там внутри все умножает и округляет, так бы и сделал без вопросов.

а что сложного то ?

 

s0.15 + s0.15 = s1.15

s0.15 * s0.15 = ss0.30

 

s2.15 * s1.15 = ss3.30

 

ну а дальше нормировка и т.д. и т.п.

 

 

ЗЫ. помните про диапазон значений mu, оптимальные коэффициенты фильтров и то что не обязательно входной и выходной сигнал в фарроу делать одинаковым ;)

 

ЗЗЫ. в смысле по амплитуде

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


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

s0.15 + s0.15 = s1.15

s0.15 * s0.15 = ss0.30

 

s2.15 * s1.15 = ss3.30

 

ну а дальше нормировка и т.д. и т.п.

 

вот дальше то как раз самое непонятное для меня)) Как разрядность то уменьшать, округлять то бишь? По идее, чтобы точность не терять, надо влево после умножения результат сдвигать, потом младшие разряды отбрасывать. Но на сколько двигать то? При конкретном сигнале я конечно вручную могу посмотреть сколько старших бит не используется и на столько и сдвинуть, а если амплитуда сигнала переменная? Я так понял вы под нормировкой подобную процедуру и имели ввиду (поправьте если ошибаюсь), вы бы не могли её поподробнее описать?

Изменено пользователем RoadRunner

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


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

вот дальше то как раз самое непонятное для меня))

за это время можно эмпирическим путем, в том же симулинке выяснить что и как влияет %) правила арифметических операций я вам указал. Дальше делайте как считаете нужным, либо сохраняете точку в том же положении что и входные данные (т.е. 15 бит после точки в примере), либо двигаете ее по разрядности (например 20 бит что бы промежуточные вычисления были точнее). При выборе разрядностей для интерполятора фарроу достаточно помнить его свойства : abs(signal_out) <= abs(singal_in), 0 <= |optimal_mu| <= 1. Остальное выводится легко на бумажке %)

 

 

ЗЫ. ну и последняя подсказка, для кубического фарроу очень удобно умножить все коэффициенты на 6 и поделить выход фильтра на 8 ;)

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


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

При выборе разрядностей для интерполятора фарроу достаточно помнить его свойства : abs(signal_out) <= abs(singal_in), 0 <= |optimal_mu| <= 1.

 

Это не так. АЧХ интерполятора не превышает 1 при 0 <= |optimal_mu| <= 1, а это abs(signal_out) > abs(singal_in) может легко выполняться. ;)

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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