Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Децимирующий КИХ фильтр
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
ilynxy
Доброго всем.

Уважаемые! Поясните пожалуйста, почему после децимирующего FIR "классический" анализ ответа фильтра на ступеньку (единичная функция) выдаёт неправильные результаты. А анализ ответа на ГКЧ (или просто на набор синусоид) -- правильные.

Вот код MATLAB, где я моделирую подобное измерение:
Код
% классическая ступенька
x = [zeros(1, 1024*m) ones(1, 1024*m)];

% Фильтр на ~1/4 исходной полосы, с подавлением 100 dB
Fp  = 0.20;
Fst = 0.25;
Ap  = 0.0001;
Ast = 100;

hf = design(fdesign.lowpass('Fp,Fst,Ap,Ast', Fp, Fst, Ap, Ast));

% Фильтруем сигнал
y = filter(hf, x);

% Децимируем в 4 раза (имеем право, теорема Котла не нарушена, отрезали
% всё что выше с помощью FIR фильтра)
k = 4;
y_decim = downsample(y, k);

% классика жанра: FFT от дифференциала ответа на ступеньку
PRy = 20*log10(abs(fft(diff(y))));
% и для децимированного сигнала
PRy_decim = 20*log10(abs(fft(diff(y_decim))));

% Рисуем спектр
Fx = [0:length(PRy)-1] / length(PRy) * 2;
Fx_decim = [0:length(PRy_decim)-1] / length(PRy_decim) / k * 2;
plot(Fx, PRy, Fx_decim, PRy_decim);


И получается, что после децимации дифференциал ответа на ступеньку даёт завал АЧХ в конце где-то на 3 dB. Если поэкспериментировать с децимацией (например, сделать в два раза), то завал уменьшится.


Собственно вопрос: почему так происходит?
И попутный вопрос: как исследовать характеристики фильтра "в живой природе"? Получается, что если фильтр децимирующий, то исследовать его характеристики методом подачи "единичной функции" нельзя? В более общем случае: если я не знаю характеристики системы и мне нужно построить её АЧХ, то я не имею права исследовать воздействуя на неё единичной функцией и получая спектр дифференциала ответа?
des00
1. Кто вас научил исследовать фильтры с помощью функции Хевисайда вместо дельта-функции?
2. Как модератор предлагаю вам самостоятельно убрать нарушения правила форума 2.1в, до того как этим займется модератор раздела.
thermit
нет здесь никакой функции хевисайда. есть дискретная ед ступень. ее дифф даст дискретную дельта-функцию. другое дело, что дифф надо применять к сигналу до децимации или тупо подать на вход фильтра дискретную дельта-функцию.
des00
Цитата(thermit @ Oct 18 2014, 18:00) *
нет здесь никакой функции хевисайда. есть дискретная ед ступень. ее дифф даст дискретную дельта-функцию. другое дело, что дифф надо применять к сигналу до децимации или тупо подать на вход фильтра дискретную дельта-функцию.

вы гуру, вам виднее. но на мой взгляд
Код
% классическая ступенька
x = [zeros(1, 1024*m) ones(1, 1024*m)];

а дискретная функция хевисайда определена на двух интервалах < 0 и >= 0 http://dic.academic.ru/dic.nsf/ruwiki/913201
Конечно могу ошибаться.
ilynxy
Цитата(des00 @ Oct 18 2014, 14:29) *
1. Кто вас научил исследовать фильтры с помощью функции Хевисайда вместо дельта-функции?
Возможно я что-то плохо понимаю. Вот как я это представляю:
а) у меня есть чёрный ящик с передаточной функцией y = H(x);
б) мне необходимо получить АЧХ и ФЧХ этого чёрного ящика;
в) в идеальном моделировании на вход подаётся дельта-функция и по ответу делаются выводы
в1) в неидеальном мире дельта-функцию имитировать сложно, более того, я знаю, что чёрный ящик содержит АЦП и КИХ-фильтр, поэтому я принимаю решение подать на вход функцию Хэвисайда. Исходя из того что дельта-функция d(x) есть производная от функции Хевисайда Hevi'(x), я делаю предположение что, y = H(d(x)) = H'(Hevi(x)). Иными словами, ответ передаточной функции на дельта импульс равен дифференциалу ответа передаточной функции на функцию Хэвисайда. Очевидно, что это неверно в общем случае. Однако во множестве источников предлагается такой метод, наряду с использованием генератора качающейся частоты (теста синусоидами на разных частотах).

