Этот пример показывает увеличение эффективности, которое возможно при использовании многоступенчатых и многоступенчатых фильтров для определенных приложений. В этом случае достигается отдельное преимущество по сравнению с правильным проектом линейно-фазового равновесия, когда требуется узкая ширина переходного диапазона. Более подробную обработку ключевых точек, сделанных здесь, можно найти в примере, озаглавленном Эффективная узкополосная конечная импульсная характеристика Создания фильтра.
Рассмотрите следующие проектные спецификации для 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');
Регулярная линейно-фазовая конструкция равновесия с использованием этих спецификаций может быть спроектирована путем оценки следующего:
lpFilter = design(Hf,'equiripple','SystemObject',true);
Когда вы определяете стоимость этого проекта, можно увидеть, что требуется 695 умножителей.
cost(lpFilter)
ans = struct with fields:
NumCoefficients: 695
NumStates: 694
MultiplicationsPerInputSample: 695
AdditionsPerInputSample: 694
Количество умножителей, требуемых фильтром, использующим одинарный проект равновесия с одной скоростью, составляет 694. Это количество может быть уменьшено с помощью мультирейт/многоступенчатых методов. В любом односкоростном проекте количество умножений, требуемых каждой входной выборкой, равно количеству ненулевых умножителей в реализации. Однако при помощи многоуровневого / многоступенчатого проекта десятикратное уменьшение и интерполяция могут быть объединены, чтобы уменьшить необходимые расчеты. Для дециматоров среднее количество умножений, требуемых на входную выборку, определяется количеством умножителей, разделенных на коэффициент десятикратного уменьшения.
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')
Заметьте, что затухание в полосе задерживания для многоступенчатой конструкции примерно в два раза больше, чем для других проектов. Это связано с тем, что дециматоры должны ослаблять внеполосные компоненты на 66 дБ в порядок, чтобы избежать сглаживания, которое будет нарушать спецификации. Точно так же интерполяторы должны ослаблять изображения на 66 дБ. Можно также увидеть, что коэффициент усиления полосы пропускания для этого проекта больше не равен 0 дБ, потому что каждый интерполятор имеет номинальный коэффициент усиления (в линейных модулях), равный его коэффициенту интерполяции, и общий коэффициент интерполяции для трех интерполяторов равен 6.
Можно проверить эффективность многоцелевого/многоступенчатого проекта путем построения графика спектральных плотностей степени входного сигнала и различных выходов, и можно увидеть, что синусоида в сравнительно ослабляется как равнодействующим проектом, так и многоразовым/многоступенчатым проектом.
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