Russky 0 30 октября, 2014 Опубликовано 30 октября, 2014 · Жалоба Всем привет! Вопрос вот такой. Если у кого реализация FIR фильтра заточенного под децимацию сигнала? Стандартная библиотека явно отстой, поэтому нужно вот что. Сначала фильтр, или специальная ф-я, копируют данные в циклический буфер линии задержки, и потом с заданным коэффициентом децимации выдает N количество отсчетов наружу. ЕМНИП, там размер линии задержки равен длине характеристики плюс размер входного буфера. Т.е фильтр должен содержать ф-ю инициализации, ф-ю копирования входа и собственно сам фильтр. Само собой, фильтр требует еще и структуру состояния. Есть ли у кого подобное? Если есть, поделитесь пожалуйста. Наверняка кто-то уже подобное делал. Спасибо. И чтобы далеко не ходить, есть ли у кого быстрая реализация IIR? Спасибо. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 30 октября, 2014 Опубликовано 30 октября, 2014 · Жалоба Почему это библиотека отстой?? Можете написать фурье быстрее?? :-))))) А фир надо делать через быструю свёртку.. (секционированную) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 30 октября, 2014 Опубликовано 30 октября, 2014 · Жалоба Почему это библиотека отстой?? Можете написать фурье быстрее?? :-))))) А фир надо делать через быструю свёртку.. (секционированную) Может я смотрю какую-то другую библиотеку, но вот ф-я: void DSPF_sp_fir_gen(const float * restrict x, const float * restrict h, float * restrict r, int nh, int nr); Это не фильтр. Это заготовка для него. Это явно не то, что должно быть. Даже ipp от интела будет быстрее. :) Фурье тут не нужно. Достаточно просто нормально организовтаь цикл с циклическими буферами задержки и т.д. Или я какую-то другую библиотеку сморю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 30 октября, 2014 Опубликовано 30 октября, 2014 · Жалоба В облом мне искать функцию, но наивно полагать, что TI не мог правильно написать тупую свёртку.. :-))) Официальный бенчмарк (фикс):: FIR Filter (8 бит) Computes a real FIR filter (direct-form) with nh coefficients and nr output samples. Nh and nr must be a multiple of 8. T>32: nh * nr / 8 + 22 Other: 32*nr/8 + 22 For nh = 32 and nr = 100: cycles = 422 ********************************************** FIR Filter (комплексный 16 бит) nh * nr / 2 + 16 ********************************************** IIR Biquad Performs single biquad IIR filter for nxsamples nx*4 + 25 For nx = 16: cycles = 89 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 30 октября, 2014 Опубликовано 30 октября, 2014 · Жалоба В облом мне искать функцию, но наивно полагать, что TI не мог правильно написать тупую свёртку.. :-))) Официальный бенчмарк (фикс):: FIR Filter (8 бит) Computes a real FIR filter (direct-form) with nh coefficients and nr output samples. Nh and nr must be a multiple of 8. T>32: nh * nr / 8 + 22 Other: 32*nr/8 + 22 For nh = 32 and nr = 100: cycles = 422 ********************************************** FIR Filter (комплексный 16 бит) nh * nr / 2 + 16 ********************************************** IIR Biquad Performs single biquad IIR filter for nxsamples nx*4 + 25 For nx = 16: cycles = 89 Вопервых это 8 бит, а не float. С другой стороны сам посуди, как фильтр может хорошо и быстро работать, если он нигде не сохраняет состояние? И вообще, как можно считать фильтр если не сохранять состояние линии задержки? вот ф-я: void DSPF_sp_fir_gen(const float * restrict x, const float * restrict h, float * restrict r, int nh, int nr); Тут ни состояния, ни линнии задержки нет. В общем, это какой-то обрубок. До фильтра этой ф-и еще как до луны. :) Да и по тактам она не ахти. Если говорить о float, то на 10 входных отсчетов и 100 длина характеристики. она тратит ~ 580 отсчетов. Это ого-го как много. PS. Судя по всему, процессор L138 и его DSP С674х вышли как раз в тот момент, как все переключились на ARM, и поэтому рынок DSP процессоров рухнул, и доводить C674х до ума никто не стал, или доводят но очень медленно. Куда не ткнись, везде какие-то недоработки.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 30 октября, 2014 Опубликовано 30 октября, 2014 · Жалоба PS. Судя по всему, процессор L138 и его DSP С674х вышли как раз в тот момент, как все переключились на ARM, и поэтому рынок DSP процессоров рухнул, и доводить C674х до ума никто не стал, или доводят но очень медленно. Куда не ткнись, везде какие-то недоработки.... :-)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) Хотел было прокомментировать по делу, но дочитав понял что смысла нет.. :-)))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oshparenniy 0 31 октября, 2014 Опубликовано 31 октября, 2014 (изменено) · Жалоба И вообще, как можно считать фильтр если не сохранять состояние линии задержки? Никак! Реализуйте линию задержки самостоятельно, это не сложно. Лично я в свое время так и поступил - скорость real-time меня вполне устраивает, я, правда, использовал fixed-point. Также советую обратить внимание, что фильтр будет работать "быстрее", если на вход фильтра вы будете подавать не один отсчет, а как можно больше. Изменено 31 октября, 2014 пользователем D.I.M.A Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 31 октября, 2014 Опубликовано 31 октября, 2014 · Жалоба Никак! Реализуйте линию задержки самостоятельно, это не сложно. Лично я в свое время так и поступил - скорость real-time меня вполне устраивает, я, правда, использовал fixed-point. Также советую обратить внимание, что фильтр будет работать "быстрее", если на вход фильтра вы будете подавать не один отсчет, а как можно больше. Спасибо. Я так и понял. Придется писать свой фильтр... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 31 октября, 2014 Опубликовано 31 октября, 2014 · Жалоба Вот сижу, разбираюсь с ассемблером и смотрю в код который идет от TI. То что писали его скорее всего индусы это понятно. Но проблема в том, что этот код похоже никто никогда не использвал. :) Т.е. для тестов и бенчмарков он может и сгодиться, а вот для реальных приложений нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
oshparenniy 0 31 октября, 2014 Опубликовано 31 октября, 2014 · Жалоба Вот сижу, разбираюсь с ассемблером и смотрю в код который идет от TI. То что писали его скорее всего индусы это понятно. Но проблема в том, что этот код похоже никто никогда не использвал. :) Т.е. для тестов и бенчмарков он может и сгодиться, а вот для реальных приложений нет. Не реализовав и не измерив производительность С-кода (с интринсинками, конечно) вы уже начали разбираться с ассемблером?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 31 октября, 2014 Опубликовано 31 октября, 2014 · Жалоба Не реализовав и не измерив производительность С-кода (с интринсинками, конечно) вы уже начали разбираться с ассемблером?! Я с ассемблерами вообще знаком, да и с этим надо знать максимум 6 комманд. Так что ничего сложного. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qxov 0 1 ноября, 2014 Опубликовано 1 ноября, 2014 · Жалоба Вот сижу, разбираюсь с ассемблером и смотрю в код который идет от TI. То что писали его скорее всего индусы это понятно. Но проблема в том, что этот код похоже никто никогда не использвал. :) Т.е. для тестов и бенчмарков он может и сгодиться, а вот для реальных приложений нет. Все Ваши сообщения говорят о полном непонимании того инструменита, которым пытаетесь воспользоваться. Вы даже не потрудились прочитать документацию в части интересующей функции. При этом вешаете ярлыки на всех окружающих. Фу так делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Russky 0 3 ноября, 2014 Опубликовано 3 ноября, 2014 · Жалоба Сделал я быстрый фир. Заоодно с ассемблером разобрался. :) Получилось достаточно близко к тому что ожидалось. Все Ваши сообщения говорят о полном непонимании того инструменита, которым пытаетесь воспользоваться. Вы даже не потрудились прочитать документацию в части интересующей функции. При этом вешаете ярлыки на всех окружающих. Фу так делать. Тут все просто. Есть DSP и к нему должна быть работающая библиотека, как например у Интела. Если этого нет - это плохо. Библиотека примитивов или то что предлагает TI, это хорошо когда есть громадный запас в мипсах, и в принципе можно писать все на C. Если запаса нет, и процессор предполагается использовать под 90%, вот тут и нужна нормальная библиотека. Или надо выбирать другой, более мощный проц,но тогда либо не надо указывать свои 2400 мегафлоп, либо... Я уже не говорю, что половина ф-й которые написаны на ассемблере не работают в приципе. Т.е. библиотеку можно использовать как пример, но не более того. Тут можно сказать что типа эта библиотека нужна для бенчмарков, но это отговорка. В общем, при всем моем уважении к TI, с которым я работаю уже почти 20 лет, могу сказать что библиотеку под C674x они сделали плохо, хотя сделать ее нормально проблем нет. Бери доку на ipp библиотеку от интела, и повторяй один в один только для float32. Одна ф-я - один день. :) В общем, L138 действительно быстрый процессор, но только его надо уметь программировать. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 3 ноября, 2014 Опубликовано 3 ноября, 2014 · Жалоба Я с ассемблерами вообще знаком, да и с этим надо знать максимум 6 комманд. Так что ничего сложного. Смешно. Даже очень. Чтобы написать на ЭТОМ ассемблере хоть как-то оптимально работающую функцию, которая бы каждый такт перемножала две пары данных, и аккумулировала их, надо сначала себе весь мозг сломать на программной конвейеризации такого цикла, где данные достаются с задержкой 4 дэлей слота (LDW), а перемножение float*float (MPYSP) имеет задержку три такта от команды до результата... Это же VLIW - надо загрузить процессор так, чтобы он каждый такт исполнял максимальное кол-во операций на всех его юнитах, а это ой как не просто... (даже, если SPLOOP использовать, и то сложно, а без него там без литрухи вообще не разберешься). Кстати, такие простые ф-ции, как FIR-фильтрация, реализовывать надо вообще на С, он конвейеризирует простенькие циклы отменно. А касаемо линий задержки - надо просто использовать циркулярный режим адресации, и реализовывать там ничего не надо, все реализовано в ядре процессора железно. Смещаете указатель на единичку вперед каждый раз, а через "хвост" буфера на начало он будет переворачиваться внутри цикла сам по себе, и это может и стандартная ф-ция из DSPLIB тоже, только правильно подготовить регистр AMR перед вызовом фильтрации - и вот оно чудо, функция превращается в такую, которая работает с линией задержки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 3 ноября, 2014 Опубликовано 3 ноября, 2014 · Жалоба Есть DSP и к нему должна быть работающая библиотека, как например у Интела. Если этого нет - это плохо. Библиотека примитивов или то что предлагает TI, это хорошо когда есть громадный запас в мипсах, и в принципе можно писать все на C. Не могли бы вы для меня конкретизировать, какие именно библиотеки упомянули? (как Intel, так и TI) А то мне, как "библиотекарю" ftp, этот вопрос очень интересен. Только лучше (если, конечно, можно) не словесами ответить, а просто назвать имя файла, содержащего ту или иную библиотеку - этого мне будет достаточно, чтобы понять, о чем идет речь, или навести справки. А вот словесные объяснения очень плохо переводятся в название файла, а потому обычно порождают двумысленности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться