Цифровые рекурсивные фильтры. Часть 1.

Я долго думал, как назвать тему. Вариантов было много: от рекламно-жизнерадостного «Цифровые фильтры — это очень просто!» до (с ярким оттенком снобизма) «Алгоритмы построения цифровых IIR- фильтров Баттерворта — для тупых!»
«По совету друзей» (с) я решил остановиться на нейтральном названии (простенько, но со вкусом (с)): «Цифровые рекурсивные фильтры», или, как их ещё называют в простонародье, «БИХ-фильтры» или фильтры с Бесконечной Импульсной Характеристикой, что эквивалентно буржуйскому IIR (infinite impulse response).
Моя цель — подготовить подготовить вас к чтению серьёзных статей по этой тематике (не дай Бог, конечно, но в жизни может всякое случиться...).
Продолжение в Часть 2. Часть 3.

Что от вас требуется:
1. Умение пользоваться Googleм (многие термины я объяснить подробно не смогу)
2. Знание математики в пределах 1 курса технического ВУЗа или продвинутое (см. пункт 1)
3. Знание программирования. Язык значения не имеет. Я буду приводить примеры на том языке, который под руку попадёт. В основном это будет Си и Фортран.
Претензии любителей Бэйсика, Дельфи, МатЛаба и PHP не принимаются.

I. Комплексная передаточная характеристика аналогового фильтра низких частот (ФНЧ).

«Аналоговый фильтр — это такая хрень устройство из сопротивлений, индуктивностей и конденсаторов» (с).Если кто ещё помнит ТОЭ (теоретические основы электротехники), комплексное сопротивление индуктивности
Z=jωL, конденсатора: Z=1/(jωC) где j — мнимая единица, ω- круговая частота
H(jω) — комплексная передаточная характеристика фильтра. То что в скобках стоит jω просто подчёркивает «комплексность» этой функции.H(jω) полностью описывает АЧХ (амплитудно-частотную характеристику) и ФЧХ (фазо-частотную характеристику) фильтра.Обычно обозначают jω=S.
Аналоговые фильтры давно и хорошо изучены. Здесь всё уже украдено придумано до нас.
Вот например:
Аналоговый ФНЧ Баттерворта 1 порядка:

Аналоговый ФНЧ Баттерворта 2 порядка:

Аналоговый ФНЧ Баттерворта 3 порядка:

Параметр β определяет частоту среза фильтра.

II. z- преобразование.

Наша задача превратить аналоговый ФНЧ в цифровой фильтр.
Чтобы перейти к цифровому фильтру надо сделать z-преобразование H(S)--> H(z)
Для ФНЧ z-преобразование имеет вид:

Для ФВЧ z-преобразование имеет вид:

Для фильтров низких порядков это легко: тупо подставляем в формулу Н(S) формулу S(z).
Давайте найдём H(z) ФВЧ 2-го порядка:

Упрощаем:

Окончательно:

В принципе, цифровой ФВЧ Баттерворта 2 порядка готов! Можно писать рекуррентную формулу :-)
В общем виде H(z) 2-го порядка:

Тогда:



Fs -частота среза фильтра, FN — частота Найквиста
α — параметр, определяющий по какому уровню мы определяем Fs.
Можно положить α=1, что соответствует уровню -3дБ.
Итак, мы определили коэффициенты H(z) для ФВЧ.
Соответствующая рекуррентная формула:

Примечание: Обычно, чтобы не тащить в рекуррентную формулу сомножитель 1/Ao, в формуле H(z) числитель и знаменатель умножают на 1/Ao.
Если мы проведём такие же выкладки для ФНЧ, то получим, что нечётные коэффициенты поменяют знаки.
A1фнч=-A1фвч и B1фнч=-B1фвч.

III. Матрица z- преобразования.

Пока порядок фильтра не очень высок, коэффициенты фильтра определить легко. На высоких порядках получаются многоэтажные дроби, которые трудно упростить.
Поэтому воспользуемся матрицами z -преобразования.
Для ФНЧ Баттерворта 2-го порядка:

Соответствующая матрица z- преобразования ФНЧ-ФВЧ имеет вид:





Для ФНЧ-ФНЧ:






