В этом примере показано, как спроектировать многоступенчатые дециматоры и интерполяторы. Пример Эффективная Узкополосная конечная импульсная характеристика Создания фильтра показов, как применить подходы 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)
Использование многоступенчатых методов может обеспечить значительную вычислительную экономию при реализации дециматоров/интерполяторов.