В этом примере показано, как спроектировать многоступенчатые дециматоры и интерполяторы. Пример Эффективная Узкополосная конечная импульсная характеристика Создания фильтра показов, как применить подходы IFIR и MULTISTAGE к односкоростным проектам lowpass фильтров. Методы могут быть расширены на проект многоступенчатых дециматоров и/или интерполяторов. Подход IFIR результатов в двухэтапном дециматоре/интерполяторе. Для подхода MULTISTAGE количество каскадов может быть либо автоматически оптимизировано, либо управляться вручную.
Дециматоры используются, чтобы уменьшить частоту дискретизации сигнала и одновременно пропорционально уменьшить полосу пропускания. Для примера, чтобы уменьшить частоту с 48 МГц до 1 МГц, коэффициент 48, ниже приведены типичные спецификации для lowpass фильтра, который соответственно уменьшит пропускную способность.
Fs = 48e6; TW = 100e3; Astop = 80; % Minimum stopband attenuation M = 48; % Decimation factor
Простой многоступенчатый проект, заданная этими спецификациями,
multidecim = designMultistageDecimator(M,Fs,TW,Astop);
Чтобы проанализировать получившийся проект, доступны несколько функций
info(multidecim) % Provide some information on the multistage filter cost(multidecim) % Determine the implementation cost fvtool(multidecim) % Visualize overall magnitude response, group delay, etc
ans =
'Discrete-Time Filter Cascade
----------------------------
Number of stages: 5
Stage1: dsp.FIRDecimator
-------
Discrete-Time FIR Multirate Filter (real)
-----------------------------------------
Filter Structure : Direct-Form FIR Polyphase Decimator
Decimation Factor : 2
Polyphase Length : 4
Filter Length : 7
Stable : Yes
Linear Phase : Yes (Type 1)
Arithmetic : double
Stage2: dsp.FIRDecimator
-------
Discrete-Time FIR Multirate Filter (real)
-----------------------------------------
Filter Structure : Direct-Form FIR Polyphase Decimator
Decimation Factor : 2
Polyphase Length : 4
Filter Length : 7
Stable : Yes
Linear Phase : Yes (Type 1)
Arithmetic : double
Stage3: dsp.FIRDecimator
-------
Discrete-Time FIR Multirate Filter (real)
-----------------------------------------
Filter Structure : Direct-Form FIR Polyphase Decimator
Decimation Factor : 2
Polyphase Length : 6
Filter Length : 11
Stable : Yes
Linear Phase : Yes (Type 1)
Arithmetic : double
Stage4: dsp.FIRDecimator
-------
Discrete-Time FIR Multirate Filter (real)
-----------------------------------------
Filter Structure : Direct-Form FIR Polyphase Decimator
Decimation Factor : 3
Polyphase Length : 11
Filter Length : 33
Stable : Yes
Linear Phase : Yes (Type 1)
Arithmetic : double
Stage5: dsp.FIRDecimator
-------
Discrete-Time FIR Multirate Filter (real)
-----------------------------------------
Filter Structure : Direct-Form FIR Polyphase Decimator
Decimation Factor : 2
Polyphase Length : 48
Filter Length : 95
Stable : Yes
Linear Phase : Yes (Type 1)
Arithmetic : double
'
ans =
struct with fields:
NumCoefficients: 89
NumStates: 146
MultiplicationsPerInputSample: 6.6042
AdditionsPerInputSample: 5.6667

Многоступенчатые проекты эффективны с точки зрения умножений на входную выборку и общего количества коэффициентов фильтра. Сравните с одноэтапным проектом.
singledecim = designMultistageDecimator(M,Fs,TW,Astop,'NumStages',1); cost(singledecim) % Determine the implementation cost fvtool(multidecim,singledecim) legend('Multistage','Singlestage')
ans =
struct with fields:
NumCoefficients: 2361
NumStates: 2400
MultiplicationsPerInputSample: 49.1875
AdditionsPerInputSample: 49.1667

По умолчанию количество этапов автоматически определяется для минимизации затрат на реализацию. Количество каскадов может быть установлено вручную на любое число от 1 до количества простых множителей в коэффициенте десятикратного уменьшения. Увеличение до двух этапов имеет существенное различие.
twostagedecim = designMultistageDecimator(M,Fs,TW,Astop,'NumStages',2);
cost(twostagedecim)
ans =
struct with fields:
NumCoefficients: 218
NumStates: 265
MultiplicationsPerInputSample: 9.2500
AdditionsPerInputSample: 9.1667
По умолчанию проект минимизирует умножения на входную выборку. Также возможно минимизировать количество коэффициентов.
mincoeffdecim = designMultistageDecimator(M,Fs,TW,Astop,... 'MinTotalCoeffs',true); cost(mincoeffdecim)
ans =
struct with fields:
NumCoefficients: 87
NumStates: 147
MultiplicationsPerInputSample: 6.8125
AdditionsPerInputSample: 6
По сравнению с multidecim, количество коэффициентов меньше, но количество умножений на входную выборку больше.
По умолчанию лучшее многоступенчатое строение определяется с помощью оценок количества коэффициентов, необходимых для каждого этапа. Более медленный, но более точный метод проектирует всех кандидатов фильтров и определяет фактическое количество коэффициентов в порядок, чтобы найти оптимальное решение.
optimaldecim = designMultistageDecimator(M,Fs,TW,Astop,... 'CostMethod','design'); cost(optimaldecim) fvtool(multidecim,optimaldecim)
ans =
struct with fields:
NumCoefficients: 87
NumStates: 146
MultiplicationsPerInputSample: 6.5625
AdditionsPerInputSample: 5.6667

Аналогичная экономия возможна при разработке многоступенчатых интерполяторов. Как и во всех интерполяторах, общий проект имеет коэффициент усиления, равный коэффициенту интерполяции.
multiinterp = designMultistageInterpolator(8); fvtool(multiinterp)

Использование многоступенчатых методов может обеспечить значительную вычислительную экономию при реализации дециматоров/интерполяторов.