Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Расчет БИХ фильтра
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
ChipMicro
Зачем расчитывать фильтры высоких порядков(например Баттерворта или Чебышева), если можно расчитать одну секцию второго порядка и соеденить их сколько надо(+ если надо добавить секцию 1 порядка) ?
Stanislav
Цитата(ChipMicro @ Jul 26 2006, 19:52) *
Зачем расчитывать фильтры высоких порядков(например Баттерворта или Чебышева), если можно расчитать одну секцию второго порядка и соеденить их сколько надо(+ если надо добавить секцию 1 порядка) ?
Именно так часто и делается. Только секции второго порядка разные.
При одинаковых секциях нельзя получить большую крутизну спада АЧХ фильтра.
ChipMicro
Цитата
При одинаковых секциях нельзя получить большую крутизну спада АЧХ фильтра.

А почему ? Разве два БИХ фильтра соединеных последовательно не увеличат суммарную крутизну ?
Stanislav
Цитата(ChipMicro @ Jul 26 2006, 20:18) *
Цитата
При одинаковых секциях нельзя получить большую крутизну спада АЧХ фильтра.

А почему ? Разве два БИХ фильтра соединеных последовательно не увеличат суммарную крутизну ?
Частота среза также сдвинется. Получится, что для фильтра с бесконечным числом одинаковых звеньев при не равной нулю частоте среза (или полосе пропускания для ПФ) крутизна спада АЧХ будет конечной и вполне определённой величиной.
Doka
Цитата(ChipMicro @ Jul 26 2006, 20:18) *
Цитата
При одинаковых секциях нельзя получить большую крутизну спада АЧХ фильтра.

А почему ? Разве два БИХ фильтра соединеных последовательно не увеличат суммарную крутизну ?


не знаю насколько удачной может показаться следующая метафора:
разложение на гармоники импульта типа меандра:
вертикальный фронт получается при сложении волн различных частот: притом самая большая амплитуда - у синуса той же частоты.

ЗЫ: отличие одно - здесь сложение волн, а в ЧХ - умножение


upd: даже картиночка нашлась =)
Нажмите для просмотра прикрепленного файла
ChipMicro
C Меандром все кристально, а вот с фильтром пока не совсем. Зто из за одинаковой фазовой хар-ки что ли ? Или синусоиды аналоги секций ???
Doka
Цитата(ChipMicro @ Jul 27 2006, 19:59) *
C Меандром все кристально, а вот с фильтром пока не совсем. Зто из за одинаковой фазовой хар-ки что ли ? Или синусоиды аналоги секций ???


