exponenta event banner

Эффективное преобразование частоты выборки между произвольными факторами

В этом примере показано, как эффективно преобразовывать частоты дискретизации между произвольными факторами.

Необходимость преобразования частоты дискретизации произвольным фактором возникает во многих приложениях (например, синхронизация символов в цифровых приемниках, кодирование и синтез речи, компьютерное моделирование систем непрерывного времени и т.д.). В этом примере мы рассмотрим пример, где каскады полиномиальных и полифазных фильтров образуют эффективное решение, когда желательно преобразовать частоту дискретизации сигнала от 8 кГц до 44,1 кГц.

Одноступенчатый многофазный подход

Многофазные структуры обычно считаются эффективными реализациями многоскоростных фильтров. Однако в случае дробного преобразования частоты дискретизации количество фаз и, следовательно, порядок фильтрации могут быстро стать чрезмерно высокими. Для повторной выборки сигнала от 8 кГц до 44,1 кГц интерполируем по 441 и прореживаем по 80 (8 * 441/80 = 44,1).

sampRateConv = dsp.SampleRateConverter('Bandwidth',6e3, ...
    'InputSampleRate',8e3,'OutputSampleRate',44.1e3, ...
    'StopbandAttenuation',50);

Это может быть сделано относительно эффективным образом в два этапа:

info(sampRateConv)
cost(sampRateConv)
ans =

    'Overall Interpolation Factor    : 441
     Overall Decimation Factor       : 80
     Number of Filters               : 2
     Multiplications per Input Sample: 95.175000
     Number of Coefficients          : 1774
     Filters:                         
        Filter 1:
        dsp.FIRRateConverter - Interpolation Factor: 147
                             - Decimation Factor   : 80 
        Filter 2:
        dsp.FIRInterpolator  - Interpolation Factor: 3 
     '


ans = 

  struct with fields:

                  NumCoefficients: 1774
                        NumStates: 30
    MultiplicationsPerInputSample: 95.1750
          AdditionsPerInputSample: 89.6750

Хотя количество операций на входную выборку является разумным (приблизительно 95 умножений - с учетом того, что скорость увеличивается после первого этапа до 14,7 кГц), в этом случае в памяти должны быть сохранены 1774 коэффициента.

Обеспечение допуска выходной скорости

Один из способов уменьшения большого числа коэффициентов мог бы заключаться в обеспечении допуска в выходной частоте дискретизации, если точная частота не является критической. Например, задание допуска 1% приводит к выходной частоте 44 кГц, а не 44,1 кГц. Теперь это требует интерполяции на 11 и децимации на 2. Это можно сделать эффективно с помощью одного этапа.

sampRateConvWithTol = dsp.SampleRateConverter('Bandwidth',6e3, ...
    'InputSampleRate',8e3,'OutputSampleRate',44.1e3, ...
    'StopbandAttenuation',50,'OutputRateTolerance',0.01);
cost(sampRateConvWithTol)
ans = 

  struct with fields:

                  NumCoefficients: 120
                        NumStates: 12
    MultiplicationsPerInputSample: 60
          AdditionsPerInputSample: 55

В этом случае требуется 120 коэффициентов, и количество умножений на входную выборку равно 60.

Одноступенчатый подход Farrow

Фильтры на основе полиномов являются еще одним способом решения проблемы необходимости хранения большого количества коэффициентов. Структуры Farrow являются эффективными реализациями для таких фильтров.

farrowSampRateConv_3rd = dsp.FarrowRateConverter('InputSampleRate',8e3, ...
    'OutputSampleRate',44.1e3,'PolynomialOrder',3);

farrowSampRateConv_4th = dsp.FarrowRateConverter('InputSampleRate',8e3, ...
    'OutputSampleRate',44.1e3,'PolynomialOrder',4);

cost(farrowSampRateConv_3rd)
cost(farrowSampRateConv_4th)
ans = 

  struct with fields:

                  NumCoefficients: 16
                        NumStates: 3
    MultiplicationsPerInputSample: 66.1500
          AdditionsPerInputSample: 60.6375


ans = 

  struct with fields:

                  NumCoefficients: 25
                        NumStates: 4
    MultiplicationsPerInputSample: 121.2750
          AdditionsPerInputSample: 99.2250

Для многочленов 3-го порядка необходимо 16 коэффициентов и около 66 умножений на входную выборку. Полиномы четвертого порядка обеспечивают несколько лучшую низкочастотную характеристику при более высокой стоимости: 25 коэффициентов и 121 умножение на входную выборку.

filts = getFilters(sampRateConv);
W = linspace(0,44.1e3,2048);  % Define the frequency range analysis
Fs1 = 8e3*147;  % The equivalent single stage filter is clocked at 3.53 MHz
hfvt = fvtool(filts.Stage1,farrowSampRateConv_3rd, ...
    farrowSampRateConv_4th,'FrequencyRange','Specify freq. vector', ...
    'FrequencyVector',W,'Fs',[Fs1 3*Fs1 3*Fs1], ...
    'NormalizeMagnitudeto1','on','Color','white');
