Реконструкция через двухканальный набор фильтров

В этом примере показано, как спроектировать совершенную реконструкцию двухканальные наборы фильтров, также известные как Банки Квадратурного фильтра зеркала (QMF), поскольку они используют степень дополнительные фильтры.

Часто в цифровой обработке сигналов потребность возникает, чтобы разложить сигналы на низкую частоту и высокочастотные полосы, после который потребность быть объединенной, чтобы восстановить исходный сигнал. Такой пример найден в поддиапазоне, кодирующем (SBC).

Этот пример сначала симулирует совершенный процесс реконструкции путем фильтрации сигнала, составленного из Кронекеровых дельт. Графики входа, выхода и сигнала ошибки предоставлены, а также спектр величины передаточной функции полной системы. Эффективность совершенной реконструкции показывают через этот набор фильтров. После этого пример приложения показывает, как два поддиапазона звукового файла могут быть обработаны по-другому без большого эффекта на реконструкции.

Совершенная реконструкция

Совершенная реконструкция является процессом, которым сигнал полностью восстанавливается, будучи разделенным на его низкие частоты и высокие частоты. Ниже блок-схема совершенного процесса реконструкции, который использует идеальные фильтры. Совершенный процесс реконструкции требует четырех фильтров, двух фильтров lowpass (H0 и G0) и двух фильтров highpass (H1 и G1). Кроме того, это требует downsampler и upsampler между двумя lowpass и между двумя фильтрами highpass. Обратите внимание на то, что мы должны объяснить то, что наши выходные фильтры должны иметь усиление два, чтобы компенсировать предыдущий upsampler.

Совершенная реконструкция двухканальный набор фильтров

DSP System Toolbox™ обеспечивает специализированную функцию, вызванную FIRPR2CHFB, чтобы спроектировать четыре фильтра, требуемые реализовывать КИХ совершенная реконструкция двухканальный набор фильтров, аналогичный описанному выше. FIRPR2CHFB проектирует четыре КИХ-фильтра для анализа (H0 и H1) и синтез (G0 и G1) разделы двухканального совершенного набора фильтров реконструкции. Проект соответствует так называемым ортогональным наборам фильтров, также известным как симметричные степенью наборы фильтров, которые требуются для того, чтобы достигнуть совершенной реконструкции.

Давайте спроектируем набор фильтров с фильтрами порядка 99 и ребрами полосы пропускания lowpass и highpass фильтрами 0,45 и 0.55, соответственно:

N = 99;
[LPAnalysis, HPAnalysis, LPSynthsis, HPSynthesis] = firpr2chfb(N, 0.45);

Ответ величины этих фильтров построен ниже:

fvt = fvtool(LPAnalysis,1, HPAnalysis,1, LPSynthsis,1, HPSynthesis,1);
fvt.Color = [1,1,1];
legend(fvt,'Hlp Lowpass Decimator','Hhp Highpass Decimator',...
    'Glp Lowpass Interpolator','Ghp Highpass Interpolator');

Обратите внимание на то, что аналитический путь состоит из фильтра, сопровождаемого downsampler, который является decimator, и путь к синтезу состоит из upsampler, сопровождаемого фильтром, который является интерполятором. DSP System Toolbox™ обеспечивает два Системных объекта, чтобы реализовать это - dsp.SubbandAnalysisFilter для анализа и dsp.SubbandSynthesisFilter для раздела синтеза.

analysisFilter = dsp.SubbandAnalysisFilter(LPAnalysis, HPAnalysis);
                                                    % Analysis section
synthFilter = dsp.SubbandSynthesisFilter(LPSynthsis, HPSynthesis);
                                                    % Synthesis section

Ради примера позвольте p [n], обозначают сигнал

и позвольте сигналу x [n] быть заданным

ПРИМЕЧАНИЕ: Поскольку MATLAB® использует индексацию на основе одну, дельта [n] =1 когда n=1.

x = zeros(50,1);
x(1:3)   = 1; x(8:10)  = 2; x(16:18) = 3; x(24:26) = 4;
x(32:34) = 3; x(40:42) = 2; x(48:50) = 1;
sigsource = dsp.SignalSource('SignalEndAction', 'Cyclic repetition',...
                           'SamplesPerFrame', 50);
sigsource.Signal = x;

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

% Scope to compare input signal with reconstructed output
sigcompare = dsp.ArrayPlot('NumInputPorts', 2, 'ShowLegend', true,...
       'Title', 'Input (channel 1) and reconstructed (channel 2) signals');

% Scope to plot the RMS error between the input and reconstructed signals
errorPlot = dsp.TimeScope('Title', 'RMS Error', 'SampleRate', 1, ...
                           'TimeUnits', 'Seconds', 'YLimits', [-0.5 2],...
                           'TimeSpan', 100, ...
                           'TimeSpanOverrunAction','Scroll');

% To calculate the transfer function of the cascade of Analysis and
% Synthesis subband filters
tfestimate = dsp.TransferFunctionEstimator('FrequencyRange','centered',...
                                'SpectralAverages', 50);