То есть умножая матрицу z- преобразования на столбец, состоящий из коэффициентов H(S), сразу получаем искомые коэффициенты рекуррентной формулы!
Заметим, чтобы получить матрицу z- преобразования ФВЧ надо у матрицы z- преобразования ФНЧ переставить столбцы (и наоборот).
Матрицу z- преобразования относительно просто вычислить.
Вот пример матрицы ФНЧ 15 порядка:


Матрица z-преобразования зависит только от порядка фильтра. Сам фильтр может быть любым — Баттерворта, Чебышева 1 и 2 рода, Кауэра. Естественно и коэффициенты Bn придётся вычислять при помощи этой матрицы.
Сложнее дело обстоит с полосовыми и режекторными фильтрами. Матрица z-преобразования также существует, но имеет более сложный вид.
Пусть аналоговый ФНЧ- прототип 6-го порядка имеет вид:

Матрица ПФ 6 порядка:

К- параметр определяющий центральную частоту фильтра.
Искомые коэффициенты рекуррентной формулы Ai, Bi определяются из уравнений, где ai, bi — коэффициенты H(S):


Для практической реализации осталось только определить параметр К.
z- преобразование ФНЧ--> ПФ имеет вид:

где

F0 — центральная частота, FN- частота Найквиста, Fs- частота среза ФНЧ — прототипа (полоса фильтра).

IV. Быстрый алгоритм вычисления коэффициентов рекуррентной формулы.

В реальных вычислениях матрица принимает более простой вид из-за симметрии коэффициентов по столбцам. (Количество умножений уменьшается почти в 2 раза).
Рассмотрим алгоритм быстрого расчёта коэффициентов рекуррентной формулы на примере полосового фильтра 6 порядка.Переставим строки (для наглядности).
Вот так рассчитываются коэффициенты по «обычному» алгоритму:

Обнулим элементы матрицы, выделенные желтым цветом:

Получили разряженную матрицу, но «потеряли» значения искомых коэффициентов Аi.
А теперь элементарно восстановим «потерянные» значения Аi:

Аналогично находятся коэффициенты Вi.

V. Практическая реализация.

