|
Переходные процессы в цифровых фильтрах, вопрос |
|
|
|
Mar 23 2011, 13:15
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(SSerge @ Mar 23 2011, 15:29)  "некий буфер" должен быть кольцевым. да. буфер кольцевой, но фильтрация всё равно осущестлвяется над куском этого буфера... Цитата(maugli @ Mar 23 2011, 15:32)  Сохраняйте полное состояние фильтра в прмежутках фильтрации . Можно по подробнее. Что такое полное состояние фильтра?
|
|
|
|
|
Mar 23 2011, 15:04
|
Частый гость
 
Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172

|
Цитата Обработку порциями можно реализовать не только в БПФ (FFT), но и в КИХ- и БИХ-фильтрах Но тогда непонятно как порции результатов сшивать. Если сшивать не надо, то понятно, что можно. Цитата Надо осуществить постоянное поступление данных в фильтр? Бесконечная циклическая фильтрация? а если фильтров несколько? Несколько последовательных фильтров или несколько параллельных каналов фильтров?
Сообщение отредактировал Мусатов Константин - Mar 23 2011, 15:05
|
|
|
|
|
Mar 23 2011, 15:39
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Алгоритм обработки данных должен выглядеть как на рисунке ниже. Как фильтрация по уму делается? Понимаю что накапливать блок данных, а затем фильтровать не совсем good (это для FFT годится). как я понимаю фильтрация (как КИХ так и БИХ в моём случае) должна выполнятся непрерывно с приходом новго отсчёта? Соответственно формируются новые буферы циклические (ещё два буфера помимо основного), в которых лежат фильтрованые данные... а в прерывании (1 раз в секунду для расчёта частоты) уже обработывать фильтрованые данные, а не фильтровать... Наставтье на путь истиный...
Эскизы прикрепленных изображений
|
|
|
|
|
Mar 23 2011, 20:40
|
Частый гость
 
Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172

|
Цитата(bahurin @ Mar 23 2011, 18:38)  любой фильтр КИХ или БИХ может работать бесконечно. Переходной процесс будет только в начале если данные идут без разрывов. Цифровой фильтр это набор ячеек памяти и коэффициентов нерекурсивной и рекурсивной части (если она есть). Поскольку коэффициенты не изменяются то вам нужно запомнить состояние ячеек памяти на последнем отсчете предыдущего куска и использовать эти значения как начальные условия на следующем куске. Сшивка в этом случае будет автоматической. Это все понятно. Выражение блоковая обработка означает, что получили ограниченный блок и с ним возимся. А КИХ или БИХ фильтры потоковые, работающие на FIFO или циклических буферах. В том то и суть, что операция выполняется на каждом отсчете (не важно потом или сразу), в отличие от FFT, где берется блок и операция выполняется над блоком. Хотя, вроде есть алгоритмы непрерывного FFT... Цитата(Zelepuk @ Mar 23 2011, 18:39)  Алгоритм обработки данных должен выглядеть как на рисунке ниже. Наставтье на путь истиный... То, что Вы называете блок компенсации - это так же фильтр, КИХ или БИХ, в зависимости от сложности и требований. Его было бы логично объединить с децимирующим, что бы снизить вычислительные нагрузки. Но это надо смотреть вам исходя из параметров. КИХ фильтр исполняется на каждом отсчете. Имеете циклический буфер, на место самой старой записи пишете новую, сдвигаете курсор начала и выполняете операцию свертки. Полученный результат идет дальше. И так на каждом шаге. Где надо делать FFT, копите буфер. Как заполнился, выполнили FFT и очистили буфер. Может потребоваться два буфера, если FFT не выполнится за цикл оцифровки.
|
|
|
|
|
Mar 23 2011, 21:43
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-10-10
Из: Москва
Пользователь №: 60 055

