|
Децимирующий КИХ фильтр, Завал АЧХ после децимации |
|
|
|
Oct 18 2014, 10:19
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 11-04-10
Пользователь №: 56 562

|
Доброго всем. Уважаемые! Поясните пожалуйста, почему после децимирующего 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. Если поэкспериментировать с децимацией (например, сделать в два раза), то завал уменьшится.  Собственно вопрос: почему так происходит? И попутный вопрос: как исследовать характеристики фильтра "в живой природе"? Получается, что если фильтр децимирующий, то исследовать его характеристики методом подачи "единичной функции" нельзя? В более общем случае: если я не знаю характеристики системы и мне нужно построить её АЧХ, то я не имею права исследовать воздействуя на неё единичной функцией и получая спектр дифференциала ответа?
Сообщение отредактировал ilynxy - Oct 18 2014, 11:48
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 18 2014, 12:20
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(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Конечно могу ошибаться.
--------------------
|
|
|
|
|
Oct 18 2014, 12:28
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 11-04-10
Пользователь №: 56 562

|
Цитата(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в, до того как этим займется модератор раздела. Если честно, я не понял, что именно нарушено? Грамматика, содержание?
|
|
|
|
|
Oct 18 2014, 13:15
|
Местный
  
Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163

|
Цитата(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, не знаю как по-русски). В спектре выходного сигнала после него появляются составляющие, которых до него там не было. Зачем тогда говорить про АЧХ-ФЧХ...
|
|
|
|
|
Oct 18 2014, 14:54
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(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Конечно могу ошибаться. можете. и ошибаетесь. функции дирака, хэвисайда - мат абстракции. можно к ним сколь угодно приблизиться, но реализовать точно, никогда. дискретная ед ступенька, дискретная дельта-функция вполне себе реализуются точно.
|
|
|
|
|
Oct 18 2014, 16:27
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 11-04-10
Пользователь №: 56 562

|
Цитата(andyp @ Oct 18 2014, 17:15)  Во-первых внутри downsample тоже используется ФНЧ (скорее всего c ИХ вида sinc, умноженный на окно), полоса которого уже чем 0.25 Fs. Отсюда завал на 6 dB. Во-вторых дециматор не является LTI системой (linear time invariant, не знаю как по-русски). В спектре выходного сигнала после него появляются составляющие, которых до него там не было. Зачем тогда говорить про АЧХ-ФЧХ... Спасибо за наводку про LTI. Действительно дециматор не является LTI поэтому применять дифференциацию функции Хэвисайда неправомерно, сначала нужно привести в тот же временной домен (interpolate), что приведет (в идеале) к недецимированному сигналу. Значит остается только один способ - ГКЧ. Спасибо всем, в голове всё уложилось.
|
|
|
|
|
Oct 18 2014, 19:31
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(ViKo @ Oct 18 2014, 22:40)  Если нарисовать разность между y_decim и у, прореженным вручную (индексом), то можно увидеть, что она не нулевая. Похоже, downsample еще и фильтрует. не надо телепатии и прочей кофейной гущи. для того, что бы убедиться в отсутствии фильтрации достаточно посмотреть в исходники. updownsample - добавление нулей/выкидывание отсчетов.
|
|
|
|
|
Oct 18 2014, 20:31
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(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; Где посмотреть исходник?
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 18 2014, 20:54
|
Знающий
   
Группа: Участник
Сообщений: 781
Регистрация: 3-08-09
Пользователь №: 51 730

|
Цитата(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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|