Программа расчёта коэффициентов полосового фильтра 5 порядка быстрым методом:
#include <math.h>
    double F0,Fs,Pi,Psi,Psi0,Psi2,Psi3,Psi4,Psi5,a0Psi,z1,z2;
    double b_1,b_2,b_3,b_4,b_5,a0,a_1,a_2,a_3,a_4,a_5,Omega_p,O2,O3,O4,O5;
    double A[11], B[11];
    int i;
    void main(void){
    //!F0- относительная центральная частота
    //!A,B - выходные массивы коэффициентов
    Pi=3.1415926535897932;
    F0=0.3;
    Fs=0.2;   //!Частота среза ФНЧ (относительная) или полоса фильтра
    Omega_p=tan(Fs*0.5*Pi);
    O2=Omega_p*Omega_p;
    O3=O2*Omega_p;
    O4=O3*Omega_p;
    O5=O4*Omega_p;
    //!Эллиптический фильтр
    b_1=0.02974*Omega_p;
    b_2=0.;
    b_3=0.16652*O3;
    b_4=0.;
    b_5=0.2042*O5;
    a_1=0.92546*Omega_p;
    a_2=1.81487*O2;
    a_3=1.09691*O3;
    a_4=0.74668*O4;
    a_5=0.20420*O5;
    // Или    Фильтр Чебышева 2 рода    (коэффициенты из статьи)
    //b_1=0.15819*Omega_p;
    //b_2=0.;
    //b_3=0.63277*O3;
    //b_4=0.;
    //b_5=0.50622*O5;
    //a_1=2.64719*Omega_p;
    //a_2=3.49129*O2;
    //a_3=2.91421*O3;
    //a_4=1.51981*O4;
    //a_5=0.50622*O5;

    Psi0=1./cos(Fs*0.5*Pi);
    Psi=-2.*cos(F0*Pi)*Psi0;
    Psi2=Psi*Psi;
    Psi3=Psi2*Psi;
    Psi4=Psi3*Psi;
    Psi5=Psi4*Psi;
    a0=1./(1+a_1+a_2+a_3+a_4+a_5);
    a0Psi=a0*Psi;
    A[0]=1.;
    A[10]=a0*(1-a_1+a_2-a_3+a_4-a_5);
    z1=a0Psi*(5+3* a_2+a_4);
    z2=-2*a0Psi*(2*a_1+ a_3);
    A[1]=z1-z2;
    A[9]=z1+z2;
    z1=a0*(5+Psi2*(10+3*a_2)+a_2-3*a_4);
    z2=a0*(-(3+6*Psi2)*a_1-(Psi2-1)*a_3+5*a_5);
    A[2]=z1-z2;
    A[8]=z1+z2;
    z1=a0Psi*(20+Psi2*(10+ a_2)-4* a_4);
    z2=a0Psi*(-(8+4*Psi2)*a_1+4*a_3);
    A[3]=z1-z2;
    A[7]=z1+z2;
    z1=a0*(10+30*Psi2+5*Psi4-(2+3*Psi2)*a_2+2*a_4);
    z2=a0*(-(2+6*Psi2+Psi4)*a_1+(2+3*Psi2)*a_3-10*a_5);
    A[4]=z1-z2;
    A[6]=z1+z2;
    A[5]=a0Psi*(30+20*Psi2+Psi4-(6+2*Psi2)*a_2+6* a_4);
    B[0]=a0*(b_1+b_2+b_3+b_4+b_5);
    B[10]=a0*(-b_1+b_2-b_3+b_4-b_5);
    z1=a0Psi*(+3* b_2+ b_4);
    z2=a0Psi*(-4*b_1-2*b_3);
    B[1]=z1-z2;
    B[9]=z1+z2;
    z1=a0*(+(1+3*Psi2)*b_2-3*b_4);
    z2=a0*(-(3+6*Psi2)*b_1-(Psi2-1)*b_3+5*b_5);
    B[2]=z1-z2;
    B[8]=z1+z2;
    z1=a0Psi*(Psi2*b_2-4* b_4);
    z2=a0Psi*(-(8+4*Psi2)*b_1+4* b_3);
    B[3]=z1-z2;
    B[7]=z1+z2;
    z1=a0*(2*b_4);
    z2=a0*(-(2+6*Psi2+Psi4)*b_1+(2+3*Psi2)*b_3-10*b_5);
    B[4]=z1-z2;
    B[6]=z1+z2;
    B[5]=a0Psi*(-(6+2*Psi2)*b_2+6* b_4);
    return;             
    } 

Рекуррентная формула для полосового БИХ-фильтра 5-го порядка будет иметь вид:
y[n]=B[0]*x[n]+B[1]*x[n-1]+B[2]*x[n-2]+B[3]*x[n-3]+B[4]*x[n-4]+B[5]*x[n-5]+B[6]*x[n-6]+
B[7]*x[n-7]+B[8]*x[n-8]+B[9]*x[n-9]+B[10]*x[n-10]-
-A[1]*y[n-1]-A[2]*y[n-2]-A[3]*y[n-3]-A[4]*y[n-4]-A[5]*y[n-5]-A[6]*y[n-6]-
-A[7]*y[n-7]-A[8]*y[n-8]-A[9]*y[n-9]-A[10]*y[n-10]
где x[n] — входные выборки, y[n] — выходной (отфильтрованный) сигнал.

Эффективность алгоритма.
Процессор Intel Atom 1.6 ГГц
Фильтр — полосовой фильтр Кауэра 5 порядка.
Рассчитывалось 5 млн. фильтров с одинаковой полосой, менялась только центральная частота.
Время расчёта коэффициентов по обычной методике — 46 секунд.
Время расчёта быстрым методом — 28 секунд.
Можно сравнить с медленным алгоритмом:
http://forum.easyelectronics.ru/viewtopic.php?f=9&t=22252&start=0

Более простая программа:
Вычисление коэффициентов полосового фильтра Баттерворта 3 порядка на ATmega8:

#include <math.h>
float b1,b2,b3,a0,a1,a5,zz,Psi,Psi2,Beta;
float A[7],B[7];
void BP_Filter(float F0){
Psi=cos(F0*PI)*zz;
Psi2=Psi*Psi;
A[1]=Psi*a1;
A[2]=a0*((Psi2+1.)*(3.+b1)-b2-3.*b3);
A[3]=a0*Psi*(Psi2+6.-2*b2);
A[4]=a0*((Psi2+1.)*(3.-b1)-b2+3.*b3);
A[5]=Psi*a5;
return;}