|
Цитата(Zelepuk @ Mar 23 2011, 18:39)  Алгоритм обработки данных должен выглядеть как на рисунке ниже. Как фильтрация по уму делается? Понимаю что накапливать блок данных, а затем фильтровать не совсем good (это для FFT годится).
как я понимаю фильтрация (как КИХ так и БИХ в моём случае) должна выполнятся непрерывно с приходом новго отсчёта? Соответственно формируются новые буферы циклические (ещё два буфера помимо основного), в которых лежат фильтрованые данные... а в прерывании (1 раз в секунду для расчёта частоты) уже обработывать фильтрованые данные, а не фильтровать... Наставтье на путь истиный... Какие частоты на входе и на выходе? По идее Вам надо спроектировать, к примеру в Матлабовском FDATool децимирующий фильтр, потом сделайте кольцевой буфер длиннее порядка фильтра и такой длинны, чтобы данные не наползали за время обработки, после чего вычисляйте каждый N-ный отсчет (N - коэффициент децимации, надеюсь у Вас - целый), результат сохраняйте в другой кольцевой буфер и обрабатывайте дальше. Кстати, а зачем перед измерителем частоты БИХ - фильтр? Частоту можно измерить например путем подсчета переходов через ноль - чтобы не мешал шум переход засчитывайте только если сигнал после перехода пересек также некий пороговый уровень в ту же сторону. Пороговый уровень может быть, например, 1/3 размаха, либо, если сигнал зашумлен, можно сделать ФАПЧ.
|
|
|
|
|
Mar 24 2011, 04:37
|

Профессионал
    
Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955

|
Про "сшивку", суммирование с перекрытием и "фильтрацию по уму" в случае FFT. Сначала выясняете длину импульсной характеристики M. Если имеете только частотную характеристику, делаете обратное ДПФ от нее и выясняете, при каком M отсчеты становятся меньше требуемой точности вычислений. Потом определеяте потребную длину FFT N. Входной поток разбиваете на блоки по N-M отсчетов, дополняете M нулями и делаете FFT. При необходимости фильтруете и делаете обратное FFT. Таким образом, входные блоки имеют длину N-M, выходные N. Непрерывный выходной поток получаете, объединяя выходные блоки с перекрытием M отсчетов. Внутри зоны перекрытия суммируете одновременные отсчеты из разных блоков. От более раннего блока это затухающие отсчеты, от более позднего - начальные отсчеты переходного процесса. В сумме они обеспечивают математически корректную сшивку блоков. Все, непрерывный выходной поток не имеет переходных процессов внутри себя, только в начале. Хотя, может, ваша задача и не требует обратного преобразования и суммирования с перекрытием.
Сообщение отредактировал V_G - Mar 24 2011, 04:38
|
|
|
|
|
Mar 24 2011, 07:01
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-10-10
Из: Москва
Пользователь №: 60 055

|
Цитата(Zelepuk @ Mar 24 2011, 09:29)  Спасибо всем за коментарии. Ситуация проясняется. Выходит что если меем некий каскад КИХ-фильтров (к примеру), то нужно для каждого этапа (для каждого нового фильтра) делать свой колцевой буфер? Есть какие-то критерии повыбору длины? иначе говоря как расчитать длину кольцевого буфера чтобы успеть брать и обробатывать по одному тсчёту(фильтрация)?
Итого имеем систему:
АЦП -> кольцевой буфер -> КИХ-фильтр дециматор -> кольцевой буфер -> БИХ-фильтр
Вывод: до каждого фильтра должен стоять кольцевой буфер. В принципе да. Входной кольцевой буфер необходим для того, чтобы хранить достаточное для работы фильтра количество входных отсчетов, выходные отсчеты, соответственно, сохраняются в выходном кольцевом буфере. КИХ - фильтры каскадно практически никогда не включают - их почти всегда можно привести к одному фильтру. БИХ - фильтры наоборот - почти всегда разбивают на звенья второго порядка и эти звенья включают последовательно.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|