Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Эффективная децимация в два раза
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Alex65111
Задача понизить частоту дискретизации в два раза. Соответственно надо сигнал подфильтровать, а потом децимировать. Сейчас я рассчитываю фильтр с большой крутизной, малыми (не более 0.1дБ) пульсациями в полосе пропускания, и подавлением не менее 96дБ методом Ремеза. В принципе работает. Но мне не дает покоя мысль, что где-то я встречал какой-то "хитрый" подход к решению проблемы децимации в два раза, в котором получается достаточно вычислительно эффективный фильтр. То ли малого порядка, то ли с кучей нулей в ИХ. Подскажите, на самом ли деле есть более лучшее решение?
SIA
Цитата(Alex65111 @ Nov 11 2007, 11:09) *
Задача понизить частоту дискретизации в два раза. Соответственно надо сигнал подфильтровать, а потом децимировать. Сейчас я рассчитываю фильтр с большой крутизной, малыми (не более 0.1дБ) пульсациями в полосе пропускания, и подавлением не менее 96дБ методом Ремеза. В принципе работает. Но мне не дает покоя мысль, что где-то я встречал какой-то "хитрый" подход к решению проблемы децимации в два раза, в котором получается достаточно вычислительно эффективный фильтр. То ли малого порядка, то ли с кучей нулей в ИХ. Подскажите, на самом ли деле есть более лучшее решение?

Зависит от вида АЧХ в полосе пропускания. Ну, а то, что при децимации не надо рассчитывать все выходные отсчеты, а только с деленной частотой, Вы и без меня догадались smile.gif
Alex65111
Цитата
Зависит от вида АЧХ в полосе пропускания


Какие варианты существуют? У меня требование неравномерности не более 0.1дБ.

И еще - после децимации коэффициент использования полосы должен составлять не менее 0.9 от Найквиста (что и приводит к требованию достаточно крутой переходной характеристики).
Andr2I
Цитата(Alex65111 @ Nov 11 2007, 11:09) *
Задача понизить частоту дискретизации в два раза. Соответственно надо сигнал подфильтровать, а потом децимировать. Сейчас я рассчитываю фильтр с большой крутизной, малыми (не более 0.1дБ) пульсациями в полосе пропускания, и подавлением не менее 96дБ методом Ремеза. В принципе работает. Но мне не дает покоя мысль, что где-то я встречал какой-то "хитрый" подход к решению проблемы децимации в два раза, в котором получается достаточно вычислительно эффективный фильтр. То ли малого порядка, то ли с кучей нулей в ИХ. Подскажите, на самом ли деле есть более лучшее решение?


Действительно, более эффективные (с точки зрения количества операций) фильтры существуют. Это так называемые CIC фильтры или гребенчатые фильтры. По сути дела это просто скользящее среднее вычисляемое эффективным образом. АЧХ такого фильтра довольно дрянное, с нормальным КИХ фильтром не сравнить, но иногда этого бывает достаточно.
Есть еще полифазные фильтры - это КИХ фильтр, у которого коэффициенты через один равны нулю - в два раза меньше умножений.
Так что выбор за Вами wink.gif .
Alex65111
Цитата
АЧХ такого фильтра довольно дрянное
- поэтому CICы и не рассматриваются. И еще потому, что они применяются тогда, когда требуется достаточно узкая рабочая полоса по отношению к частоте дискретизации.

Цитата
Есть еще полифазные фильтры - это КИХ фильтр, у которого коэффициенты через один равны нулю
- а это не понял. Полифазную реализацию знаю, а полифазную ИХ слышу впервые. Как этот зверь получается/рассчитывается?
Andr2I
Цитата(Alex65111 @ Nov 11 2007, 11:56) *
- а это не понял. Полифазную реализацию знаю, а полифазную ИХ слышу впервые. Как этот зверь получается/рассчитывается?


Посмотрите в книге по цифровой обработке - полифазные фильтры. Это КИХ фильтр, но половина коэффициентов равна нулю - отсюда несколько специфическая АЧХ. Рассчитать можно в MATLABе. По момему доступен при расчете в FDATOOL децимирующих и интерполирующих фильтров.
SIA
Цитата(Andr2I @ Nov 11 2007, 11:48) *
Действительно, более эффективные (с точки зрения количества операций) фильтры существуют. Это так называемые CIC фильтры или гребенчатые фильтры. По сути дела это просто скользящее среднее вычисляемое эффективным образом. АЧХ такого фильтра довольно дрянное, с нормальным КИХ фильтром не сравнить, но иногда этого бывает достаточно.
Есть еще полифазные фильтры - это КИХ фильтр, у которого коэффициенты через один равны нулю - в два раза меньше умножений.
Так что выбор за Вами wink.gif .