void BP_Filter_Init(float Fs){
float z;
z=Fs*0.5*PI;
Beta=tan(z);
zz=-2./cos(z);
b1=2.*Beta;
b3=Beta*Beta;
b2=2.*b3;
b3=Beta*b3;
a0=1.0/(1.+b1+b2+b3);
A[0]=1.;
a1=a0*(3.+2.*b1+b2);
a5=a0*(3.-2.*b1+b2);
A[6]=a0*(1.-b1+b2-b3);
B[0]=b3*a0;
B[1]=0.;
B[2]=-3.*B[0];
B[3]=0.;
B[4]=-B[2];
B[5]=0.;
B[6]=-B[0]; 
return;
}
void main(void){
float F0,Fs;
int i,N;
N=10;
Fs=0.1;  // полоса фильтра
BP_Filter_Init(Fs);  //
for(i=1;i<N;i++){
F0=0.3+i/20;
BP_Filter(F0);  }
return;             
}

Рекуррентная формула для полосового БИХ-фильтра 3-го порядка будет иметь вид:
y[n]=B[0]*x[n]+B[1]*x[n-1]+B[2]*x[n-2]+B[3]*x[n-3]+B[4]*x[n-4]+B[5]*x[n-5]+B[6]*x[n-6]-
-A[1]*y[n-1]-A[2]*y[n-2]-A[3]*y[n-3]-A[4]*y[n-4]-A[5]*y[n-5]-A[6]*y[n-6]
где x[n] — входные выборки, то y[n] — выходной (отфильтрованный) сигнал.

VI. Приложение.

Матрицы z — преобразования ФНЧ-ФНЧ порядков 1-4:

Свойства матрицы z — преобразования:
Сумма элементов столбцов (кроме крайнего левого (ФВЧ) или правого(ФНЧ)) равна 0.
Сумма элементов нечётных строк = 0.

Матрицы z — преобразования ФНЧ--> ПФ порядков 2-3:


VII. Литература

Голд Б., Рэйдер Ч. «Цифровая обработка сигналов».
Р.Богнер, А.Костантинидис «Введение в цифровую фильтрацию».
Денисов
dsplib.ru
  • +14
  • 02 июня 2015, 18:08
  • Santik

Комментарии (80)

RSS свернуть / развернуть
НАписано много, и вроде по делу, только, следовало бы начать с области применения.
Куда всю эту математику девать?
0
Вычисление коэффициентов фильтра непосредственно в микроконтроллере позволит оперативно менять параметры фильтра, не прибегая к услугам Filter Solution. Появится возможность адаптивные фильтры создавать. Это по применению.
А по математике — да матрицы чудовищно выглядят — но в конце всё сводится к элементарным формулам!
В программе — ни одного цикла!
+1
Это бы да без math.h которая сожрет половину ресурсов МК. Т.е все целочисленно. Хотя на Дсп должно вкатить хорошо.
0
А сами фильтры то где применяются?
0
Цифровые фильтры на сегодняшний день применяются практически везде, где требуется обработка сигналов, в частности в спектральном анализе, обработке изображений, обработке видео, обработке речи и звука и многих других приложениях.