Характер полученной АЧХ я могу объяснить и понимаю, почему он получается "заваленым". После децимации дифференциал от функции Хевисайда получается усреднённым по степени децимации (то есть усреднение по двум отсчётам в случае децимации в два раза или по четырём в случае децимации в четыре раза). И выходная характеристика получается произведением АЧХ КИХ фильтра и АЧХ "усреднятеля по двум/четырем/n-отсчётам" (это sinc функция). Собственно завал на графике и есть спад sinc функции.

Отсюда возникает вопрос: а как всё-таки правильно исследовать АЧХ/ФЧХ чёрного ящика имея генератор сигналов и осциллограф/рекордер? Если исследовать дельта-функцией, то какой длительности она должна быть? Если исследовать функцией Хэвисайда, то по очевидным причинам дифференциал ответа на функцию Хэвисайда в общем случае не равен ответу на дельта-функцию. Если исследовать с помощью ГКЧ упираемся в неидеальность генератора (всё-таки сгенерировать ступеньку с условно бесконечным спектром несколько проще чем синусоиды на разных частотах).


Цитата(des00 @ Oct 18 2014, 14:29) *
2. Как модератор предлагаю вам самостоятельно убрать нарушения правила форума 2.1в, до того как этим займется модератор раздела.
Если честно, я не понял, что именно нарушено? Грамматика, содержание?
andyp
Цитата(ilynxy @ Oct 18 2014, 16:28) *
Возможно я что-то плохо понимаю. Вот как я это представляю:
а) у меня есть чёрный ящик с передаточной функцией y = H(x);
б) мне необходимо получить АЧХ и ФЧХ этого чёрного ящика;
в) в идеальном моделировании на вход подаётся дельта-функция и по ответу делаются выводы
в1) в неидеальном мире дельта-функцию имитировать сложно, более того, я знаю, что чёрный ящик содержит АЦП и КИХ-фильтр, поэтому я принимаю решение подать на вход функцию Хэвисайда. Исходя из того что дельта-функция d(x) есть производная от функции Хевисайда Hevi'(x), я делаю предположение что, y = H(d(x)) = H'(Hevi(x)). Иными словами, ответ передаточной функции на дельта импульс равен дифференциалу ответа передаточной функции на функцию Хэвисайда. Очевидно, что это неверно в общем случае. Однако во множестве источников предлагается такой метод, наряду с использованием генератора качающейся частоты (теста синусоидами на разных частотах).

Характер полученной АЧХ я могу объяснить и понимаю, почему он получается "заваленым". После децимации дифференциал от функции Хевисайда получается усреднённым по степени децимации (то есть усреднение по двум отсчётам в случае децимации в два раза или по четырём в случае децимации в четыре раза). И выходная характеристика получается произведением АЧХ КИХ фильтра и АЧХ "усреднятеля по двум/четырем/n-отсчётам" (это sinc функция). Собственно завал на графике и есть спад sinc функции.

Отсюда возникает вопрос: а как всё-таки правильно исследовать АЧХ/ФЧХ чёрного ящика имея генератор сигналов и осциллограф/рекордер? Если исследовать дельта-функцией, то какой длительности она должна быть? Если исследовать функцией Хэвисайда, то по очевидным причинам дифференциал ответа на функцию Хэвисайда в общем случае не равен ответу на дельта-функцию. Если исследовать с помощью ГКЧ упираемся в неидеальность генератора (всё-таки сгенерировать ступеньку с условно бесконечным спектром несколько проще чем синусоиды на разных частотах).