ну так при последовательном включении секций результирующий коэф-т передачи получается перемножением коэф-тов передачи секций.
.
а на картинке показано как изменяется форма результирующего сигнала с увеличением суммарного числа гармоник (показана самам сумма- от первого слагаемого (синусоиды основной гармоники) - до меандра (в идеале большое число слагаемых.)
ChipMicro
Станислав писал :

Цитата
Частота среза также сдвинется. Получится, что для фильтра с бесконечным числом одинаковых звеньев при не равной нулю частоте среза (или полосе пропускания для ПФ) крутизна спада АЧХ будет конечной и вполне определённой величиной.


На сколько, куда и почему сдвинется частота среза ?
Stanislav
Цитата(ChipMicro @ Jul 27 2006, 22:24) *
Станислав писал :

Цитата
Частота среза также сдвинется. Получится, что для фильтра с бесконечным числом одинаковых звеньев при не равной нулю частоте среза (или полосе пропускания для ПФ) крутизна спада АЧХ будет конечной и вполне определённой величиной.


На сколько, куда и почему сдвинется частота среза ?
Перемножьте две АЧХ, скажем, звеньев НЧ 2-го порядка и посмотрите результирующую АЧХ. Точка -3дБ, например, "отъедет" к нулевой частоте.
ChipMicro
Цитата
Перемножьте две АЧХ, скажем, звеньев НЧ 2-го порядка и посмотрите результирующую АЧХ. Точка -3дБ, например, "отъедет" к нулевой частоте.


Правильно, она и должна отъехать при одинаковых звеньях. Из-за стремления к 0 части АЧХ, коэф-т усиления которой <1. При бесконечном числе одинаковых звеньев, Чебышевский ФНЧ превратится в идеальную "ступеньку", если не считать маленькие неравномерности в ПП, которые правда приведут к сильным провалам. Другая ситуация с Баттервортом, там вся характеристика, кроме близкой 0 окажется ниже 0 dB. Причинами описанных ситуаций является неровная АЧХ в ПП.


Кажется я сам ответил на свой вопрос.
Stanislav
Простите, но подумайте о том, что Вы пишете. Например, как понимать вот это:
Цитата(ChipMicro @ Jul 28 2006, 21:12) *
...При бесконечном числе одинаковых звеньев, Чебышевский ФНЧ превратится в идеальную "ступеньку", если не считать маленькие неравномерности в ПП, которые правда приведут к сильным провалам...
???
КАК может чебышёвский ФНЧ состоять из одинаковых звеньев? blink.gif
ChipMicro
Цитата(Stanislav @ Aug 1 2006, 11:09) *
КАК может чебышёвский ФНЧ состоять из одинаковых звеньев? blink.gif

Элементарно, как любой другой фильтр.
Designer56
Цитата(Stanislav @ Aug 1 2006, 12:09) *
Простите, но подумайте о том, что Вы пишете. Например, как понимать вот это:
Цитата(ChipMicro @ Jul 28 2006, 21:12) *
...При бесконечном числе одинаковых звеньев, Чебышевский ФНЧ превратится в идеальную "ступеньку", если не считать маленькие неравномерности в ПП, которые правда приведут к сильным провалам...
???
КАК может чебышёвский ФНЧ состоять из одинаковых звеньев? blink.gif



Цитата(ChipMicro @ Dec 31 2006, 15:55) *
Цитата(Stanislav @ Aug 1 2006, 11:09) *

КАК может чебышёвский ФНЧ состоять из одинаковых звеньев? blink.gif

Элементарно, как любой другой фильтр.



По теме: Синтез фильтров и имеет свей целью оптимизировать именно переходный участок в совоокупности с другими ограничениями- неравномерность АЧХ в полосе пропускания,ФЧХ, переходная х-ка... что, впрочем,с математической точки зрения эквивалентно.и притом- при минимальном порядке цепи. С Новым годом!

Stanislav, признаться, я питал некоторые иллюзии, что здесь несколько лучше, чем в реальной жизни...( я здесь недавно, всё вышеизложенное не к Вам).
ChipMicro
Переходной участок можно сделать близким к ступеньке, но толку от этого не будет если пп/пз сущевственно неравномерна.
GinGreen
Цитата(ChipMicro @ Jul 26 2006, 15:52) *
Зачем расчитывать фильтры высоких порядков(например Баттерворта или Чебышева), если можно расчитать одну секцию второго порядка и соеденить их сколько надо(+ если надо добавить секцию 1 порядка) ?


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


F(W) = 1 / ( 1 + E * T(2,W/W0))


Для этого используем T(2, W/W0) - полином Чебышева второго порядка. E - некоторая константа положительная, < 1.
Очевидно, что F(W) - принадлежит отрезку [1 / (1 + E), 1] при W из [0, W0]
и стремится к нулю при W > W0. Случай W < 0 нас не интересует.


функция Баттерворта


F(W) = 1 / ( 1 + E*( (W/W0) ^2))


H(W) = П F(W) - аппроксимация квадрата АЧХ при последовательном соединении одинаковых звеньев .
(Здесь П - это произведение)

Кстати от сюда следует, что при бесконечном числе одинаковых звеньев АЧХ Чебышевского фильтра превращается в конечную последовательность единиц (не ступенька !), а АЧХ фильтр Баттерворта во что- то похожее на дельта функцию.

При каждом добавлении звена у нас будут уменьшатся (в направлении нуля) значения H(W) отличные от единицы.

Смысл, сказанного выше в том, что функции аппроксимации БИХ фильтров не превосходят единицы.
И при последовательном соединении звеньев, АЧХ, вам будет сложнее контролировать характеристики (например, с помощью параметра E).

Полученный фильтр, скорее всего, будет иметь более высокий порядок и неудобные для вычислений значения коэффициентов по сравнению с обычным фильтром (если взять одинаковые точности аппроксимации в полосе пропускания). При этом скорость затухания в полосе задержки будет такая же, как и у обычного фильтра того же типа и того же порядка. Параллельное соединение звеньев тоже ничего хорошего не обещает.


А цель ЛДС(в данном случае фильтра), определяется поставленной задачей.
nsemenoff
Цитата(ChipMicro @ Dec 31 2006, 19:02) *
Переходной участок можно сделать близким к ступеньке, но толку от этого не будет если пп/пз сущевственно неравномерна.


Можно сделать проще - БПФ+обрезание спектра+ОБПФ. Для сложных случаев АЧХ такой алгоритм намного предсказуемее, проще и надежнее. А главное, АЧХ потом можно будет подстраивать практически без переделки кода smile.gif
blackswan
передо мной стояла задача сделать полосовой фильтр для 14КГц... получил коэффициенты с помощью следующего в Матлабе:
[n14,Wn14]=cheb1ord(Wp14,Ws14,Rp,Rs);
[b14,a14]=cheby1(n14,Rp,Wn14);
получил фильтр 4 порядка по 9 коэффициентов А и В.... далее мне необходимо было промоделировать в проге на С++ этот процесс фильтрации, для этого использовал формулу y(n) = b(1) * x(n) + b(2) * x(n - 1) + ... + b(9) * x(n - 9) - a(1) * y(n - 1) - ... - a(9) * y(n - 9), ... в С++ всё работает и фильтрует... теперь мне то же самое необходимо сделать с помощью разбиения на секции 2 порядка (и проквантовать)... в МатЛабе это было сделано с помощью:
hq14=qfilt('df2', {b14, a14}, 'quantizer', [Pn Fl]);
hq1_14=sos(hq14,'up', 'inf');
получил 4 секции, и в Матлабе функцией filter всё фильтрует, но теперь мне надо то же самое повторить самому,но метаматической формулы для их реализации на С++ не получается составить... в чем-то ошибаюсь, но не могу понять, в чем.... помогите с этим вопросом...
SIA
Цитата(Stanislav @ Jul 26 2006, 20:34) *
А почему ? Разве два БИХ фильтра соединеных последовательно не увеличат суммарную крутизну ? Частота среза также сдвинется. Получится, что для фильтра с бесконечным числом одинаковых звеньев при не равной нулю частоте среза (или полосе пропускания для ПФ) крутизна спада АЧХ будет конечной и вполне определённой величиной.

Неверно. Крутизна спада АЧХ как раз будет пропорционально расти по мере роста числа звеньев, но будет портиться вид полосы пропускания. Фильтр высокого порядка тем и отличается от каскадного соединения звеньев низких порядков, что обеспечивает хорошую АЧХ в полосе пропускания и резкий переход к полосе заграждения.
Stanislav
Цитата(SIA @ Oct 6 2007, 21:51) *
Неверно. Крутизна спада АЧХ как раз будет пропорционально расти по мере роста числа звеньев, но будет портиться вид полосы пропускания. Фильтр высокого порядка тем и отличается от каскадного соединения звеньев низких порядков, что обеспечивает хорошую АЧХ в полосе пропускания и резкий переход к полосе заграждения.
Да что Вы говорите?
Не прошло и полутора лет, так сказать...
Поясните мысль, как это Вы с помощью одинаковых звеньев 2-го порядка получите чебышевскую АЧХ, скажем, с частотой среза в 1 кГц. Можете взять не чебышевскую, а любую другую "хорошую АЧХ в полосе пропускания и резкий переход к полосе заграждения."
А ещё почитайте учебники по данной тематике. На местном ФТП их есть несколько. Тогда, возможно, поймёте свою ошибку.

PS. Вы вообще поняли, о чём здесь речь, уважаемый? Или родили свой пост "от балды", лишь бы написать что-нибудь?
blackswan
а почему меня игнорируют?... я не в той теме вопрос задал?... или он слишком глупый?
Stanislav
Цитата(blackswan @ Oct 24 2007, 21:26) *
а почему меня игнорируют?... я не в той теме вопрос задал?... или он слишком глупый?
Каждая секция - это фильтр второго порядка. Коэфф-ты его даются при расчёте. Фильтруйте сигнал последовательно этими фильтрами, и всё будет ОК. smile.gif

Цитата(GinGreen @ Jan 13 2007, 14:55) *
Кстати от сюда следует, что при бесконечном числе одинаковых звеньев АЧХ Чебышевского фильтра превращается в конечную последовательность единиц (не ступенька !), а АЧХ фильтр Баттерворта во что- то похожее на дельта функцию...
Раз уж подняли тему...
Попробуйте рассчитать, во что выродится АЧХ бесконечного числа звеньев 2-го порядка, если потребовать для Чебышева пульсации в полосе пропускания, скажем, 1 дБ, а для Баттерворта полосу пропускания по -3 дБ, скажем, 1 кГц. smile.gif
Ведь эти критерии и лежат в основе расчёта данных фильтров.
blackswan
Цитата(Stanislav @ Oct 24 2007, 21:53) *
Каждая секция - это фильтр второго порядка. Коэфф-ты его даются при расчёте. Фильтруйте сигнал последовательно этими фильтрами, и всё будет ОК. smile.gif

это я понял... и коэффициенты у меня есть... мне не до конца понятно, что является входными параметрами для каждой секции.... допустим у меня был простой фильтр 8-го порядка с 9-ю коэффициетами, чтоб получить 9-ый Y, надо использовать 9 входных отсчетов X и 8 предыдущих выходных отсчетов Y... теперь переходим к секциям... всё тот же 9-ый отсчет... в самую первую секцию я передаю уже Y8,Y7,X9,X8,X7 и провожу формулу Y9=B10*X9+B11*X8+B12*X7-A11*Y8-A12*Y7.... правильно?... а во вторую и последующие секции что я передаю в качестве трех X-ов и двух Y-ов...? если в качестве входного сигнала из трех X-ов передавать переменные отфильрованные три Y-ка (назовем их Y7',Y8',Y9'), то что передавать в качестве Y8,Y7 для полноты формулы?...
mse
Цитата(blackswan @ Oct 25 2007, 09:30) *
это я понял... и коэффициенты у меня есть... мне не до конца понятно...

Посмотрите, какую структуру секций посчитал вам Матлаб: DF1, DF2, TDF... потом в хелпе посмотрите на эту структуру как на граф. И сразу "как солнце из-за тучь!!!" SOS-matrix вам должна быть разложена по секциям. Работы - с гулькин...
blackswan
у меня DF2 - каноническая... хелпа нет, но форму посмотрел в книге Сергиенко... и ничего не понял... то, что я увидел, это Yk=Xk*B0 + Xk-1*A1 + Xk-2*A2 - Xk-1*B1 - Xk-2*B2 ... но этого не может быть, так как нет предыдущих Y... я не умею читать графы... у вас есть программа на каком-нибудь языке программирования, я так лучше пойму...
blackswan
в одной книге я нашел объяснение... по нему получается вот такое...
//n-текущий отсчет, N- количество секций
xn=x[n];
w1=w2=0;
for (k=1;k<=N;k++)
{wk=xn - a[k][1]*w1 - a[k][2];
yk=b[k][0]*wk + b[k][1]*w1 + b[k][2]*w2;
w2=w1;
w1=wk;
xn=yk;
}
y[n]=yk;

выдает отсчеты, похожие на правду, но в формуле должны присутствовать еще коэффициент(ы) усиления G... и тут путаница... в книге он умножался на xn в формуле wk ... при описании разбиения функцией sos в MATLAB я использовал 'up' и 'inf' ... в книге Сергиенко написано, что inf - масштабирование коэффициентов bi производится исходя из L8-нормы АЧХ секций, а что это значит, не знаю... я многие варианты вставки G перепробовал...
mse
Цитата(blackswan @ Oct 26 2007, 09:09) *
...я многие варианты вставки G перепробовал...

Вот код для SOS из QEDIT2000:

Код
static double     *m1,    /* intermediate storage */
        *m2;    /* intermediate storage */

static void cas_d1 () {
    int i;
    double *a, *b, s0, s1;
    
    a = den; b = num;  s0 = GAIN * get_input_data ();
    
    for (i = 0; i < SECTION; i++) {
          s1 = (s0 * b[0] + m1[i]) / a[0];
          m1[i] = m2[i] + s0 * b[1] - s1 * a[1];
          m2[i] = s0 * b[2] - s1 * a[2];
          s0 = s1; a += 3; b += 3;
    }
    send_output_data (s1);
}
blackswan
сделал... не получается.... при амплитуде сигнала в 60 после фильтрации получаются очень маленькие дроби... и на синусоиду не похоже вроде... хочется узнать, что такое L8-норма и какие коэффициенты усиления при этом формируются...
mse
Цитата(blackswan @ Oct 26 2007, 23:48) *
сделал... не получается.... при амплитуде сигнала в 60 после фильтрации получаются очень маленькие дроби... и на синусоиду не похоже вроде... хочется узнать, что такое L8-норма и какие коэффициенты усиления при этом формируются...

Дык, понятно ;О) Плавуче надо. А на синус и не будет похоже. Треугольники-трапеццыи всякие...Скока точек на период?
blackswan
9 точек... только график несимметричен относительно Ох, и прыгает из + в - когда захочет... я посмотрел в другой книге - Ваш вариант из QEDIT2000 аналогичен моему, только это 3-я форма, а у меня 1-ая канонического представления, и они эквивалентны... я тоже вставлял Gain, который мне расчитал MATLAB вот так
xn=Gain*x[n];
и даже так уже в цикле
wk=Gain*xn - a[k][1]*w1 - a[k][2];
для всех секций и для одной... умножал все Bi на него для всех секций и для одной(в книге Сергиенко сказано , что L-бесконечная форма масштабирует Bi)... получаются очень маленькие дроби... разве такое может быть при задаваемой амплитуде в 60 во входном сигнале?
mse
Цитата(blackswan @ Oct 27 2007, 14:17) *
... получаются очень маленькие дроби... разве такое может быть при задаваемой амплитуде в 60 во входном сигнале?

Для целочисленки есть такая проблема. Никуда не деться, увы. Пользуйте плывучку, если можете. Для напопробовать, загоните алгоритм в эксель или матлаб какой(чтобы формулы) и посчитайте. Если увидите что хотите, значит вот оно. Если нет, ищите ошибки.
blackswan
плавучку не могу... только целочесленка.. собственно, Atmega... 16 разрядов, 8 под дробь.... подходит только вариант секций с канонической формой и вот этим "INF"-расчетом коэффициента усиления... как я понял, на выходе получаются дроби из-за масштабирования... только вот не могу понять, куда ставить этот множитель gain... в MATLAB работает, в моей проге не работает... коэффициенты я не округлял, оставил фильтр в том же виде, что и расчитанный...
mse
Цитата(blackswan @ Oct 28 2007, 12:14) *
плавучку не могу... только целочесленка.. собственно, Atmega... 16 разрядов, 8 под дробь...

Множить на G надо только вх отсчёты. Если считаете, что вам действительно не даёт жить "ограничение" по G, промасштабируйте вход. В 256 раз, например. Выход - наоборот. Правда, все внутренние переменные и умножители станут на байт шире. Мож это спасёт отца русской демократии. ;О)
анатолий
А вот фильтры на всепропускающих звеньях
можно городить из одинаковых звеньев
и может получиться хорошо.
Даже с фиксированной запятой очень маленькой
разрядности коэффициентов.
Жаль, что в Матлабе про это мало чего есть.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.