Такое (равенство нулю части коэффициентов) получается, только если частоты начала среза/полного затухания точно симметричны относительно доли Fs. Для фильтров децимации с выполнением условия Найквиста это заметного выигрыша не дает.
alex_os
Цитата(Alex65111 @ Nov 11 2007, 12:09) *
Задача понизить частоту дискретизации в два раза. Соответственно надо сигнал подфильтровать, а потом децимировать. Сейчас я рассчитываю фильтр с большой крутизной, малыми (не более 0.1дБ) пульсациями в полосе пропускания, и подавлением не менее 96дБ методом Ремеза. В принципе работает. Но мне не дает покоя мысль, что где-то я встречал какой-то "хитрый" подход к решению проблемы децимации в два раза, в котором получается достаточно вычислительно эффективный фильтр. То ли малого порядка, то ли с кучей нулей в ИХ. Подскажите, на самом ли деле есть более лучшее решение?

Если в два раза децимировать то нужно смотреть на полуполосный фильтр (halfband) - у него половина коэф. кроме центрального =0. Волшебное слово firhalfband ( Matlab 6.5) или можно тоже самое сделать в fdatool там можно выбрать halfband lowpass, halfband highpass.
rloc
Цитата(SIA @ Nov 11 2007, 12:10) *
Такое (равенство нулю части коэффициентов) получается, только если частоты начала среза/полного затухания точно симметричны относительно доли Fs.

Если быть более точным, то для равенства нулю каждого второго коэффициента, необходимо чтобы эквивалентная шумовая полоса была равна половине частоты дискретизации. Таким же образом можно получить равенство нулю каждого третьего, четвертого и т.д. коэффициентов.
Цитата
Для фильтров децимации с выполнением условия Найквиста это заметного выигрыша не дает.

Поясните, что Вы под этим подразумевали?
Alex65111
halfband lowpass вроде как да, но у него отвратительное подавление в полосе подавления, у меня получилось только 48дБ, при необходимых 96.
SIA
Цитата(rloc @ Nov 11 2007, 13:21) *
Если быть более точным, то для равенства нулю каждого второго коэффициента, необходимо чтобы эквивалентная шумовая полоса была равна половине частоты дискретизации. Таким же образом можно получить равенство нулю каждого третьего, четвертого и т.д. коэффициентов.

Да, это именно то, что я хотел сказать, просто не был уверен, что понятие шумовой (эквивалентной, эффективной) полосы будет воспринято правильно.
Цитата(rloc @ Nov 11 2007, 13:21) *
Поясните, что Вы под этим подразумевали?

То, что при децимации в n раз для выполнения условия найквиста полное затухание должно наступить уже на частоте Fs/2n, тогда эффективная полоса заведомо меньше этой величины. Halfband не прокатит. А учитывая, что использование полосы хочется иметь побольше, скажем, 80-90%, то начало спада придется где-то на Fs/2.2...2.5n, а при этом нулевыми можно сделать будет только не более 10-20% коэффициентов.
rloc
Цитата(SIA @ Nov 11 2007, 13:56) *
То, что при децимации в n раз для выполнения условия найквиста полное затухание должно наступить уже на частоте Fs/2n, тогда эффективная полоса заведомо меньше этой величины. Halfband не прокатит. А учитывая, что использование полосы хочется иметь побольше, скажем, 80-90%, то начало спада придется где-то на Fs/2.2...2.5n, а при этом нулевыми можно сделать будет только не более 10-20% коэффициентов.

Это не совсем верный подход. Надо делать полосу режекции немного дальше, чем Fs/2n. Нет ничего страшного в том, что часть шума завернется, во многих случаях важнее отсутствие корреляции шумов.
Alex65111
Так завернется не только шум, а и сам сигнал. В моем случае исходная частота дискретизации 120кГц. Полезная, рабочая полоса до 30кГц. При этом потерять я могу максимум от 29 до 30.
rloc
Цитата(Alex65111 @ Nov 11 2007, 14:38) *
Так завернется не только шум, а и сам сигнал. В моем случае исходная частота дискретизации 120кГц. Полезная, рабочая полоса до 30кГц. При этом потерять я могу максимум от 29 до 30.

Тогда фильтр, у которого половина коэффициентов равна 0, Вам не подойдет. Из Ваших условий не понятно о каких данных идет речь (действительные/комплексные), 30кГц - это вся полоса или половина, 29-30 - что это за цифры (дБ, %, кГц)?
Alex65111
Данные вещественные. Входной антиалисный аналоговый фильтр обеспечивает нужный уровень подавления примерно на 60кГц, хотя полезная полоса - до 30кГц. Соответственно частота дискретизации выбрана 120кГц. Далее необходимо цифровым фильтром подогнать полосу к 30кГц и продецимировав довести частоту дискретизации до 60кГц (опять же для вещественного сигнала).