% Scope to plot the magnitude response of the estimated transfer function
tfplot = dsp.ArrayPlot('PlotType','Line', ...
                         'YLabel', 'Frequency Response (dB)',...
                         'Title','Transfer function of complete system',...
                         'XOffset',-25, 'XLabel','Frequency (Hz)');

Симуляция совершенной реконструкции

Мы теперь передаем входной сигнал через фильтры поддиапазона и восстанавливаем выход. Результаты строят на созданных осциллографах.

for i = 1:100
    input = sigsource();

    [hi, lo] = analysisFilter(input);  % Analysis
    reconstructed = synthFilter(hi, lo);    % Synthesis

    % Compare signals. Delay input so that it aligns with the filtered
    % output. Delay is due to the filters.
    sigcompare(input(2:end), reconstructed(1:end-1));

    % Plot error between signals
    err = rms(input(2:end) - reconstructed(1:end-1));
    errorPlot(err);

    % Estimate transfer function of cascade
    Txy = tfestimate(input(2:end), reconstructed(1:end-1));
    tfplot(20*log10(abs(Txy)));
end
release(errorPlot);

Совершенная реконструкция Выходной анализ

Мы видим из первых двух графиков нашу совершенную реконструкцию, двухканальный набор фильтров полностью восстановил наш исходный сигнал x [n]. Начальная ошибка должна задержаться в фильтрах. Третий график показывает, что каскад фильтров поддиапазона не изменяет характеристики частоты сигнала.

Применение фильтров поддиапазона - обработка аудиоданных

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

Примечание: Это требует лицензии на Fixed-Point Designer

Во-первых, создайте Системный объект для загрузки и проигрывания звукового файла.

audioInput = dsp.AudioFileReader;
audioWriter = audioDeviceWriter('SampleRate',audioInput.SampleRate);

Чтобы иметь меру ссылки, мы можем проигрывать исходное аудио однажды

while ~isDone(audioInput)
    input = audioInput();  % Load a frame
    audioWriter(input);  % Play the frame
end
% Wait until audio is played to the end
pause(10*audioInput.SamplesPerFrame/audioInput.SampleRate);
reset(audioInput);         % Reset to beginning of the file
release(audioInput);       % Close input file
release(audioWriter);               % Close audio output device

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

hide(errorPlot)
hide(tfplot)

reset(analysisFilter);
release(analysisFilter);     % Release to change input data size
reset(synthFilter);
release(synthFilter);    % Release to change input data size

% Plot for error
errorPlot.SampleRate = audioInput.SampleRate/audioInput.SamplesPerFrame;
errorPlot.TimeSpan = 5.5;

clear sigcompare    % Do not need a plot to compare signals

reset(tfestimate);     % Transfer function estimate
release(tfestimate);

release(tfplot);   % Plot for transfer function estimate
tfplot.YLimits = [-20, 60];
tfplot.XOffset = -audioInput.SampleRate/2;
tfplot.SampleIncrement = ...
                    audioInput.SampleRate/audioInput.SamplesPerFrame;

Цикл симуляции очень похож на тот для совершенного примера реконструкции в начале. Изменения здесь:

  1. Квантование выполняется для низкочастотного компонента, чтобы иметь 8 битов и высокая частота, чтобы иметь 4 бита wordlength.

  2. Восстановленное аудио воспроизводится, чтобы позволить пользователю услышать его и заметить любые изменения от входного звукового файла. Обратите внимание на то, что квантованные поддиапазоны сохранены в double контейнер, потому что dsp.SubbandSynthesisFilter возразите нуждается в его входных параметрах, чтобы быть того же numerictype.

show(tfplot)
show(errorPlot)
while ~isDone(audioInput)
    input = audioInput();  % Load a frame of audio

    [hi, lo] = analysisFilter(input);  % Analysis

    QuantizedHi = double(fi(hi, 1, 4, 9));  % Quantize to 4 bits
    QuantizedLo = double(fi(lo, 1, 8, 8));  % Quantize to 8 bits

    reconstructed = synthFilter(QuantizedHi, QuantizedLo); % Synthesis

    % Plot error between signals
    err = rms(input(2:end) - reconstructed(1:end-1));
    errorPlot(err);

    % Play the reconstructed audio frame
    audioWriter(reconstructed);

    % Estimate transfer function of cascade
    Txy = tfestimate(input(2:end), reconstructed(1:end-1));
    tfplot(20*log10(abs(Txy)));
end
release(errorPlot);
% Wait until audio is played to the end
pause(10*audioInput.SamplesPerFrame/audioInput.SampleRate);
release(audioWriter);               % Close audio output device
reset(audioInput);         % Reset to beginning of the file
release(audioInput);       % Close input file

Когда диаграмма погрешностей показывает, реконструкция не совершенна из-за квантования. Кроме того, различающийся предыдущий случай, оценка передаточной функции полной системы также не 0dB. Усиление видно, чтобы отличаться для низких частот, чем для более высоких единиц. Однако при слушании воспроизведения для восстановленного звукового сигнала, вы заметили бы, что человеческое ухо не слишком заметно к изменению в разрешении, больше в случае высоких частот, где wordlength был еще меньшим.