Вон парень вообще выделял одну из составляющих сигнала, чтобы электронный тортик сделать.
+2
это круто! Почитал статью, очень интересно. Спасибо!
0
Весьма монументальный подход — это цепляет) А на сайт его ходил? Он шикарен)
0
Вот пример работы режекторного «следящего» фильтра:
0
Что это было? o_0
0
Матрицефобия? :-)
0
А зачем вычислять коэффициенты фильтра в рантайме на меге8? И как этот код относится к данному мк? Там же вроде ни одного аппаратнозависимого куска кода нету.
0
Да просто хотелось посмотреть как по памяти и быстродействию программа себя ведёт именно на меге8 :-)
0
Я не про то) У тебя по сути получается просто сжатая теория по ЦФ с расчетами на чистом Си. Было бы круче если бы упор был сделан все таки на мк. Т.е. с челочисленными вычислениями и прочими фичами и хаками на Си для повышения эффективности и быстродействия именно под микроконтроллерами.
+2
Я хоть и старенький уже, но надеюсь ещё дожить до того времени, когда микроконтроллеры будут работать на целочисленной арифметике медленнее, чем с плавающей точкой. За примерами далеко ходить не надо… :-)
0
Возможно когда-нибудь и настанет время когда в каждом мк будет по FPU, но как-то это сомнительно)
0
На плавучке не реализовать алгоритмы, требующие транзитивности (например, CIC), нельзя строго предсказать точность. Но бездумный кодинг облегчает, да.
0
Когда речь идет о фильтрах БИХ — целочисленные вычисления могут запороть всю малину, так как в данном случае архиважно иметь как можно более точные константы, иначе накопление ошибки станет критическим и фильтр перестанет работать, а чего еще хуже — возбуждаться. Правда если речь идет о 2-3 порядках, то может еще можно что-то выжать. Но если хочется порядки увеличить — ничего не поделаешь — придется работать с флоатом, а если порядок 10 — то наверное даже и double.
0
А разбить фильтр на секции второго порядка?
0
А большинство целочисленных фильтров, если их не разбивать на секции второго порядка, не будут работать вообще!

Можете сами подсчитать коэффициенты без секционирования :-)
Особенно мне коэффициент а0=4096^7 нравится :-)
0
Мда уж. Статейка, конечно, малопонятная, даже если немного с этим всем знаком. Никаким «для тупых» и не пахнет.

Алсо, вместо замены греческих букв на \alpha или w можно использовать возможности HTML — "& alpha;", "& omega;", etc (пробел, ессна, надо убрать, большие буквы пишутся как Alpha, Omega, etc) — ΑαΩω.
+2
  • avatar
  • Vga
  • 02 июня 2015, 19:46
Может конечно я формулами увлёкся :-) А так — гораздо проще получается, чем в «классическом» подходе, особенно для полосовых фильтров. Берёшь заранее известную матрицу, умножаешь её на столбец из коэффициентов аналогового ФНЧ-прототипа — и коэффициенты для рекуррентной формулы готовы!
За совет отдельное спасибо! Исправил уже :-)
0
Может конечно я формулами увлёкся :-) А так — гораздо проще получается, чем в «классическом» подходе, особенно для полосовых фильтров.
Вот только из текста все это нифига не понятно)
За совет отдельное спасибо! Исправил уже :-)
Частоту еще на ω заменить забыл.
0
LaTeX сайтом не поддерживается?

Тест, прошу сильно не пинать:
\alpha
\beta
$\frac{1}{\sin^{2}(x)}$
0
[tex]\beta[/tex]
[Latex]\beta[/Latex]
И так тоже не работает…
0
На этом предлагаю закончить изыскания в данном направлении.
0
Есть сервис, который в ответ на запрос с формулой возвращает ее отрендеренной. amaora вроде такой сервис использует.
А встроенного тут нифига нету, увы.
0
+1
Всё же лучше заливать картинки в статью, чем давать на них динамические ссылки.
Например, вот этот сервис умер:
web.archive.org/web/20120118065922/http://www.texify.com/
До этого я не могу достучаться, хотя главная страница грузится:
www.mathtran.org/formulas/tex/
На хабре
Обзор on-line сервисов для преобразования формул Latex в картинки,
LaTeX / Интересные публикации.
0
Плюс сервиса в том, что сама формула лежит в исходнике страницы, а линк можно перенаправить на другой сервис. Ну и редактировать удобнее.
Хотя можно и загружать на сервер we — вбивать юрл с формулой в форму загрузки картинки.
0
Я нихуя не понял
«Аналоговый ФНЧ Баттерворта...» — вот откуда берутся эти формулы, и как они работают?
Z-преобразование — вот тут у меня вообще батхерт. Все его применяют, но никто не говорит как оно работает и зачем надо.
Я увы не математик. И, наверное, не один такой. Посты по цифровым фильтрам делятся на две части: расчет без теории, либо теория оторванная от реальности. А не могут ли знающие личности как-то совместить всю эту сраную высшую математику с программированием под МК, так чтоб все по полочкам…
+3
пожелаение очень хорошее, но боюсь, статья получится такой огромной, как курс цифровых фильтров в ВУЗе.
+2
Тут не статью, а серию статей пускать надо, чтоб от передаточной функции RC-цепочки до непосредственно ньюансов реализации цифровых фильтров на мк. Мало кто решится на такое. Хотя я наверное бы смог, если б сам решил пробелы подтянуть: «Хочешь что-то понять, объясни другим».