Во-первых внутри downsample тоже используется ФНЧ (скорее всего c ИХ вида sinc, умноженный на окно), полоса которого уже чем 0.25 Fs. Отсюда завал на 6 dB. Во-вторых дециматор не является LTI системой (linear time invariant, не знаю как по-русски). В спектре выходного сигнала после него появляются составляющие, которых до него там не было. Зачем тогда говорить про АЧХ-ФЧХ...
ViKo
Undefined function or variable 'm'.
MATLAB R2012a
thermit
Цитата(des00 @ Oct 18 2014, 16:20) *
вы гуру, вам виднее. но на мой взгляд
Код
% классическая ступенька
x = [zeros(1, 1024*m) ones(1, 1024*m)];

а дискретная функция хевисайда определена на двух интервалах < 0 и >= 0 http://dic.academic.ru/dic.nsf/ruwiki/913201
Конечно могу ошибаться.


можете. и ошибаетесь.

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

V_G
Цитата(ViKo @ Oct 19 2014, 00:25) *
Undefined function or variable 'm'.
MATLAB R2012a

перед тем, как вставить код в Матлаб, положите m=1.
Это всего лишь определяет число точек в обрабатываемых массивах, т.е. степень подробности АЧХ
ilynxy
Цитата(andyp @ Oct 18 2014, 17:15) *
Во-первых внутри downsample тоже используется ФНЧ (скорее всего c ИХ вида sinc, умноженный на окно), полоса которого уже чем 0.25 Fs. Отсюда завал на 6 dB. Во-вторых дециматор не является LTI системой (linear time invariant, не знаю как по-русски). В спектре выходного сигнала после него появляются составляющие, которых до него там не было. Зачем тогда говорить про АЧХ-ФЧХ...
Спасибо за наводку про LTI. Действительно дециматор не является LTI поэтому применять дифференциацию функции Хэвисайда неправомерно, сначала нужно привести в тот же временной домен (interpolate), что приведет (в идеале) к недецимированному сигналу. Значит остается только один способ - ГКЧ. Спасибо всем, в голове всё уложилось.
ViKo
Цитата(des00 @ Oct 18 2014, 13:29) *
Кто вас научил исследовать фильтры с помощью функции Хевисайда вместо дельта-функции?

https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%...%86%D0%B8%D1%8F
ViKo
Если нарисовать разность между y_decim и у, прореженным вручную (индексом), то можно увидеть, что она не нулевая. Похоже, downsample еще и фильтрует.
thermit
Цитата(ViKo @ Oct 18 2014, 22:40) *
Если нарисовать разность между y_decim и у, прореженным вручную (индексом), то можно увидеть, что она не нулевая. Похоже, downsample еще и фильтрует.


не надо телепатии и прочей кофейной гущи.
для того, что бы убедиться в отсутствии фильтрации достаточно посмотреть в исходники.
updownsample - добавление нулей/выкидывание отсчетов.
ViKo
Цитата(thermit @ Oct 18 2014, 22:31) *
не надо телепатии и прочей кофейной гущи.
для того, что бы убедиться в отсутствии фильтрации достаточно посмотреть в исходники.
updownsample - добавление нулей/выкидывание отсчетов.

Код
figure;
for N = 1:2047/k
  Err(N) = y(N*k) - y_decim(N);
end
hold on;
plot(y_decim);
plot(Err,'r');
hold off;

Где посмотреть исходник?
thermit
Цитата(ViKo @ Oct 19 2014, 00:31) *
Код
figure;
for N = 1:2047/k
  Err(N) = y(N*k) - y_decim(N);
end
hold on;
plot(y_decim);
plot(Err,'r');
hold off;

Где посмотреть исходник?


прикольная картинка. метод тоже подкупает своей нетривиальностью.
исходники в файле updownsample.m
ilynxy
http://electronix.ru/forum/index.php?showtopic=61830
А вот товарищи давно уже сделали правильный вывод. Но сразу эту ветку я не нашёл.

