реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как правильно фильтровать?
inventor
сообщение Oct 28 2015, 12:05
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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 и что то другое.
у кого какие мысли?

Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Oct 28 2015, 12:52
Сообщение #2





Guests






Поставить 8 CPU.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Oct 28 2015, 12:59
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(TSerg @ Oct 28 2015, 15:52) *
Поставить 8 CPU.

Или реализовать фильтры на ПЛИС. А иначе никак, ИМХО, "синхронной" фильтрации по 8 каналам не достичь ...
Хотя, если у вас время между отсчетами достаточное большое ... Получаем, например, по 32 отсчета с каждого канала и для каждого из каналов вызываем функцию фильтрации. Таких вызовов будет 8. Главное, чтобы все они уложились в промежуток между входными отсчетами (с некоторым запасом), тогда при получении 33-го входного отсчета мы сможем выдать выходной отсчет, запомнить 33-й входной отсчет и "пустить его в работу" ...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 28 2015, 13:17
Сообщение #4


Универсальный солдатик
******

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



Зачем "одновременно"? Обрабатывайте блоки от каждого канала по-очереди. Блок сделайте равным коэффициенту децимации. После каждого вызова функции получите одну точку результата для одного канала. Чисто теоретически, imho.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 28 2015, 13:23
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Если вам не нужно 1000 герцовых измерений, то на входе АЦП ставьте аналоговый фильтр, который отрезает выше 250, тогда фильтрация при первой децимации не понадобится.
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 28 2015, 13:24
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



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

то есть сначала для первого отсчета, через 32 отсчета для второго, через 64 для третьего?
Правильно?
насчте синхронной филттрации.
у меня не звук, где это было бы допустимо
там сейсмоданные и желательно знать когда сигналы к чему относятца.
сейчас у меня обычный FIR фильтр, который дает задержку на 32 отсчета,
т.е. на 32 миллисекунды.
хотелось бы чтобы время, которое я записываю с данными датчиков
соответсвовало первому отсчету в пачке.
а таким образом (не одновременная фильтрация)
время будет соответсвовать только примерно.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 28 2015, 13:26
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



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


Я так понял, что надо на лету в реалтайме обрабатывать.
Go to the top of the page
 
+Quote Post
kovigor
сообщение Oct 28 2015, 13:27
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(Tarbal @ Oct 28 2015, 16:26) *
Я так понял, что надо на лету в реалтайме обрабатывать.

А я понял, что надо одновременно брать отсчеты по восьми каналам и одновременно обрабатывать. Короче, пусть ТС объяснится ...
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 28 2015, 13:28
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(inventor @ Oct 28 2015, 17:24) *
то есть сначала для первого отсчета, через 32 отсчета для второго, через 64 для третьего?
Правильно?


Можно и так. Но есть и другой способ:
Записали в буфер и три раза разными дорожками пустили. Все зависит от ваших целей.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 28 2015, 13:35
Сообщение #10


Универсальный солдатик
******

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



Цитата(inventor @ Oct 28 2015, 16:24) *
то есть сначала для первого отсчета, через 32 отсчета для второго, через 64 для третьего?
Правильно?

Функция обрабатывает блоки данных. Ваша задача сформировать эти блоки. Если у вас 8 каналов, распихивайте принятые с АЦП данные по 8-ми массивам (блокам). И вызывайте функцию для обработки каждого из блоков. Я бы сделал входной блок размером с к-т децимации, и как только он заполнен, вызывал бы функцию.

Вообще, какая там математика - децимация. Возьмите 2(4, 8) выборки, сложите и поделите на 2 (4, 8). rolleyes.gif

Цитата(inventor @ Oct 28 2015, 16:24) *
сейчас у меня обычный FIR фильтр, который дает задержку на 32 отсчета,
т.е. на 32 миллисекунды.
хотелось бы чтобы время, которое я записываю с данными датчиков
соответсвовало первому отсчету в пачке.

Сдвиньте результат на 32 шага назад. rolleyes.gif
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Oct 28 2015, 13:38
Сообщение #11





Guests






Цитата(inventor @ Oct 28 2015, 16:24) *
то есть сначала для первого отсчета


Что-то Вы путаете кислое с пресным. На одном процессоре невозможно параллельно обработать многоканальный поток данных - только последовательно.

Можно организовать быстрый ввод по одному отсчету с каждого канала и до поступления очередных отсчетов реализовать FIR-ы по всем каналам.
Сдвиг по времени каждого отсчета определиться максимально допустимой частотой переключения опроса датчиков.
Время - условное понятие. Если известна частота опроса датчиков, то shift легко вычисляется.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Oct 28 2015, 13:58
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(ViKo @ Oct 28 2015, 17:35) *
Вообще, какая там математика - децимация. Возьмите 2(4, 8) выборки, сложите и поделите на 2 (4, 8). rolleyes.gif


Децимация действительно легко делается, но предшествующая ей фильтрация требует подсчета свертки.
Да еще и с высокой точностью, что обычная целая математика не прокатит.

Сообщение отредактировал Tarbal - Oct 28 2015, 13:58
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 28 2015, 14:05
Сообщение #13


Универсальный солдатик
******

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



Цитата(Tarbal @ Oct 28 2015, 16:58) *
Децимация действительно легко делается, но предшествующая ей фильтрация требует подсчета свертки.
Да еще и с высокой точностью, что обычная целая математика не прокатит.

Если входной сигнал сразу отфильтровать (тем самым, ААА-фильтром) под частоту дискретизации после децимации, то и фильтрации не надо.
Среднее арифметическое - тоже фильтр НЧ.
Простейшая децимация - просто отбросить ненужные выборки, как будто их и не было.
Go to the top of the page
 
+Quote Post
Guest_TSerg_*
сообщение Oct 28 2015, 14:07
Сообщение #14





Guests






Цитата(Tarbal @ Oct 28 2015, 16:58) *
Д обычная целая математика не прокатит.


Смотря какой фильтр sm.gif
Go to the top of the page
 
+Quote Post
inventor
сообщение Oct 28 2015, 14:14
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(ViKo @ Oct 28 2015, 17:05) *
Простейшая децимация - просто отбросить ненужные выборки, как будто их и не было.

так у меня уже сделано - брал 2-й, 4-й и 8-й отсчет
просто не хочу нехороших эффектов с наложением.
мне кажется цифровой фильтр все таки должен быть.

Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016