exponenta event banner

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

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

Одноступенчатое преобразование: анализ затрат

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

  • Один прореживатель скорости М = 8.

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

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

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

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

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

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

designMultistageInterpolator и designMultistageDecimator функции автоматически определяют оптимальную конфигурацию, которая включает в себя определение количества этапов вместе с их компоновками, параметрами нижних частот и т.д. Результатом является объект системы каскада фильтров, который инкапсулирует все этапы. Для иллюстрации рассмотрим прореживатель скорости М = 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$(), где нижний ход последней ступени является самым длинным.

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

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                             
     
     '

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

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.$$

Отклонение 100Hz невелико, всего 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

Связанные темы