RoadRunner 0 27 октября, 2011 Опубликовано 27 октября, 2011 (изменено) · Жалоба Создал Fractional Delay Filter в матлабе, просимулировал, результаты удовлетворили. Руководствуясь структурой подобного фильтра из хелпа (там farrow-структура приведена) , попробовал собрать такой фильтр на Altera DSP Builder элементах, т.е. взял четыре (для третьего порядка) SingleRate FIR фильтра из Altera DSP Builder Advanced Blockset, подставил туда коэффициенты из матлабовского fractional delay фильтра, умножители и элементы сложения также взял из Advanced Blockset. Короче, скопировал структурную схему из матлабовского хелпа. Просимулировал (разумеется с fixed-point данными). Фильтры первого (линейная аппроксимация) и второго порядка дают нормальные результаты, при дальнейшем увеличении порядка наблюдается лажа. Т.е. по идее при увеличении порядка фильтра точность задержки должна увеличиваться, а она по ходу уменьшается, причем очень резко, как будто что-то вообще капитально накрывается. Есть подозрение, что дело в опциях разрядности элементов. Хотя я уже по-моему все возможные варианты перепробовал с разрядностью. Не поделитесь соображениями? Может кто просто делал подобный фильтр задержки? Изменено 27 октября, 2011 пользователем RoadRunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 27 октября, 2011 Опубликовано 27 октября, 2011 · Жалоба Т.е. по идее при увеличении порядка фильтра точность задержки должна увеличиваться, а она по ходу уменьшается, причем очень резко, как будто что-то вообще капитально накрывается. если фильтры реализовали правильно, то 99% ошибка в вычислении выходного полинома. ЗЫ. в ручную, без всяких матлабов интерполятор фарроу пишется за 10-15 минут до 4 го порядка влючительно %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 28 октября, 2011 Опубликовано 28 октября, 2011 (изменено) · Жалоба в ручную, без всяких матлабов интерполятор фарроу пишется за 10-15 минут до 4 го порядка влючительно Не сомневаюсь, что если точно знать что и как делать, можно и за 5 минут написать Я за DSP Builder взялся еще по той причине, что фильтр надо будет на почти две сотни каналов размножить, и еще кучу всего налепить плюс к этому - у меня такой плисины нету)). А в бидере, насколько я понял, используется сериализатор, просто частота повышается, за счет этого логику дублировать не надо. А с частотой у меня проблем нет, запас большой, можно хоть в 100 раз увеличивать. Руками все это писать не надо - красота! Может есть материал какой по фарроу фильтрам задержки, киньте плиз, если не трудно. В сети искал, но кроме мудреных талмудов с километровыми формулами ничего не нашел. Да и они по теории больше.. 99% ошибка в вычислении выходного полинома не совсем понятно, по отношению к структуре фильтра это что означает? Конкретно в элементах, что может быть давать такой результат? Изменено 28 октября, 2011 пользователем RoadRunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_sda 0 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Может есть материал какой по фарроу фильтрам задержки, киньте плиз, если не трудно. В сети искал, но кроме мудреных талмудов с километровыми формулами ничего не нашел. Да и они по теории больше.. Здесь смотрели? farrow Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 28 октября, 2011 Опубликовано 28 октября, 2011 (изменено) · Жалоба Здесь смотрели? farrow угу, первым делом. Хорошая статья, я на неё и опирался, когда делал. Теорию она идеально разжевывает. На практике же делаю все как там (ну и в матлабовском хелпе), получается хрень. Есть подозрение, что в коэффициентах фильтра проблема. На втором порядке полинома все путем - там коэффициенты целые: -1, 0, 1... На третьем порядке появляются типа 1,1666667 и т.д. Тут все и накрывается. Наверное тут собака зарыта, только что это означает применительно к схеме, не соображу. Изменено 28 октября, 2011 пользователем RoadRunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Тут еще попутно другой вопрос возникает. После умножителей (которые вне ких-фильтров находятся) лавинообразно нарастает длина данных с фиксированной точкой, что вроде логично: при умножении разрядность вдвое должна возрастать. Возникает вопрос, а как тогда этот алгоритм с фиксированной точкой реализовывать вообще? При четырех КИХах разрядность на выходе за сотню переваливает, это при 24-разрядных данных на входе Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 28 октября, 2011 Опубликовано 28 октября, 2011 (изменено) · Жалоба Заменил SingleRate FIR на самопальный, тоже на альтеровских элементах - заработало нормально, т.е. выходит проблема в блоке SingleRate FIR, только что там не так вообще не могу понять, причем проблема начинается судя по всему с дробных коэффициентов, пока они целые (до второго порядка), работает и так, и так Изменено 28 октября, 2011 пользователем RoadRunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба Возникает вопрос, а как тогда этот алгоритм с фиксированной точкой реализовывать вообще? все вычисления ведете с плавающей точкой + правила округления не забывайте %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 28 октября, 2011 Опубликовано 28 октября, 2011 (изменено) · Жалоба все вычисления ведете с плавающей точкой + правила округления не забывайте %) По-моему, элементы DSP Bulderа не поддерживают плавающую точку. Да и в матлабе когда симулировал, я фильтр делал с фиксированной точкой - отличные результаты получились. Знал бы я как он там внутри все умножает и округляет, так бы и сделал без вопросов. А плавающую точку на плисине.. не знаю, не делал конечно, но по-моему ахтунг еще тот Без плавающей то вообще никак? Изменено 28 октября, 2011 пользователем RoadRunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndrewS6 0 28 октября, 2011 Опубликовано 28 октября, 2011 (изменено) · Жалоба Тут еще попутно другой вопрос возникает. После умножителей (которые вне ких-фильтров находятся) лавинообразно нарастает длина данных с фиксированной точкой, что вроде логично: при умножении разрядность вдвое должна возрастать. Возникает вопрос, а как тогда этот алгоритм с фиксированной точкой реализовывать вообще? При четырех КИХах разрядность на выходе за сотню переваливает, это при 24-разрядных данных на входе Отбрасываете от результата ненужные старшие и/или младшие биты (это в простом случае, для уменьшения ошибки необходимо округление). Ненужность конкретных бит определяется входными данными. Наверняка поможет гугл -> fixed point rounding / binary scaling и т.п. Update: можно считать и в плавучке, как уважаемый des00 посоветовал. Если позволяет быстродействие, то особенно ничего сложного нет, у Альтеры даже какие-то готовые мегафункции были под это дело (ALTFP*). Изменено 28 октября, 2011 пользователем AndrewS6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 28 октября, 2011 Опубликовано 28 октября, 2011 · Жалоба блин писал про одно, думал про другое %) в фиксированной точке конечно (она будет "плавать" по разрядности, потому и написал так) + округления и выравнивание точки при вычислениях. Знал бы я как он там внутри все умножает и округляет, так бы и сделал без вопросов. а что сложного то ? s0.15 + s0.15 = s1.15 s0.15 * s0.15 = ss0.30 s2.15 * s1.15 = ss3.30 ну а дальше нормировка и т.д. и т.п. ЗЫ. помните про диапазон значений mu, оптимальные коэффициенты фильтров и то что не обязательно входной и выходной сигнал в фарроу делать одинаковым ;) ЗЗЫ. в смысле по амплитуде Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 29 октября, 2011 Опубликовано 29 октября, 2011 (изменено) · Жалоба s0.15 + s0.15 = s1.15 s0.15 * s0.15 = ss0.30 s2.15 * s1.15 = ss3.30 ну а дальше нормировка и т.д. и т.п. вот дальше то как раз самое непонятное для меня)) Как разрядность то уменьшать, округлять то бишь? По идее, чтобы точность не терять, надо влево после умножения результат сдвигать, потом младшие разряды отбрасывать. Но на сколько двигать то? При конкретном сигнале я конечно вручную могу посмотреть сколько старших бит не используется и на столько и сдвинуть, а если амплитуда сигнала переменная? Я так понял вы под нормировкой подобную процедуру и имели ввиду (поправьте если ошибаюсь), вы бы не могли её поподробнее описать? Изменено 29 октября, 2011 пользователем RoadRunner Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 октября, 2011 Опубликовано 30 октября, 2011 · Жалоба вот дальше то как раз самое непонятное для меня)) за это время можно эмпирическим путем, в том же симулинке выяснить что и как влияет %) правила арифметических операций я вам указал. Дальше делайте как считаете нужным, либо сохраняете точку в том же положении что и входные данные (т.е. 15 бит после точки в примере), либо двигаете ее по разрядности (например 20 бит что бы промежуточные вычисления были точнее). При выборе разрядностей для интерполятора фарроу достаточно помнить его свойства : abs(signal_out) <= abs(singal_in), 0 <= |optimal_mu| <= 1. Остальное выводится легко на бумажке %) ЗЫ. ну и последняя подсказка, для кубического фарроу очень удобно умножить все коэффициенты на 6 и поделить выход фильтра на 8 ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RoadRunner 0 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба ок, большое спасибо за советы, буду пробовать Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 7 31 октября, 2011 Опубликовано 31 октября, 2011 · Жалоба При выборе разрядностей для интерполятора фарроу достаточно помнить его свойства : abs(signal_out) <= abs(singal_in), 0 <= |optimal_mu| <= 1. Это не так. АЧХ интерполятора не превышает 1 при 0 <= |optimal_mu| <= 1, а это abs(signal_out) > abs(singal_in) может легко выполняться. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться