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

«По совету друзей» (с) я решил остановиться на нейтральном названии (простенько, но со вкусом (с)): «Цифровые рекурсивные фильтры», или, как их ещё называют в простонародье, «БИХ-фильтры» или фильтры с Бесконечной Импульсной Характеристикой, что эквивалентно буржуйскому 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
НАписано много, и вроде по делу, только, следовало бы начать с области применения.
Куда всю эту математику девать?
Куда всю эту математику девать?
Вычисление коэффициентов фильтра непосредственно в микроконтроллере позволит оперативно менять параметры фильтра, не прибегая к услугам Filter Solution. Появится возможность адаптивные фильтры создавать. Это по применению.
А по математике — да матрицы чудовищно выглядят — но в конце всё сводится к элементарным формулам!
В программе — ни одного цикла!
А по математике — да матрицы чудовищно выглядят — но в конце всё сводится к элементарным формулам!
В программе — ни одного цикла!
Цифровые фильтры на сегодняшний день применяются практически везде, где требуется обработка сигналов, в частности в спектральном анализе, обработке изображений, обработке видео, обработке речи и звука и многих других приложениях.
Вон парень вообще выделял одну из составляющих сигнала, чтобы электронный тортик сделать.
А зачем вычислять коэффициенты фильтра в рантайме на меге8? И как этот код относится к данному мк? Там же вроде ни одного аппаратнозависимого куска кода нету.
Да просто хотелось посмотреть как по памяти и быстродействию программа себя ведёт именно на меге8 :-)
Я не про то) У тебя по сути получается просто сжатая теория по ЦФ с расчетами на чистом Си. Было бы круче если бы упор был сделан все таки на мк. Т.е. с челочисленными вычислениями и прочими фичами и хаками на Си для повышения эффективности и быстродействия именно под микроконтроллерами.
Я хоть и старенький уже, но надеюсь ещё дожить до того времени, когда микроконтроллеры будут работать на целочисленной арифметике медленнее, чем с плавающей точкой. За примерами далеко ходить не надо… :-)
Когда речь идет о фильтрах БИХ — целочисленные вычисления могут запороть всю малину, так как в данном случае архиважно иметь как можно более точные константы, иначе накопление ошибки станет критическим и фильтр перестанет работать, а чего еще хуже — возбуждаться. Правда если речь идет о 2-3 порядках, то может еще можно что-то выжать. Но если хочется порядки увеличить — ничего не поделаешь — придется работать с флоатом, а если порядок 10 — то наверное даже и double.
Мда уж. Статейка, конечно, малопонятная, даже если немного с этим всем знаком. Никаким «для тупых» и не пахнет.
Алсо, вместо замены греческих букв на \alpha или w можно использовать возможности HTML — "& alpha;", "& omega;", etc (пробел, ессна, надо убрать, большие буквы пишутся как Alpha, Omega, etc) — ΑαΩω.
Алсо, вместо замены греческих букв на \alpha или w можно использовать возможности HTML — "& alpha;", "& omega;", etc (пробел, ессна, надо убрать, большие буквы пишутся как Alpha, Omega, etc) — ΑαΩω.
Может конечно я формулами увлёкся :-) А так — гораздо проще получается, чем в «классическом» подходе, особенно для полосовых фильтров. Берёшь заранее известную матрицу, умножаешь её на столбец из коэффициентов аналогового ФНЧ-прототипа — и коэффициенты для рекуррентной формулы готовы!
За совет отдельное спасибо! Исправил уже :-)
За совет отдельное спасибо! Исправил уже :-)
Есть сервис, который в ответ на запрос с формулой возвращает ее отрендеренной. amaora вроде такой сервис использует.
А встроенного тут нифига нету, увы.
А встроенного тут нифига нету, увы.
Всё же лучше заливать картинки в статью, чем давать на них динамические ссылки.
Например, вот этот сервис умер:
web.archive.org/web/20120118065922/http://www.texify.com/
До этого я не могу достучаться, хотя главная страница грузится:
www.mathtran.org/formulas/tex/
На хабре
Обзор on-line сервисов для преобразования формул Latex в картинки,
LaTeX / Интересные публикации.
Например, вот этот сервис умер:
web.archive.org/web/20120118065922/http://www.texify.com/
До этого я не могу достучаться, хотя главная страница грузится:
www.mathtran.org/formulas/tex/
На хабре
Обзор on-line сервисов для преобразования формул Latex в картинки,
LaTeX / Интересные публикации.
«Аналоговый ФНЧ Баттерворта...» — вот откуда берутся эти формулы, и как они работают?
Z-преобразование — вот тут у меня вообще батхерт. Все его применяют, но никто не говорит как оно работает и зачем надо.
Я увы не математик. И, наверное, не один такой. Посты по цифровым фильтрам делятся на две части: расчет без теории, либо теория оторванная от реальности. А не могут ли знающие личности как-то совместить всю эту
пожелаение очень хорошее, но боюсь, статья получится такой огромной, как курс цифровых фильтров в ВУЗе.
Тут не статью, а серию статей пускать надо, чтоб от передаточной функции RC-цепочки до непосредственно ньюансов реализации цифровых фильтров на мк. Мало кто решится на такое. Хотя я наверное бы смог, если б сам решил пробелы подтянуть: «Хочешь что-то понять, объясни другим».
По поводу ВУЗа:
У нас цифровая обработка сигналов — это была семестровая дисциплина, где какая-то левая тетечка пыталась нам чего-то рассказать. Но у нее не получалось держать дисциплину и внятно рассказывать, поэтому из этого курса я вынес пользы 0 целых 0 десятых. Я даже начал Сергиенко «ЦОС» читать и маталаб осваивать, но дальше четверти книги меня не хватило — появились другие дела, заботы и прочее.
По поводу ВУЗа:
У нас цифровая обработка сигналов — это была семестровая дисциплина, где какая-то левая тетечка пыталась нам чего-то рассказать. Но у нее не получалось держать дисциплину и внятно рассказывать, поэтому из этого курса я вынес пользы 0 целых 0 десятых. Я даже начал Сергиенко «ЦОС» читать и маталаб осваивать, но дальше четверти книги меня не хватило — появились другие дела, заботы и прочее.
Я с удовольствием отвечу на все вопросы в форуме в разделе «Алгоритмы» (Цифровые рекурсивные фильтры)
В статье дана теория + конкретная реализация на Си под эту теорию.
Или Вы меня уверяете, что этого не может быть, «промежуток» должен быть? (с)
:-)
В статье дана теория + конкретная реализация на Си под эту теорию.
Или Вы меня уверяете, что этого не может быть, «промежуток» должен быть? (с)
:-)
Когда интересовался темой цифровых фильтров (с весьма «потребительским» подходом), то наткнулся на замечательный сайт TFilter, позволяющий рассчитывать КИХ онлайн, при этом с возможностью генерации исходного кода и выбором типа арифметики (целочисленная/с плавающей точкой)
Да, сейчас не только для КИХ, но и для БИХ-фильтров такие замечательные сайты есть. Если был нужен один фильтр я бы и не парился. Интерес представляет случай, когда в процессе работы микроконтроллерной программы выясняется, что хорошо бы изменить центральную частоту фильтра, к примеру.
Держать в ПЗУ наборы коэффициентов? Это от задачи зависит. Хорошо если таких наборов 10 (а для полосового фильтра 5 порядка 1 набор — это 22 числа) А если 1000 надо? Замучаешься их из заботливо сгенерированного кода «выковыривать» :-)
По-моему предпочтительнее вычислять коэффициенты прямо в микроконтроллере — тем более, как показывают приведенные в статье программы, это не так уж и сложно.:-)
Я понимаю, что существует масса задач, где перестраивать параметры фильтра не надо. А если надо — я предложил одно из решений.
Держать в ПЗУ наборы коэффициентов? Это от задачи зависит. Хорошо если таких наборов 10 (а для полосового фильтра 5 порядка 1 набор — это 22 числа) А если 1000 надо? Замучаешься их из заботливо сгенерированного кода «выковыривать» :-)
По-моему предпочтительнее вычислять коэффициенты прямо в микроконтроллере — тем более, как показывают приведенные в статье программы, это не так уж и сложно.:-)
Я понимаю, что существует масса задач, где перестраивать параметры фильтра не надо. А если надо — я предложил одно из решений.
Если ресурсов памяти у нас больше чем процессорного времени, то можно уже и нечто скриптообразное написать для генерации кода под Ctrl+c -> Ctrl+v. Там не важно хоть для 1000 наборов, хоть для 5000.
Если процессорного времени валом, то можно и в рантайме посчитать.
Тут кстати, не совсем очевидно что будет больше места занимать — таблица предварительно расчитанных коэффициентов, либо функция по их расчету.
Если процессорного времени валом, то можно и в рантайме посчитать.
Тут кстати, не совсем очевидно что будет больше места занимать — таблица предварительно расчитанных коэффициентов, либо функция по их расчету.
Логично. Но что в этом случае гарантирует характеристики этих 1000 фильтров. Насколько я понял, далеко не всегда свойства фильтра гарантируются. Во всяком случае иногда решение на сайте «не сходилось» — требовалось большее число коэффициентов для достижения того же результата. Хотя, повторюсь, мой подход здесь исключительно потребительский. И данная тема остается для меня магией.
Именно для «потребителей» и выложена программа на Си. Пользуйтесь, тестируйте, находите «узкие места», сравнивайте с другими программами… А теорию я выложил — так, на всякий случай, вдруг понадобится :-)
Я вот особой разницы не вижу — на сайт сходить за коэффициентами или получить их из программы. Я вот коэффициенты проверял в симуляторе IAR.
Магия то в чём? В том что генерируется рекуррентная формула на Си? Это, честно говоря, не серьёзно… Каждый, кто хоть один раз связывался с фильтрацией просто обязан с ходу писать формулу фильтра по готовым коэффициентам :-)
Я вот особой разницы не вижу — на сайт сходить за коэффициентами или получить их из программы. Я вот коэффициенты проверял в симуляторе IAR.
Магия то в чём? В том что генерируется рекуррентная формула на Си? Это, честно говоря, не серьёзно… Каждый, кто хоть один раз связывался с фильтрацией просто обязан с ходу писать формулу фильтра по готовым коэффициентам :-)
Рекуррентная формула для ПФ 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 Гц. Таблицы в этом случае явно не рулят :-)
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 Гц. Таблицы в этом случае явно не рулят :-)
Интересно всё это конечно, но я так ничего и не понял. Неплохо бы написать пару тройку уроков-статей «step-by-step» на эту тему(что есть аналоговая фильтрация, что есть цифровая фильтрация и как это поможет домохозяйкам, типа как испечь пирог используя ФНЧ Баттерворта и z-преобразования). Ну вы понели :)
Пытался я Сато читать, даже в бумаге есть. Начало хорошее, но дошел до 50 страницы — начались интегралы, ряды, пределы и другая математика. Либо я тугодум, либо всё-таки ЦОС понять не каждому дано, особенно тем, кто закончил вуз 100500 лет назад.
Ну как бы «любишь ЦОСить, люби и матан понимать») Ну а по сути, если это не нужно в проф. деятельности либо нет особого интереса, то существует 100500 разных калькуляторов с помощью которых можно решить практически все насущные задачи — там матан не нужен, знай только значения в поля вбивай. Правда надо знать, что это за поля и зачем они нужны, но это уже другой разговор =)
Так ото ж — без матана сложно. Попробовал я сначала халяву калькуляторы и программки. Ничего толкового не получилось, ибо верно замечено «надо знать, что это за поля и зачем они нужны». Вот и решил немного вникнуть в ЦОС, даже литературу приобрёл. Но не тут то было — «немного» и наскоком не получится.

