реклама на сайте
подробности

 
 
> Децимирующий КИХ фильтр, Завал АЧХ после децимации
ilynxy
сообщение Oct 18 2014, 10:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ilynxy
сообщение Oct 18 2014, 22:10
Сообщение #2


Участник
*

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



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

Просто для меня несколько контринтуитивно, что децимация является нелинейной операцией. Ну подумаешь повыкидывали отсчеты, делов то )
Go to the top of the page
 
+Quote Post
andyp
сообщение Oct 19 2014, 08:22
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Цитата(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 Впрочем, также как например и у переноса частоты.
Go to the top of the page
 
+Quote Post
ilynxy
сообщение Oct 19 2014, 11:35
Сообщение #4


Участник
*

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



Цитата(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 фильтров).
Go to the top of the page
 
+Quote Post
dmitry-tomsk
сообщение Oct 20 2014, 07:50
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 672
Регистрация: 18-02-05
Пользователь №: 2 741



Как-то странно вы матлаб пользуете. Фильтр цифровой, коэффициенты есть, есть готовая функция freqz, операция прореживания эквивалентна ставкой доп нулей между коэффициентами фильтра, легко понять это, анализируя выражение для свёртки.
Go to the top of the page
 
+Quote Post
ilynxy
сообщение Oct 20 2014, 13:49
Сообщение #6


Участник
*

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



Цитата(dmitry-tomsk @ Oct 20 2014, 11:50) *
Как-то странно вы матлаб пользуете. Фильтр цифровой, коэффициенты есть, есть готовая функция freqz, операция прореживания эквивалентна ставкой доп нулей между коэффициентами фильтра, легко понять это, анализируя выражение для свёртки.
По поводу цифрового фильтра и функции freqz: фильтр и децимация реализованны в чёрном ящике и нужно получить "натурные" результаты, я не анализирую коэффициенты фильтра (с ними всё понятно), а показываю (чтобы убедиться, что я понимаю правильно), что методика измерения путём подачи на вход ступеньки и затем дифференцирования ответа чёрного ящика (для получения АЧХ, например) неприменима для нестационарной (not time-invariant) системы, коей является дециматор. Более того, даже привожу функцию которая описывает соотношение между "ожидаемым" и "измеренным" результатом.

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

Ещё раз: я спрашивал про неприменимость метода "ступеньку на вход -> дифференциал -> FFT" для построения АЧХ произвольной системы (в частности нестационарной), а не про анализ характеристик фильтра.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ilynxy   Децимирующий КИХ фильтр   Oct 18 2014, 10:19
- - des00   1. Кто вас научил исследовать фильтры с помощью фу...   Oct 18 2014, 10:29
|- - ilynxy   Цитата(des00 @ Oct 18 2014, 14:29) 1. Кто...   Oct 18 2014, 12:28
||- - andyp   Цитата(ilynxy @ Oct 18 2014, 16:28) Возмо...   Oct 18 2014, 13:15
||- - ilynxy   Цитата(andyp @ Oct 18 2014, 17:15) Во-пер...   Oct 18 2014, 16:27
|- - ViKo   Цитата(des00 @ Oct 18 2014, 13:29) Кто ва...   Oct 18 2014, 17:18
- - thermit   нет здесь никакой функции хевисайда. есть дискретн...   Oct 18 2014, 11:00
|- - des00   Цитата(thermit @ Oct 18 2014, 18:00) нет ...   Oct 18 2014, 12:20
|- - thermit   Цитата(des00 @ Oct 18 2014, 16:20) вы гур...   Oct 18 2014, 14:54
- - ViKo   Undefined function or variable 'm'. MATLAB...   Oct 18 2014, 14:25
|- - V_G   Цитата(ViKo @ Oct 19 2014, 00:25) Undefin...   Oct 18 2014, 15:12
- - ViKo   Если нарисовать разность между y_decim и у, прореж...   Oct 18 2014, 18:40
|- - thermit   Цитата(ViKo @ Oct 18 2014, 22:40) Если на...   Oct 18 2014, 19:31
|- - ViKo   Цитата(thermit @ Oct 18 2014, 22:31) не н...   Oct 18 2014, 20:31
|- - thermit   Цитата(ViKo @ Oct 19 2014, 00:31) Кодfigu...   Oct 18 2014, 20:54
- - ViKo   Цитата(ilynxy @ Oct 18 2014, 13:19) И пол...   Oct 19 2014, 10:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th August 2025 - 12:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016