Этот пример показывает увеличение эффективности, которое возможно при использовании многоскоростных и многоступенчатых фильтров для определенных приложений. В этом случае явное преимущество достигается по регулярной линейной фазе equiripple проект, когда узкая ширина полосы перехода требуется. Более подробная обработка ключевых пунктов, сделанных здесь, может быть найдена в названном Эффективном Узком КИХ-Создании фильтра Полосы Перехода примера.
Рассмотрите следующие технические требования проекта для фильтра lowpass (где пульсации даны в линейных модулях):
Fpass = 0.13; % Passband edge Fstop = 0.14; % Stopband edge Rpass = 0.001; % Passband ripple, 0.0174 dB peak to peak Rstop = 0.0005; % Stopband ripple, 66.0206 dB minimum attenuation Hf = fdesign.lowpass(Fpass,Fstop,Rpass,Rstop,'linear');
Регулярная линейная фаза equiripple проект с помощью этих технических требований может быть спроектирована путем оценки следующего:
lpFilter = design(Hf,'equiripple','SystemObject',true);
Когда вы определяете стоимость этого проекта, вы видите, что требуются 695 множителей.
cost(lpFilter)
ans = struct with fields:
NumCoefficients: 695
NumStates: 694
MultiplicationsPerInputSample: 695
AdditionsPerInputSample: 694
Количество множителей, требуемых фильтром с помощью одного состояния, один уровень equiripple проект, 694. Это количество может быть сокращено с помощью многоскоростных/многоступенчатых методов. В любом односкоростном проекте количество умножения, требуемого каждой входной выборкой, равно количеству ненулевых множителей в реализации. Однако при помощи многоскоростного/многоступенчатого проекта, децимация и интерполяция могут быть объединены, чтобы уменьшить требуемый расчет. Для decimators среднее количество умножения, требуемого на входную выборку, дано количеством множителей, разделенных на фактор децимации.
lpFilter_multi = design(Hf,'multistage','SystemObject',true);
Можно затем просмотреть стоимость фильтра, созданного с помощью этого шага проекта, и вы видите, что было достигнуто значительное преимущество стоимости.
cost(lpFilter_multi)
ans = struct with fields:
NumCoefficients: 396
NumStates: 352
MultiplicationsPerInputSample: 73
AdditionsPerInputSample: 70.8333
fvt = fvtool(lpFilter,lpFilter_multi); legend(fvt,'Equiripple design', 'Multirate/multistage design')
Заметьте, что затухание в полосе задерживания для многоступенчатого проекта приблизительно дважды больше чем это других проектов. Это вызвано тем, что decimators должен ослабить внеполосные компоненты на 66 дБ во избежание искажения, которое нарушило бы технические требования. Точно так же интерполяторы должны ослабить изображения на 66 дБ. Можно также видеть, что усиление полосы пропускания для этого проекта больше не 0 дБ, потому что каждый интерполятор имеет номинальное усиление (в линейных модулях) равный его коэффициенту интерполяции, и общий коэффициент интерполяции для этих трех интерполяторов равняется 6.
Можно проверять эффективность многоскоростного/многоступенчатого проекта путем графического вывода степени спектральная плотность входа и различных выходных параметров, и вы видите что синусоида в ослабляется сравнительно и проектом equiripple и многоскоростным/многоступенчатым проектом.
n = 0:1799; x = sin(0.1*pi*n') + 2*sin(0.15*pi*n'); y = lpFilter(x); y_multi = lpFilter_multi(x); [Pxx,w] = periodogram(x); Pyy = periodogram(y); Pyy_multi = periodogram(y_multi); plot(w/pi,10*log10([Pxx,Pyy,Pyy_multi])); xlabel('Normalized Frequency (x\pi rad/sample)'); ylabel('Power density (dB/rad/sample)'); legend('Input signal PSD','Equiripple output PSD',... 'Multirate/multistage output PSD') axis([0 1 -50 30]) grid on