В этом примере показано, как спроектировать совершенную реконструкцию двухканальные наборы фильтров, также известные как Банки Квадратурного фильтра зеркала (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;
Цикл симуляции очень похож на тот для совершенного примера реконструкции в начале. Изменения здесь:
Квантование выполняется для низкочастотного компонента, чтобы иметь 8 битов и высокая частота, чтобы иметь 4 бита wordlength.
Восстановленное аудио воспроизводится, чтобы позволить пользователю услышать его и заметить любые изменения от входного звукового файла. Обратите внимание на то, что квантованные поддиапазоны сохранены в 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 был четным меньший.