Просто для меня несколько контринтуитивно, что децимация является нелинейной операцией. Ну подумаешь повыкидывали отсчеты, делов то )
andyp
Цитата(ilynxy @ Oct 19 2014, 02:10) *
http://electronix.ru/forum/index.php?showtopic=61830
А вот товарищи давно уже сделали правильный вывод. Но сразу эту ветку я не нашёл.

Просто для меня несколько контринтуитивно, что децимация является нелинейной операцией. Ну подумаешь повыкидывали отсчеты, делов то )


Децимация является линейной операцией (легко проверить, что decim( a+b ) = decim( a ) + decim( b ) и decim( k*a ) = k* decim( a ) ). У нее проблемы с time-invariance wink.gif Впрочем, также как например и у переноса частоты.
ViKo
Цитата(ilynxy @ Oct 18 2014, 13:19) *
И получается, что после децимации дифференциал ответа на ступеньку даёт завал АЧХ в конце где-то на 3 dB. Если поэкспериментировать с децимацией (например, сделать в два раза), то завал уменьшится.
Собственно вопрос: почему так происходит?

Тогда такое объяснение. Когда при децимации спектр "сближается", из-за уменьшения частоты дискретизации, то нельзя просто накладывать один фрагмент амплитудного спектра на другой для получения результирующей АЧХ. Надо учитывать действительную и мнимую части. Вот если их перемножить комплексно, то и появится завал на краю полосы пропускания.
?
ilynxy
Цитата(andyp @ Oct 19 2014, 12:22) *
Децимация является линейной операцией (легко проверить, что decim( a+b ) = decim( a ) + decim( b ) и decim( k*a ) = k* decim( a ) ). У нее проблемы с time-invariance wink.gif Впрочем, также как например и у переноса частоты.
Виноват, исправлюсь. Я имел ввиду linear time-invariant (LTI), использовал только термин linear, забыв про time-invariant. По русски это, если верить Википедии, переводится как "линейная и стационарная". То есть операция децимации линейная, но не стационарная. Так правильней, наверное.

И, да, после добавления в конец скрипта, вот этих строк:
Код
x_diric = [0:0.001:1];
y_diric = 20*log10(diric(x_diric*pi,k));
plot(Fx, PRy, Fx_decim, PRy_decim, x_diric, y_diric);
В моей голове всё окончательно уложилось. Собственно передаточная функция фильтра "бегущее среднее" (знакома по расчётам CIC фильтров).
dmitry-tomsk
Как-то странно вы матлаб пользуете. Фильтр цифровой, коэффициенты есть, есть готовая функция freqz, операция прореживания эквивалентна ставкой доп нулей между коэффициентами фильтра, легко понять это, анализируя выражение для свёртки.
ilynxy
Цитата(dmitry-tomsk @ Oct 20 2014, 11:50) *
Как-то странно вы матлаб пользуете. Фильтр цифровой, коэффициенты есть, есть готовая функция freqz, операция прореживания эквивалентна ставкой доп нулей между коэффициентами фильтра, легко понять это, анализируя выражение для свёртки.
По поводу цифрового фильтра и функции freqz: фильтр и децимация реализованны в чёрном ящике и нужно получить "натурные" результаты, я не анализирую коэффициенты фильтра (с ними всё понятно), а показываю (чтобы убедиться, что я понимаю правильно), что методика измерения путём подачи на вход ступеньки и затем дифференцирования ответа чёрного ящика (для получения АЧХ, например) неприменима для нестационарной (not time-invariant) системы, коей является дециматор. Более того, даже привожу функцию которая описывает соотношение между "ожидаемым" и "измеренным" результатом.

А по поводу вставки нулей между коэффициентами фильтра -- результат будет отличаться от дифференциала децимированного ответа на ступеньку. КИХ фильтр, как его не крути, будет линеен и стационарен. А вот децимация уже нестационарная (на пальцах: меняется "дельта" времени).

Ещё раз: я спрашивал про неприменимость метода "ступеньку на вход -> дифференциал -> FFT" для построения АЧХ произвольной системы (в частности нестационарной), а не про анализ характеристик фильтра.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.