legend(hfvt,'Polyphase Sample-Rate Converter', ...
    '3rd-Order Farrow Interpolator','4th-Order Farrow Interpolator', ...
    'Location','NorthEast')

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

farrowSampRateConv_4th = dsp.FarrowRateConverter('InputSampleRate',8e3, ...
    'OutputSampleRate',44.1e3,'PolynomialOrder',4, ...
    'OutputRateTolerance',0.01);
info(farrowSampRateConv_4th)
cost(farrowSampRateConv_4th)
ans =

  12x52 char array

    'Discrete-Time FIR Multirate Filter (real)           '
    '-----------------------------------------           '
    'Filter Structure      : Farrow Sample-Rate Converter'
    'Interpolation Factor  : 11                          '
    'Decimation Factor     : 2                           '
    'Filter Length         : 5                           '
    'Stable                : Yes                         '
    'Linear Phase          : No                          '
    '                                                    '
    'Arithmetic            : double                      '
    'Output Rate Tolerance : 1.000000 %                  '
    'Adjusted Output Rate  : 44000.000000                '


ans = 

  struct with fields:

                  NumCoefficients: 25
                        NumStates: 4
    MultiplicationsPerInputSample: 121
          AdditionsPerInputSample: 99

Каскад полифазных структур Farrow и FIR

Теперь мы пытаемся разработать гибридное решение, которое будет использовать преимущества двух типов фильтров, которые мы видели ранее. Полифазные фильтры особенно хорошо приспособлены для интерполяции или прореживания целочисленным фактором и для преобразования дробной скорости, когда интерполяция и коэффициенты прореживания являются низкими. Фильтры Farrow могут эффективно реализовывать произвольные (в том числе иррациональные) коэффициенты изменения скорости. Во-первых, мы интерполируем исходный сигнал 8 кГц на 4, используя каскад полусферических фильтров FIR.

intSampRateConv = dsp.SampleRateConverter('Bandwidth',6e3, ...
    'InputSampleRate',8e3,'OutputSampleRate',32e3, ...
    'StopbandAttenuation',50);
info(intSampRateConv)
ans =

    'Overall Interpolation Factor    : 4
     Overall Decimation Factor       : 1
     Number of Filters               : 1
     Multiplications per Input Sample: 34.000000
     Number of Coefficients          : 34
     Filters:                         
        Filter 1:
        dsp.FIRInterpolator  - Interpolation Factor: 4 
     '

Затем мы интерполируем промежуточный сигнал 32 кГц на 44,1/32 = 1,378125, чтобы получить требуемую конечную частоту дискретизации 44,1 кГц. Мы используем кубический фильтр на основе полинома Лагранжа для этой цели.

farrowSampRateConv = dsp.FarrowRateConverter('InputSampleRate',32e3, ...
    'OutputSampleRate',44.1e3,'PolynomialOrder',3);

Общий фильтр получают просто каскадированием двух фильтров.

cost(intSampRateConv)
cost(farrowSampRateConv)
ans = 

  struct with fields:

                  NumCoefficients: 34
                        NumStates: 11
    MultiplicationsPerInputSample: 34
          AdditionsPerInputSample: 31


ans = 

  struct with fields:

                  NumCoefficients: 16
                        NumStates: 3
    MultiplicationsPerInputSample: 16.5375
          AdditionsPerInputSample: 15.1594

Число коэффициентов этой гибридной конструкции относительно низкое (36) и количество умножений на входную выборку также относительно низкое: 28 + 16 * 4 = 92. Комбинированная частотная характеристика этих двух конструкций превосходит частотную характеристику farrowSampRateConv_3rd или farrowSampRateConv_4th.

[Hsrc,f]     = freqz(intSampRateConv);
Fsfar        = 32e3*441;
Hfsrc        = freqz(farrowSampRateConv,f,Fsfar);
Hhybrid      = Hsrc.*Hfsrc;
Hhybrid_norm = Hhybrid/norm(Hhybrid,inf); % Normalize magnitude to 0 dB
plot(f,20*log10(abs(Hhybrid_norm)));
xlabel('Frequency (Hz)')
ylabel('Magnitude (dB)')
legend('Combined polyphase and Farrow sample rate converters', ...
       'Location','NorthEast')

Теперь мы перекрываем частотные характеристики одноступенчатых и многоступенчатых конструкций. Очевидно, что ответы весьма сопоставимы.

scope = dsp.SpectrumAnalyzer('SpectralAverages',50, ...
    'SampleRate',44.1e3,'PlotAsTwoSidedSpectrum',false, ...
    'YLimits',[-80 20],'ShowLegend',true, ...
    'ChannelNames',{'Single-stage design','Multi-stage design'});
tic,
while toc < 20
    % Run for 20 seconds
    x = randn(8000,1);

    % Convert rate using multistage FIR filters
    y1 = sampRateConv(x);

    % Convert rate using cascade of multistage FIR and Farrow filter
    ytemp  = intSampRateConv(x);
    y2     = farrowSampRateConv(ytemp);

    % Compare the output from both approaches
    scope([y1,y2])
end