Подход к проблеме в лоб в принципе задачу решает - Ремезом рассчитываю фильтр с переходной полосой от 29 до 30кГц, с пульсациями в полосе пропускания не более 0.1дБ и подавлением 96дБ. Фильтр получается где-то около 500 порядка.

Задача - попытаться найти решение не в лоб. По подсказке попробовал halfband.
В fdatool задал следующие параметры:
тип - halfband lowpass
filter order - 400
Fs=120000кГц
Fpass=29000кГц

Вроде у него каждый второй тап получился равен нулю. Да и пульсации и крутизна подходит.

При попытке применить опцию расчета децимирующего фильтра с коэффициентом децимации 2 и фильтром найквиста получился фильтр у которого порядок просто изумительный всего 47, но у него нужное подавление возникает только на 36кГц, т.е. у меня кусок от 24 до 30кГц будет искажен (а разрешается быть искажено только 29-30кГц) .

Так что пока я склоняюсь к halfband lowpass.

Кстати, я что-то не понял - в чем существенная разница между halfband lowpass расчетом фильтра и децимирующего фильтра Найквиста?
Самурай
Цитата(Alex65111 @ Nov 11 2007, 11:09) *
...
Но мне не дает покоя мысль, что где-то я встречал какой-то "хитрый" подход к решению проблемы децимации в два раза, в котором получается достаточно вычислительно эффективный фильтр. То ли малого порядка, то ли с кучей нулей в ИХ. Подскажите, на самом ли деле есть более лучшее решение?


Посмотрите на так называемые "Frequency-Response Masking FIR Filters", например вот в этой статье с аналогичным названием:

Frequency-Response Masking FIR Filters

Где-то встречал сравнение halfband фильтров и фильтров построенных по этой методике (где именно не помню), halfband фильтр проигрывал в несколько раз по количеству операций умножения.
Минус на первый взгляд только один - более сложная реализация.
stoker
Эффективный метод переноса частоты на Fs/2 - домножение на последовательность (-1)^n, то есть каждый 2-й отсчёт изменяем знак на противоположный.
...
Извиняюсь, туплю. krapula.gif тут вообще про дицимацию говорится...
анатолий
Таки-да маскирующие фильтры здесь оптимальный вариант.
Сам пробовал успешно фильтры на основе всепропускающих звеньев-
получается очень мало оборудования и высокое качество,
делал как здесь:

Таки-да маскирующие фильтры здесь оптимальный вариант.
Сам пробовал успешно фильтры на основе всепропускающих звеньев-
получается очень мало оборудования и высокое качество,
делал как здесь:
alex_os
2 Alex65111
Если фильтр такое длинючий может выгоднее будет в частотной области считать ....
RCray
блин истинно, век - живи, век - учись. хорошо, что зашёл в эту тему.
zhorro
Для децимации и интерполяции частото достаточно эффективным методом может служить использование БПФ. Взять БПФ от исходного сигнала, выбросить половину, и взять обратное БПФ от оставшегося.
stoker
Что то я не пойму, неужели для задачи децимации, скажем в 2 раза, нельзя тупо пропустить каждый 2-й отсчет?
Кажется я понял, интересует не сама децимация, сколько фильтр + дециматор, эффективная реализация.
Цитата(zhorro @ Nov 16 2007, 17:52) *
Для децимации и интерполяции частото достаточно эффективным методом может служить использование БПФ. Взять БПФ от исходного сигнала, выбросить половину, и взять обратное БПФ от оставшегося.

Я задавал такой вопрос, в другой конфе, пытаюсь найти практическую реализацию, мож кто видел?
rloc
Цитата(Самурай @ Nov 12 2007, 01:57) *
Посмотрите на так называемые "Frequency-Response Masking FIR Filters", например вот в этой статье с аналогичным названием:
Где-то встречал сравнение halfband фильтров и фильтров построенных по этой методике (где именно не помню), halfband фильтр проигрывал в несколько раз по количеству операций умножения.
Минус на первый взгляд только один - более сложная реализация.

К сожалению не всегда FRM фильтры дают существенный выигрыш по количеству операций умножения. Эти фильтры эффективны, когда пульсации (ripples) в полосе пропускания и подавления примерно равны по абсолютной величине. Автору нужны пульсации 0.1dB в полосе пропускания и ~0.00014dB (для 96dB подавления) в полосе подавления. При синтезе FRM фильтра, пульсации в полосе пропускания получаются такими же низкими, как и в полосе подавления, что приводит к очень большому порядку этого фильтра. Кому интересно, можете попробовать синтезировать простой FRM фильтр с помощью программы написанной самим изобретателем в среде Matlab:
FIR filter design using Frequency Response Masking Technique
vadkudr
http://vadkudr.boom.ru/Algorithms/EMQFdemo/EMQFdemo.html#29

A mozhet EMQF filtry Vam pomogut? u IIR filtrov porjadok menshe, a eti ese vdobavok i polifazno realizovany mogut byt'.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.