Многоступенчатое преобразование уровня является подходом, который разделяет преобразование уровня в несколько этапов. Например, вместо децимации на коэффициент 18, десятикратно уменьшите фактором 3, сопровождаемый другой децимацией 3, и и затем на коэффициент 2. Используя несколько этапов уменьшает вычислительную сложность отфильтрованного преобразования уровня. Кроме того, если у вас уже есть преобразователи для различных простых множителей, они могут использоваться в качестве базовых блоков для более высоких уровней. Этот пример демонстрирует многоступенчатые проекты преобразования уровня.
Рассмотрите систему децимации уровня M = 8. Можно реализовать такую систему двумя способами:
Один decimator уровня M = 8.
Каскад трех полууровней decimators (M = 2)
Многоступенчатый каскад отфильтрованного decimators (или интерполяторы) имеет уменьшаемую одноступенчатую форму. Фильтр в уменьшаемой форме называется одноступенчатым эквивалентным фильтром, который инкапсулирует фильтры всех этапов. Таким образом любой многоступенчатый каскадный КИХ decimator может быть представлен как одноступенчатый КИХ decimator. Для получения дополнительной информации см. [1]. Однако, в то время как эти две альтернативы эффективно выполняют ту же децимацию, они отличаются по своим числовым сложностям.
Оцените стоимость реализации многоступенчатого decimator использование cost функция, и выдерживает сравнение со стоимостью реализации одноступенчатого decimator.
firDecim2_1 = dsp.FIRDecimator(2); firDecim2_2 = dsp.FIRDecimator(2); firDecim2_3 = dsp.FIRDecimator(2); firDecim2cascade = dsp.FilterCascade(firDecim2_1,firDecim2_2,firDecim2_3); cost2cascade = cost(firDecim2cascade) firDecim8 = dsp.FIRDecimator(8); 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); disp(cascadeInfoSummary(fcDecMulti))
Multistage FIR Decimator, M=12 (48.0kHz to 4.0kHz) Equivalent lowpass cutoff: 4.0kHz, transition Width: 800.0Hz Number of stages: 3 Stage1: FIR Decimator, M = 2 (48.0kHz to 24.0kHz), FIR Length = 11 Stage2: FIR Decimator, M = 2 (24.0kHz to 12.0kHz), FIR Length = 15 Stage3: FIR Decimator, M = 3 (12.0kHz to 4.0kHz), FIR Length = 79
Этот конкретный проект имеет 3 этапа (
), где lowpass последней стадии является самым длинным.
Повторите проект с одноступенчатым.
fcDecSingle = designMultistageDecimator(M,'NumStages',1);
disp(cascadeInfoSummary(fcDecSingle))
Multistage FIR Decimator, M=12 (48.0kHz to 4.0kHz) Equivalent lowpass cutoff: 4.0kHz, transition Width: 800.0Hz Number of stages: 1 Stage1: FIR Decimator, M = 12 (48.0kHz to 4.0kHz), FIR Length = 307
Сравните стоимость этих двух реализаций. 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')

