|
Как правильно фильтровать? |
|
|
|
Oct 28 2015, 12:05
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Задача такая - у меня АЦП может работать только на минимальной частоте 1000 Гц. мне нужны кратные частоты: 125, 250 и 500. Получить их можно проведя децимацию, предварительно перед которой отфильтровав все что выше чстоты найквиста. т.е. для получения данных на частоте 500, я запускаю измерения на 1000 Гц, фильтрую все что выше 250 и беру каждый второй отсчет. Не стал заморачиваться с фильтрами - смотрю они уже есть в армовсеом коде (те у кого STM в папке SMSIS) у меня процессор СС3200 - не нашел примеров именно для него, пока взял библиотечку у STM - она подходит к техасу (ф-я void arm_fir_decimate_fast_q31(///)). Есть несколько вопросов, у меня может быть от 1-го канала до 8-ми, вот как их всех одновременно фильтровать? Код, который делает АРМ я так понимаю УЖЕ оптимизирован по скорости, объему и прочему, сокращено количество циклов и всяких MAC операций. как сделать "нормальную" фильтрацию одновременно всех 8-ми каналов, и сколько навскидку времени уйдет на вызов функции фильтрации т.е. переписать саму функцию фильтрации, чтобы использовать только 1 функцию вместо идкущих подряд 8 и что то другое. у кого какие мысли?
|
|
|
|
Guest_TSerg_*
|
Oct 28 2015, 12:52
|
Guests

|
Поставить 8 CPU.
|
|
|
|
|
Oct 28 2015, 12:59
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(TSerg @ Oct 28 2015, 15:52)  Поставить 8 CPU. Или реализовать фильтры на ПЛИС. А иначе никак, ИМХО, "синхронной" фильтрации по 8 каналам не достичь ... Хотя, если у вас время между отсчетами достаточное большое ... Получаем, например, по 32 отсчета с каждого канала и для каждого из каналов вызываем функцию фильтрации. Таких вызовов будет 8. Главное, чтобы все они уложились в промежуток между входными отсчетами (с некоторым запасом), тогда при получении 33-го входного отсчета мы сможем выдать выходной отсчет, запомнить 33-й входной отсчет и "пустить его в работу" ...
|
|
|
|
|
Oct 28 2015, 13:24
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(ViKo @ Oct 28 2015, 16:17)  Зачем "одновременно"? Обрабатывайте блоки от каждого канала по-очереди. Блок сделайте равным коэффициенту децимации. После каждого вызова функции получите одну точку результата для одного канала. Чисто теоретически, imho. то есть сначала для первого отсчета, через 32 отсчета для второго, через 64 для третьего? Правильно? насчте синхронной филттрации. у меня не звук, где это было бы допустимо там сейсмоданные и желательно знать когда сигналы к чему относятца. сейчас у меня обычный FIR фильтр, который дает задержку на 32 отсчета, т.е. на 32 миллисекунды. хотелось бы чтобы время, которое я записываю с данными датчиков соответсвовало первому отсчету в пачке. а таким образом (не одновременная фильтрация) время будет соответсвовать только примерно.
|
|
|
|
|
Oct 28 2015, 13:35
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(inventor @ Oct 28 2015, 16:24)  то есть сначала для первого отсчета, через 32 отсчета для второго, через 64 для третьего? Правильно? Функция обрабатывает блоки данных. Ваша задача сформировать эти блоки. Если у вас 8 каналов, распихивайте принятые с АЦП данные по 8-ми массивам (блокам). И вызывайте функцию для обработки каждого из блоков. Я бы сделал входной блок размером с к-т децимации, и как только он заполнен, вызывал бы функцию. Вообще, какая там математика - децимация. Возьмите 2(4, 8) выборки, сложите и поделите на 2 (4, 8).  Цитата(inventor @ Oct 28 2015, 16:24)  сейчас у меня обычный FIR фильтр, который дает задержку на 32 отсчета, т.е. на 32 миллисекунды. хотелось бы чтобы время, которое я записываю с данными датчиков соответсвовало первому отсчету в пачке. Сдвиньте результат на 32 шага назад.
|
|
|
|
Guest_TSerg_*
|
Oct 28 2015, 13:38
|
Guests

|
Цитата(inventor @ Oct 28 2015, 16:24)  то есть сначала для первого отсчета Что-то Вы путаете кислое с пресным. На одном процессоре невозможно параллельно обработать многоканальный поток данных - только последовательно. Можно организовать быстрый ввод по одному отсчету с каждого канала и до поступления очередных отсчетов реализовать FIR-ы по всем каналам. Сдвиг по времени каждого отсчета определиться максимально допустимой частотой переключения опроса датчиков. Время - условное понятие. Если известна частота опроса датчиков, то shift легко вычисляется.
|
|
|
|
Guest_TSerg_*
|
Oct 28 2015, 14:07
|
Guests

|
Цитата(Tarbal @ Oct 28 2015, 16:58)  Д обычная целая математика не прокатит. Смотря какой фильтр
|
|
|
|
|
Oct 28 2015, 14:14
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(ViKo @ Oct 28 2015, 17:05)  Простейшая децимация - просто отбросить ненужные выборки, как будто их и не было. так у меня уже сделано - брал 2-й, 4-й и 8-й отсчет просто не хочу нехороших эффектов с наложением. мне кажется цифровой фильтр все таки должен быть.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|