В этом примере показано, как проектировать многоступенчатые прореживатели и интерполяторы. В примере «Эффективный узкополосный КИХ-фильтр» показано, как применять подходы IFIR и MULTIPSTAGE к односкоростным схемам низкочастотных фильтров. Методы могут быть расширены до конструкции многоступенчатых прореживателей и/или интерполяторов. Подход IFIR приводит к двухступенчатому прореживателю/интерполятору. Для многоступенчатого подхода количество этапов может быть либо автоматически оптимизировано, либо управляться вручную.
Прореживатели используются для уменьшения частоты дискретизации сигнала при одновременном пропорциональном уменьшении полосы пропускания. Например, для уменьшения скорости с 48 МГц до 1 МГц, коэффициента 48, ниже приведены типичные спецификации фильтра нижних частот, который соответственно уменьшит полосу пропускания.
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)

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