А ссылочки нет, где эти книги скачать можно в pdf? А то таких картинок и И-нете полно, а скачать то где?
Сато в pdf www.twirpx.com/file/153124/, 30М. Так же нашел у себя — 74М, если нужно — закину на dropbox.
Неее… Кто 100500 лет назад ВУЗ закончил при словах «интегралы, ряды, пределы, матрицы и другая математика» в лёгкий транс не впадают… Это привилегия молодёжи :-)
Ну, тут транс не от самих рядов и матриц, а скорее от того, как это всё связать с сигналом и его фильтрацией. То есть, я могу перемножить матрицы и работать с ними, но понять волшебство, как матрицы заставляют сигнал фильтроваться сложно. Как то так.
Ну тогда ещё не всё потеряно! Я вот лично забыл уже давно, как матрицы перемножаются. :-) Помню только, как матрицу на столбец умножить. Этим и пользуюсь :-)
Мне кажется тебе нужен только «маленький пинок» (в смысле понимания общей картины), а дальше всё легко пойдёт. Я сам через это проходил. Так что ты не первый в этой ситуации!
Мне кажется тебе нужен только «маленький пинок» (в смысле понимания общей картины), а дальше всё легко пойдёт. Я сам через это проходил. Так что ты не первый в этой ситуации!
Матрицы это лишь удобный способ решения систем уравнений, насколько я понимаю. Весь цимес в передаточной функции кроется, а также в умении хорошо ориентироваться как в частотной, так и во временной областях, ну и во взаимных переходах из одной в другую соответсвенно тоже.
А как там фукнкция получается, причем там нули и полюса, что курили Чебышевы, Золотаревы и прочие Баттерворты, когда придумывали фильтры вроде всегда разжевывается от самых низов. И как происходит переход к цифровым фильтрам вроде тоже. Не без матана конечно, но тем не менее.
А как там фукнкция получается, причем там нули и полюса, что курили Чебышевы, Золотаревы и прочие Баттерворты, когда придумывали фильтры вроде всегда разжевывается от самых низов. И как происходит переход к цифровым фильтрам вроде тоже. Не без матана конечно, но тем не менее.
Комментарии (80)
RSS свернуть / развернуть