designMultistageDecimator и designMultistageInterpolator ФункцииМожно задать параметры создания фильтра, такие как ширина перехода и затухание в полосе задерживания к designMultistageDecimator и designMultistageInterpolator функции. Такие дополнительные параметры допускают лучшее управление характеристик фильтра. Входная Фс частоты дискретизации принята, чтобы быть 1 по умолчанию, но это значение может быть настроено также.
Спроектируйте фильтр, который уменьшает входной уровень с 48 МГц до 1 МГц, фактор децимации 48. Следующее является типичными техническими требованиями для фильтра lowpass, который уменьшает полосу пропускания соответственно.
Fs = 48e6; TW = 100e3; Astop = 80; % Minimum stopband attenuation M = 48; % Decimation factor
Вот простой многоступенчатый проект для этих спецификаций.
multiDecim = designMultistageDecimator(M,Fs,TW,Astop); disp(cascadeInfoSummary(multiDecim))
Multistage FIR Decimator, M=48 (48.0MHz to 1.0MHz) Equivalent lowpass cutoff: 1.0MHz, transition Width: 100.0kHz Number of stages: 5 Stage1: FIR Decimator, M = 2 (48.0MHz to 24.0MHz), FIR Length = 7 Stage2: FIR Decimator, M = 2 (24.0MHz to 12.0MHz), FIR Length = 7 Stage3: FIR Decimator, M = 2 (12.0MHz to 6.0MHz), FIR Length = 11 Stage4: FIR Decimator, M = 3 (6.0MHz to 2.0MHz), FIR Length = 33 Stage5: FIR Decimator, M = 2 (2.0MHz to 1.0MHz), FIR Length = 95
Это - 5-этапный каскад decimator с факторами
, продукт
которых как ожидалось.
Спроектируйте подобный фильтр с шириной перехода по умолчанию и затуханием. Полная скорость преобразования подобна, но ширина перехода (и возможно упорядоченное расположение этапов) может отличаться.
multiDecim_default = designMultistageDecimator(M,Fs); disp(cascadeInfoSummary(multiDecim_default))
Multistage FIR Decimator, M=48 (48.0MHz to 1.0MHz) Equivalent lowpass cutoff: 1.0MHz, transition Width: 200.0kHz Number of stages: 5 Stage1: FIR Decimator, M = 2 (48.0MHz to 24.0MHz), FIR Length = 7 Stage2: FIR Decimator, M = 2 (24.0MHz to 12.0MHz), FIR Length = 7 Stage3: FIR Decimator, M = 2 (12.0MHz to 6.0MHz), FIR Length = 11 Stage4: FIR Decimator, M = 2 (6.0MHz to 3.0MHz), FIR Length = 15 Stage5: FIR Decimator, M = 3 (3.0MHz to 1.0MHz), FIR Length = 79
Спроектируйте одноступенчатый decimator использование тех же параметров.
singleDecim = designMultistageDecimator(M,Fs,TW,Astop,'NumStages',1);
disp(cascadeInfoSummary(singleDecim))
Multistage FIR Decimator, M=48 (48.0MHz to 1.0MHz) Equivalent lowpass cutoff: 1.0MHz, transition Width: 100.0kHz Number of stages: 1 Stage1: FIR Decimator, M = 48 (48.0MHz to 1.0MHz), FIR Length = 2411
Сравните затраты фильтра для одноступенчатого и многоступенчатых реализаций. Количество умножения на входную выборку для многоступенчатого подхода - приблизительно 7 и примерно 49 для одноступенчатой реализации. Другими словами, использование многоступенчатой реализации сокращает количество умножения на коэффициент 7, который имеет значительное значение. Подобные различия могут наблюдаться в количестве coefficints (89 v.s. 2361), количество состояний (146 v.s. 2400), и сложения на входную выборку (6 v.s. 49).
costMultiDecim = cost(multiDecim) costSingleDecim = cost(singleDecim)
costMultiDecim =
struct with fields:
NumCoefficients: 89
NumStates: 146
MultiplicationsPerInputSample: 6.6042
AdditionsPerInputSample: 5.6667
costSingleDecim =
struct with fields:
NumCoefficients: 2361
NumStates: 2400
MultiplicationsPerInputSample: 49.1875
AdditionsPerInputSample: 49.1667
Сравните частотные характеристики одноступенчатой реализации и одноступенчатых эквивалентов двух многоступенчатых проектов. Ответы усиления этих трех реализаций очень похожи на полосе пропускания и полосе перехода, и имеют незначительные различия на полосе задерживания. Несмотря на значительную разницу в стоимости, lowpass, просачивающийся все три проекта, является почти тем же самым.
hfv = fvtool(multiDecim, multiDecim_default, singleDecim); legend(hfv, 'Multistage (Custom Parameters)','Multistage (Default parameters)','Single stage')

Оформление по умолчанию имеет немного большую ширину перехода.
hfv = fvtool(multiDecim, multiDecim_default, singleDecim); legend(hfv, 'Multistage (Custom Parameters)','Multistage (Default parameters)','Single stage') xlim([0 0.8])