По поводу ВУЗа:
У нас цифровая обработка сигналов — это была семестровая дисциплина, где какая-то левая тетечка пыталась нам чего-то рассказать. Но у нее не получалось держать дисциплину и внятно рассказывать, поэтому из этого курса я вынес пользы 0 целых 0 десятых. Я даже начал Сергиенко «ЦОС» читать и маталаб осваивать, но дальше четверти книги меня не хватило — появились другие дела, заботы и прочее.
+1
Знакомо. Встречался с подобным обучающим персоналом… Только в моем случае дама предпочитала ставить двойки, если студент объяснял суть вопроса не так, (дословно) как в учебнике.
0
Ну слава богу у нас такого маразма не было ни на одном из предметов. Всегда требовали суть прокрученную через себя. Правда иногда эта суть должна обязательно совпадать с мнением и знаниями преподавателя, но это уже отдельные случаи)
+1
Я с удовольствием отвечу на все вопросы в форуме в разделе «Алгоритмы» (Цифровые рекурсивные фильтры)
В статье дана теория + конкретная реализация на Си под эту теорию.
Или Вы меня уверяете, что этого не может быть, «промежуток» должен быть? (с)
:-)
0
Пост отличный, это я о наболевшем. Просто мои знания вышки никак не стыкуются с практическими задачами, печально.
Обязательно буду спрашивать на форуме, спасибо. Очень актуальная тема.
PS Мои преподы по ЦОС в институте были также далеки от практики, как я от балета.
0
Как рассчитать коэффициенты вижу. Саму реализацию фильтра не вижу. Разжуйте)
0
Вы имеете ввиду рекуррентную формулу?
0
Вставил в текст статьи :-)
0
О люди! Я вижу!)) Спасибо. Прям законченный вид большого труда. Пригодится.
0
Когда интересовался темой цифровых фильтров (с весьма «потребительским» подходом), то наткнулся на замечательный сайт TFilter, позволяющий рассчитывать КИХ онлайн, при этом с возможностью генерации исходного кода и выбором типа арифметики (целочисленная/с плавающей точкой)
+2
Да, сейчас не только для КИХ, но и для БИХ-фильтров такие замечательные сайты есть. Если был нужен один фильтр я бы и не парился. Интерес представляет случай, когда в процессе работы микроконтроллерной программы выясняется, что хорошо бы изменить центральную частоту фильтра, к примеру.
Держать в ПЗУ наборы коэффициентов? Это от задачи зависит. Хорошо если таких наборов 10 (а для полосового фильтра 5 порядка 1 набор — это 22 числа) А если 1000 надо? Замучаешься их из заботливо сгенерированного кода «выковыривать» :-)
По-моему предпочтительнее вычислять коэффициенты прямо в микроконтроллере — тем более, как показывают приведенные в статье программы, это не так уж и сложно.:-)
Я понимаю, что существует масса задач, где перестраивать параметры фильтра не надо. А если надо — я предложил одно из решений.
0
Если ресурсов памяти у нас больше чем процессорного времени, то можно уже и нечто скриптообразное написать для генерации кода под Ctrl+c -> Ctrl+v. Там не важно хоть для 1000 наборов, хоть для 5000.
Если процессорного времени валом, то можно и в рантайме посчитать.
Тут кстати, не совсем очевидно что будет больше места занимать — таблица предварительно расчитанных коэффициентов, либо функция по их расчету.
0
Согласен. Это от задачи зависит конкретной. Но раньше альтернативы таблицам не было. :-)
0
Логично. Но что в этом случае гарантирует характеристики этих 1000 фильтров. Насколько я понял, далеко не всегда свойства фильтра гарантируются. Во всяком случае иногда решение на сайте «не сходилось» — требовалось большее число коэффициентов для достижения того же результата. Хотя, повторюсь, мой подход здесь исключительно потребительский. И данная тема остается для меня магией.
0
Именно для «потребителей» и выложена программа на Си. Пользуйтесь, тестируйте, находите «узкие места», сравнивайте с другими программами… А теорию я выложил — так, на всякий случай, вдруг понадобится :-)
Я вот особой разницы не вижу — на сайт сходить за коэффициентами или получить их из программы. Я вот коэффициенты проверял в симуляторе IAR.
Магия то в чём? В том что генерируется рекуррентная формула на Си? Это, честно говоря, не серьёзно… Каждый, кто хоть один раз связывался с фильтрацией просто обязан с ходу писать формулу фильтра по готовым коэффициентам :-)
0
Рекуррентная формула для ПФ 5-го порядка:
y[n]=B[0]*x[n]+B[1]*x[n-1]+B[2]*x[n-2]+B[3]*x[n-3]+B[4]*x[n-4]+B[5]*x[n-5]+B[6]*x[n-6]+
B[7]*x[n-7]+B[8]*x[n-8]+B[9]*x[n-9]+B[10]*x[n-10]-
-A[1]*y[n-1]-A[2]*y[n-2]-A[3]*y[n-3]-A[4]*y[n-4]-A[5]*y[n-5]-A[6]*y[n-6]-
-A[7]*y[n-7]-A[8]*y[n-8]-A[9]*y[n-9]-A[10]*y[n-10]
где x[n] — входные выборки, y[n] — выходной (отфильтрованный) сигнал.
И она не меняется при изменении параметров фильтра! Изменяются только коэффициенты А[i], B[i]. А параметры фильтра — центральную частоту я могу с любым шагом менять, хоть 0.001 Гц. Таблицы в этом случае явно не рулят :-)
0
Интересно всё это конечно, но я так ничего и не понял. Неплохо бы написать пару тройку уроков-статей «step-by-step» на эту тему(что есть аналоговая фильтрация, что есть цифровая фильтрация и как это поможет домохозяйкам, типа как испечь пирог используя ФНЧ Баттерворта и z-преобразования). Ну вы понели :)
-1
Мысль конечно хорошая. Сначала запугать неподготовленного читателя оху огромными матрицами, а потом написать в догонку пару-тройку статеек по-проще...:-)
Нет! Статья планируется ещё только одна, посвящённая методике вычисления матриц z- преобразования.
0
Да, ещё чуть не забыл преобразование ФНЧ --> режекторный фильтр.
Ну ещё может быть программу выложу для РФ/ПФ 8-го порядка.
Может ещё у кого какие пожелания будут?
0
Юкио Сато поможет домохозяйкам.
Курс "Теория и практика ЦОС".
И книги.
+2
Если кто-то пред историей появления матричного подхода заинтересуется, то
Сюда...
Начинал с поиска «красивых» целочисленных коэффициентов, но понял, чтобы их найти, надо сначала научиться быстро их рассчитывать :-)
0
Пытался я Сато читать, даже в бумаге есть. Начало хорошее, но дошел до 50 страницы — начались интегралы, ряды, пределы и другая математика. Либо я тугодум, либо всё-таки ЦОС понять не каждому дано, особенно тем, кто закончил вуз 100500 лет назад.
0
Ну как бы «любишь ЦОСить, люби и матан понимать») Ну а по сути, если это не нужно в проф. деятельности либо нет особого интереса, то существует 100500 разных калькуляторов с помощью которых можно решить практически все насущные задачи — там матан не нужен, знай только значения в поля вбивай. Правда надо знать, что это за поля и зачем они нужны, но это уже другой разговор =)
+1
Так ото ж — без матана сложно. Попробовал я сначала халяву калькуляторы и программки. Ничего толкового не получилось, ибо верно замечено «надо знать, что это за поля и зачем они нужны». Вот и решил немного вникнуть в ЦОС, даже литературу приобрёл. Но не тут то было — «немного» и наскоком не получится.
0
Ну такие вещи предполагают, что имеется некоторый комплекс знаний по смежным дисциплинам, на которые будет наслаиваться новый материал. Поэтому да, с наскока такое не возьмешь) Ну никто ж не запрещает повторить матан, или хотя бы только те вещи что упоминаются по ходу чтения.
+1
Ну в принципе верно. Для работы с фильтрами надо знать кусочек матана, кусочек линейной алгебры и кусочек ТФКП (теории функций комплексной переменной)… :-)
0
А ссылочки нет, где эти книги скачать можно в pdf? А то таких картинок и И-нете полно, а скачать то где?
0
Ну что же вы. Первые ведь ссылки в гугле.
Сато, Лайонс
0
Сато в лучшем качестве dl.dropboxusercontent.com/u/54652586/Sato.djvu
0
Вот спасибо! Порадовал старика!
С ходу открыл 49 страницу — ни ху чего не понимаю! Как вы по этим книгам пытаетесь учиться???
0
Да с 3-го прочтения нормально доходит :) Формулы то понять несложно. А в их суть и связь с сигналом — тут проблемно.
0
Ну ты, типа, крут!:-) Завтра ещё 2 раза прочитаю.
Не пойму — с тебя пузырь! :-) :-) :-)
0
В pdf как-то попадалась Сато, но она весила около 50М. Лайонс есть в djvu.
0
Да мне ссылка на сайт нужна, который бы не требовал номер телефона, не предлагал в обязательном порядке свой загрузчик установить и т.д.
Я в последнее время только Радиосканером пользуюсь…
0
Сато в pdf www.twirpx.com/file/153124/, 30М. Так же нашел у себя — 74М, если нужно — закину на dropbox.
0
Спасибо, скачал уже — см. выше!
0
Фу, сканы в pdf. Нахрена? DjVu для сканов куда лучше. PDF хорошо, когда в нем нормальный текст.
0
Я за такими книгами обычно на Library Genesis наведываюсь.
0
Неее… Кто 100500 лет назад ВУЗ закончил при словах «интегралы, ряды, пределы, матрицы и другая математика» в лёгкий транс не впадают… Это привилегия молодёжи :-)
+1
Ну, тут транс не от самих рядов и матриц, а скорее от того, как это всё связать с сигналом и его фильтрацией. То есть, я могу перемножить матрицы и работать с ними, но понять волшебство, как матрицы заставляют сигнал фильтроваться сложно. Как то так.
0
Ну тогда ещё не всё потеряно! Я вот лично забыл уже давно, как матрицы перемножаются. :-) Помню только, как матрицу на столбец умножить. Этим и пользуюсь :-)
Мне кажется тебе нужен только «маленький пинок» (в смысле понимания общей картины), а дальше всё легко пойдёт. Я сам через это проходил. Так что ты не первый в этой ситуации!
0
Матрицы это лишь удобный способ решения систем уравнений, насколько я понимаю. Весь цимес в передаточной функции кроется, а также в умении хорошо ориентироваться как в частотной, так и во временной областях, ну и во взаимных переходах из одной в другую соответсвенно тоже.
А как там фукнкция получается, причем там нули и полюса, что курили Чебышевы, Золотаревы и прочие Баттерворты, когда придумывали фильтры вроде всегда разжевывается от самых низов. И как происходит переход к цифровым фильтрам вроде тоже. Не без матана конечно, но тем не менее.
0
А я ещё Тони Константинидиса знаю…
0
Фильтра Константинидиса конечно не существует, но он один из разработчиков идеи как из ФНЧ получить ФВЧ, ПФ и РФ.:-)
0
Да этих мозговитых мужиков много было)
0
А почему было? Тони Константинидис до сих пор жив-здоров. Только сегодня от него письмо получил — типа «Правильной дорогой идёте, товарищи!» (это по поводу метода быстрого расчёта коэффициентов)
0
Зато Чебышев свой фильтр разработал еще до того, как фильтры вообще появились :)
0
Фильтры появились задолго до рождения Чебышева. Пример — сито. Не Юкио Сато, а просто — сито или ФМЧ (фильтр маленьких частиц). :-)
0
Я так и не получил ответа на вопрос: «А что бы Вы, лично, хотели увидеть в статье „Цифровые рекурсивные фильтры. Часть 2.“?
Статья готова практически, но расставить „акценты“ (по просьбам читателей)- было бы идеальной ситуацией!
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.