Функция, которая находит частоту среза для фильтра нижних частот (в 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}
3 ответа
Вы можете использовать команду bandwidth для объектов LTI (функции передачи и т. Д.):
G = tf(1, [1 1])
bandwidth(G)
ans =
0.9976
Если у вас нет панели инструментов системы управления, вы можете сделать это так:
% 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()
,
В Matlab есть функция, которая может дать вам частоту среза, и она называется 'freqz'.
Если вы уже знаете свои коэффициенты фильтра "а" и "б". Затем freqz предоставляет два переменных вывода. Одна переменная хранит комплексное усиление величины, а другая переменная хранит нормализованные частоты. По сути, все, что вам нужно сделать, это запустить цикл, который находит усиление, наиболее близкое к вашему усилению в полосе пропускания, минус 3 дБ. Затем прочитайте соответствующий индекс для вашей частотной переменной, и вы получите ответ.