По умолчанию проект минимизирует умножение на входную выборку. Также возможно минимизировать количество коэффициентов. Установите свойство MinTotalCoeffs = true использовать последнюю стоимость.
minCoeffDecim = designMultistageDecimator(M,Fs,TW,Astop,'MinTotalCoeffs',true);
disp(cascadeInfoSummary(minCoeffDecim))
cost(minCoeffDecim)
Multistage FIR Decimator, M=48 (48.0MHz to 1.0MHz)
Equivalent lowpass cutoff: 1.0MHz, transition Width: 100.0kHz
Number of stages: 5
Stage1: FIR Decimator, M = 2 (48.0MHz to 24.0MHz), FIR Length = 7
Stage2: FIR Decimator, M = 3 (24.0MHz to 8.0MHz), FIR Length = 17
Stage3: FIR Decimator, M = 2 (8.0MHz to 4.0MHz), FIR Length = 11
Stage4: FIR Decimator, M = 2 (4.0MHz to 2.0MHz), FIR Length = 23
Stage5: FIR Decimator, M = 2 (2.0MHz to 1.0MHz), FIR Length = 95
ans =
struct with fields:
NumCoefficients: 87
NumStates: 147
MultiplicationsPerInputSample: 6.8125
AdditionsPerInputSample: 6
По сравнению с multiDecim, количество коэффициентов в minCoeffDecim ниже, но количество умножения на входную выборку выше.
Целевая функция оптимального проекта (или количество коэффициентов или умножение), что использование функции designMultistageDecimator зависит от КИХ-длины каждого этапа. По умолчанию эта функция оценивает стоимость с помощью оценки КИХ-длины, а не истинной длины, иногда ведя к субоптимальному созданию фильтра.
Более медленный, но более точный метод использует стоимость на основе истинных КИХ-длин, полученных через фактические проекты всех кандидатов фильтра. Используйте свойство CostMethod='design' оптимизировать для точной стоимости. Установка этого свойства гарантирует, что стоимость проекта действительно минимальна.
trueMinCostDecim = designMultistageDecimator(M,Fs,TW,Astop, 'CostMethod','design'); disp(cascadeInfoSummary(trueMinCostDecim))
Multistage FIR Decimator, M=48 (48.0MHz to 1.0MHz) Equivalent lowpass cutoff: 1.0MHz, transition Width: 100.0kHz Number of stages: 5 Stage1: FIR Decimator, M = 2 (48.0MHz to 24.0MHz), FIR Length = 7 Stage2: FIR Decimator, M = 2 (24.0MHz to 12.0MHz), FIR Length = 7 Stage3: FIR Decimator, M = 3 (12.0MHz to 4.0MHz), FIR Length = 21 Stage4: FIR Decimator, M = 2 (4.0MHz to 2.0MHz), FIR Length = 23 Stage5: FIR Decimator, M = 2 (2.0MHz to 1.0MHz), FIR Length = 95
Ориентировочная стоимость выполняет очень хорошо во многих случаях (как она делает в этом примере).
cost(trueMinCostDecim) hfv = fvtool(minCoeffDecim,trueMinCostDecim); legend(hfv, 'Optimize for Estimated FIR Lengths', 'Optimize for True FIR Lengths')
ans =
struct with fields:
NumCoefficients: 87
NumStates: 146
MultiplicationsPerInputSample: 6.5625
AdditionsPerInputSample: 5.6667

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);

Отношения преобразования как
(используемый в предыдущем разделе) требуют, чтобы большое сверхдискретизировало и проредило отношения, как даже его уменьшаемая форма
. Фильтры, требуемые для такого преобразования, довольно длинны, вводя значительную задержку в дополнение к памяти и вычислительной загрузке.
cost(src)
ans =
struct with fields:
NumCoefficients: 8587
NumStates: 58
MultiplicationsPerInputSample: 53.6688
AdditionsPerInputSample: 52.7500
Мы можем смягчить дорогостоящее преобразование путем аппроксимации коэффициента преобразования уровня. Например,

Отклонение 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
[1] Оппенхейм, A.V., и Р.В. Шафер, обработка сигналов дискретного времени, Prentice Hall, 1989.