функция, которая находит частоту среза для фильтра нижних частот (в Matlab)

Я хочу найти частоту среза для многих фильтров нижних частот. Поэтому мне нужна функция, которая может сделать это для меня. Я могу построить график Боде и найти частоту для -3 дБ, но это скучно и требует много времени. Кто-нибудь знает, как я могу автоматизировать эту процедуру? я пытался с

[mag,phase] = bode(sys) 

но не удалось. Как мне это сделать?

У меня есть коэффициенты фильтра a,b. Я пытаюсь использовать другую технику, когда дискретизирую функцию преобразования, поэтому мне нужна частота среза эмпирически из EKV:

y_k = b(1)*x_k + b(2)*x_{k-1} – a(2)*y_{k-1}

person user1564762    schedule 24.08.2012    source источник
comment
Какая форма фильтров доступна? Функция передачи? Коэффициенты фильтра?   -  person Deve    schedule 24.08.2012
comment
Если у вас есть информация о типе конструкции фильтра, вам, вероятно, будет лучше найти точку -3 дБ аналитически, а не искать ее эмпирически. Пожалуйста, дайте больше информации или какой-нибудь пример кода.   -  person learnvst    schedule 24.08.2012


Ответы (3)


Вы можете использовать команду bandwidth для объектов LTI (передаточные функции, так далее.):

G = tf(1, [1 1])
bandwidth(G)

ans =

    0.9976
person Kavka    schedule 24.08.2012
comment
Могу ли я сделать так, чтобы bandwith(G) легко работал с HP,BP,BS-фильтром (как это происходит с LP-фильтром)? - person user1564762; 27.08.2012
comment
Не напрямую, так как в описании сказано ... усиление падает ниже 70,79 процента (-3 дБ) от его значения постоянного тока. Например, значение DC фильтра HP равно 0, поэтому эта команда не будет работать. Однако для фильтра HP 1-HP — это фильтр LP, для которого эта команда будет работать. - person Kavka; 28.08.2012

Если у вас нет панели инструментов системы управления, вы можете сделать это следующим образом:

% some filter
[b, a] = butter(5, 0.6);

% Determine frequency response
[h, w] = freqz(b, a, 2048);

% linear approximation of 3 dB cutoff frequency
ind = find(abs(h) < sqrt(1/2), 1, 'first');
slope = (abs(h(ind)) - abs(h(ind - 1))) / (w(ind) - w(ind - 1));
w_3dB = ( sqrt(1/2) - abs(h(ind - 1)) + slope * w(ind - 1) ) / slope;

% check result
figure; plot(w,abs(h))
hold on;
plot(w_3dB, sqrt(1/2), 'rx');

Кроме того, вам понадобится DSP Toolbox для freqz().

person Deve    schedule 24.08.2012

В Matlab есть функция, которая может дать вам частоту среза, и она называется «freqz».

Если вы уже знаете коэффициенты фильтра «a» и «b». Затем freqz предоставляет два переменных выхода. Одна переменная хранит усиление комплексной амплитуды, а другая переменная хранит нормализованные частоты. По сути, все, что вам нужно сделать, это запустить цикл, который находит усиление, наиболее близкое к усилению вашей полосы пропускания минус 3 дБ. Затем прочтите соответствующий индекс для вашей частотной переменной, и вы получите ответ.

person Kevin Zywicki    schedule 28.11.2015