Многоступенчатое преобразование уровня

Многоступенчатое преобразование уровня является подходом, который разделяет преобразование уровня в несколько этапов. Например, вместо децимации на коэффициент 18, десятикратно уменьшите фактором 3, сопровождаемый другой децимацией 3, и и затем на коэффициент 2. Используя несколько этапов уменьшает вычислительную сложность отфильтрованного преобразования уровня. Кроме того, если у вас уже есть преобразователи для различных простых множителей, они могут использоваться в качестве базовых блоков для более высоких уровней. Этот пример продемонстрирует многоступенчатые проекты преобразования уровня.

Одноступенчатый v.s. Многоступенчатое Преобразование: Анализ затрат

Считайте систему децимации уровня M=8. Можно реализовать такую систему двумя способами:

  • Один decimator уровня M=8.

  • Каскад трех полууровней decimators (M=2)

В то время как эти две альтернативы эффективно имеют тот же фактор децимации, они отличаются по своим числовым сложностям. Оцените стоимость реализации многоступенчатого decimator использование cost функция, и сравнивает его со стоимостью реализации одноступенчатого decimator.

bDecim2 = designMultirateFIR(1,2);
firDecim2_1 = dsp.FIRDecimator(2,bDecim2);
firDecim2_2 = dsp.FIRDecimator(2,bDecim2);
firDecim2_3 = dsp.FIRDecimator(2,bDecim2);
firDecim2cascade = dsp.FilterCascade(firDecim2_1,firDecim2_2,firDecim2_3);

cost2cascade = cost(firDecim2cascade)

bDecim8 = designMultirateFIR(1,8);
firDecim8 = dsp.FIRDecimator(8,bDecim8);
cost8 = cost(firDecim8)
cost2cascade = 

  struct with fields:

                  NumCoefficients: 75
                        NumStates: 138
    MultiplicationsPerInputSample: 21.8750
          AdditionsPerInputSample: 21


cost8 = 

  struct with fields:

                  NumCoefficients: 169
                        NumStates: 184
    MultiplicationsPerInputSample: 21.1250
          AdditionsPerInputSample: 21

При расположении каскадом трех decimators уровня M=2 использует меньше памяти (состояния и коэффициенты) по сравнению с одноступенчатым decimator M=8, делая многоступенчатый конвертер большей памятью эффективный. Арифметическая загрузка (операции на выборку) одноступенчатой и многоступенчатой реализации эквивалентна. Обратите внимание на то, что количество выборок понижается наполовину после каждого этапа децимации. В заключение часто лучше разделить децимацию в несколько этапов (учитывая, что фактором изменения уровня не является простое число, конечно).

Обычно существует больше чем один способ учесть (неглавную) скорость преобразования и еще больше степеней свободы многоступенчатый проект. DSP System Toolbox(TM) предлагает несколько инструментов, чтобы упростить процесс проектирования. Мы исследуем двух из них в дальнейшем.

Используя designMultistageDecimator и designMultistageInterpolator функции

designMultistageInterpolator и designMultistageDecimator функции автоматически определяют оптимальную настройку, которая включает определение количества этапов наряду с их расположениями, параметрами lowpass, и т.д. Результатом является каскадный системный объект фильтра, который инкапсулирует все этапы. Чтобы проиллюстрировать, давайте спроектируем decimator уровня M=12.

M = 12;
fcDecMulti = designMultistageDecimator(M);
info(fcDecMulti)
ans =

    'Discrete-Time Filter Cascade
     ----------------------------
     Number of stages: 3
     
     Stage1: 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                             
     
     
     Stage2: dsp.FIRDecimator
     -------
     Discrete-Time FIR Multirate Filter (real)               
     -----------------------------------------               
     Filter Structure   : Direct-Form FIR Polyphase Decimator
     Decimation Factor  : 2                                  
     Polyphase Length   : 8                                  
     Filter Length      : 15                                 
     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  : 3                                  
     Polyphase Length   : 27                                 
     Filter Length      : 79                                 
     Stable             : Yes                                
     Linear Phase       : Yes (Type 1)                       
                                                             
     Arithmetic         : double                             
     
     '

Этот конкретный проект имеет 3 этапа ($12=2\times 2\times 3$), где lowpass последней стадии является самым длинным.

Повторите проект с одноступенчатым.

fcDecSingle = designMultistageDecimator(M,'NumStages',1);
info(fcDecSingle)
ans =

    'Discrete-Time Filter Cascade
     ----------------------------
     Number of stages: 1
     
     Stage1: dsp.FIRDecimator
     -------
     Discrete-Time FIR Multirate Filter (real)               
     -----------------------------------------               
     Filter Structure   : Direct-Form FIR Polyphase Decimator
     Decimation Factor  : 12                                 
     Polyphase Length   : 26                                 
     Filter Length      : 307                                
     Stable             : Yes                                
     Linear Phase       : Yes (Type 1)                       
                                                             
     Arithmetic         : double                             
     
     '

Сравните стоимость этих двух реализаций. Obivously, многоступенчатый подход более эффективен.

costMulti = cost(fcDecMulti)
costSingle = cost(fcDecSingle)
costMulti = 

  struct with fields:

                  NumCoefficients: 69
                        NumStates: 102
    MultiplicationsPerInputSample: 10.1667
          AdditionsPerInputSample: 9.3333


costSingle = 

  struct with fields:

                  NumCoefficients: 283
                        NumStates: 300
    MultiplicationsPerInputSample: 23.5833
          AdditionsPerInputSample: 23.5000

Теперь давайте сравним объединенную частотную характеристику децимирующих фильтров. В то время как фильтры этих двух реализаций отличаются по полосе задерживания, полоса пропускания и полоса перехода почти идентичны.

hfv = fvtool(fcDecMulti, fcDecSingle);
legend(hfv,'Multistage Combined Response', 'Single-Stage Response');

Та же методология запрашивает designMultistageInterpolator. Создайте два интерполятора (одноступенчатый и многоступенчатый) и сравните их выходные параметры. Обратите внимание на то, что выходные параметры почти идентичны, кроме немного более длинной задержки многоступенчатого интерполятора.

n = (1:20)';
x = (abs(n-5)<=5).*(5-abs(n-5));

L = 12;
fcIntrMulti = designMultistageInterpolator(L);
fcIntrSingle = designMultistageInterpolator(L,'NumStages',1);

xInterpSingle = fcIntrSingle(x);
xInterpMulti = fcIntrMulti(x);

release(fcIntrMulti);
release(fcIntrSingle);

subplot(3,1,1); stem(x); xlim([1,20]); title('Input Sequence');
subplot(3,1,2); stem(xInterpSingle); title('Single-Stage Interpolated')
subplot(3,1,3); stem(xInterpMulti); title('Multistage Interpolated')

dsp.SampleRateConverter Системный объект

dsp.SampleRateConverter системный объект обеспечивает удобный интерфейс для произвольного преобразования уровня, комбинируя интерполяцию и децимацию по мере необходимости.

src = dsp.SampleRateConverter('InputSampleRate',18,'OutputSampleRate',16,'Bandwidth',13);
info(src)
ans =

    'Overall Interpolation Factor    : 8
     Overall Decimation Factor       : 9
     Number of Filters               : 1
     Multiplications per Input Sample: 24.333333
     Number of Coefficients          : 219
     Filters:                         
        Filter 1:
        dsp.FIRRateConverter - Interpolation Factor: 8
                             - Decimation Factor   : 9 
     '

Различные этапы могут быть извлечены с getFilters функция:

firs = getFilters(src)
firs = 

  dsp.FilterCascade with properties:

    Stage1: [1x1 dsp.FIRRateConverter]

Мы можем также задать абсолютные частоты (а не отношения). Например, dsp.SampleRateConverter объект может преобразовать частоту дискретизации аудиоданных от 48 кГц до 44,1 кГц.

src = dsp.SampleRateConverter('InputSampleRate',48000,'OutputSampleRate',44100);
[L,M] = getRateChangeFactors(src);

firs = getFilters(src);

reader = dsp.AudioFileReader('audio48kHz.wav','SamplesPerFrame',4*M);

x = reader();
xr = src(x);

% Obtain the rate conversion FIR
b = firs.Stage1.Numerator;

% Calculate the resampling delay
i0 = floor(length(b)/2)/L;

figure;
hold on;
stem((1:length(x))+i0,x);
stem(linspace(1,length(x),length(xr)),xr,'r');
hold off;
legend('Input Audio','Resampled Audio');
xlim([150,200])

release(reader);

Упрощение слабым преобразованием уровня

Отношения преобразования как$48k/44.1k$ (используемый в предыдущем разделе) требуют большой повышающей дискретизации и субдискретизации отношений, как даже ее уменьшаемая форма$L/M=160/147$. Фильтры, требуемые для такого преобразования, довольно длинны, вводя значительную задержку в дополнение к памяти и вычислительной загрузке.

cost(src)
ans = 

  struct with fields:

                  NumCoefficients: 8587
                        NumStates: 58
    MultiplicationsPerInputSample: 53.6688
          AdditionsPerInputSample: 52.7500

Мы можем смягчить дорогостоящее преобразование путем аппроксимации коэффициента преобразования уровня. Например,

$$48kHz/44.1kHz \approx 48kHz/44kHz = 12/11.$$

Отклонение 100 Гц является маленьким, только 0,23% абсолютных частот. dsp.SampleRateConverter может автоматически аппроксимировать коэффициент преобразования уровня, позволив выходной частоте быть встревоженным. Допуск возмущения задан через 'OutputRateTolerance' свойство. Допуск по умолчанию 0, значение, нет слабейте. Другими словами, слабый означает отклонение от заданного значения нормы выработки. Безусловно, аппроксимированное преобразование уровня имеет намного меньшую вычислительную стоимость и достаточно для многих приложений, таких как стандартная обработка аудиоданных определения.

src_approx = dsp.SampleRateConverter('InputSampleRate',48000,...
            'OutputSampleRate',44100,'Bandwidth',13,...
            'OutputRateTolerance',0.01);
[L_approx,M_approx] = getRateChangeFactors(src_approx)

cost(src_approx)
L_approx =

    11


M_approx =

    12


ans = 

  struct with fields:

                  NumCoefficients: 61
                        NumStates: 5
    MultiplicationsPerInputSample: 5.0833
          AdditionsPerInputSample: 4.1667

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте