ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

2 チャネル フィルター バンクによる再構成

この例では、完全再構成 2 チャネル フィルター バンクの設計法を示します。これは、電力相補フィルターを使用するので直交ミラー フィルター (QMF) バンクとも呼ばれます。

しばしばデジタル信号処理において、低周波数帯域および高周波数帯域に信号を分解する必要性、その次にオリジナルの信号を再構成するために組み合わせる必要性が生じます。そのような例は、サブバンド コーディング (SBC) にあります。

この例では、まずクロネッカー デルタで構成される信号をフィルター処理して、完全再構成のプロセスをシミュレーションします。完全なシステムの伝達関数の振幅スペクトルに加え、入力信号、出力信号およびエラー信号のプロットが提供されます。このフィルター バンクを通じて完全再構成の効果が示されます。その後、アプリケーション例で、再構成にあまり影響を与えずにオーディオ ファイルの 2 つのサブバンドを異なる方法で処理する方法について説明します。

完全再構成

完全再構成は、信号がその低周波数と高周波数に分かれた後に完全に復元される過程です。以下は理想フィルターを使用する完全再構成プロセスのブロック線図です。完全な再構成プロセスには、4 つのフィルター、2 つのローパス フィルター (H0 と G0)、および 2 つのハイパス フィルター (H1 と G1) が必要です。さらに、2 つのローパス フィルター間と 2 つのハイパス フィルター間には、ダウンサンプラーとアップサンプラーが必要です。出力フィルターには前述のアップサンプラーを補うために 2 つのゲインが必要であることに注意してください。

完全再構成 2 チャネル フィルター バンク

DSP System Toolbox™ には、上記で説明した FIR 完全再構成 2 チャネル フィルター バンクを実行するために必要な 4 つのフィルターを設計するために、FIRPR2CHFB と呼ばれる特殊な関数が用意されています。FIRPR2CHFB は、2 チャネル完全再構成 フィルター バンクの解析 (H0 と H1) および合成 (G0 と G1) セクション用に 4 つの FIR フィルター を設計します。設計は、完全再構成を実現するために必要な、いわゆる直交フィルター バンク (電力対称フィルター バンクとも呼ばれる) に対応します。

フィルター バンクを次数 99 のフィルター、およびローパス フィルター (0.45) とハイパス フィルター (0.55) の通過帯域エッジを使用して設計してみましょう。

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

次に、これらのフィルターの振幅応答をプロットします。

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

解析パスは、フィルターとそれに続く間引きのダウンサンプラーで構成されます。合成パスは、アップサンプラーとそれに続く内挿のフィルターで構成されます。DSP System Toolbox™ ではこれを実装するために 2 つの System object が提供されています。解析用の dsp.SubbandAnalysisFilter と合成セクション用の dsp.SubbandSynthesisFilter です。

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

この例では、p[n] は信号を表しています。

信号 x[n] は以下のように定義されるようにします。

メモ:MATLAB は 1 ベースのインデックスを使用するので、n=1 の場合 delta[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;
hSource = dsp.SignalSource('SignalEndAction', 'Cyclic repetition',...
                           'SamplesPerFrame', 50);
hSource.Signal = x;

シミュレーション結果を表示するには 3 つのスコープが必要です。入力信号を再構成された出力と比較するスコープ、両者間の誤差を測定するスコープおよびシステム全体の振幅応答をプロットするスコープです。

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

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

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

完全再構成のシミュレーション

次に、入力信号をサブバンド フィルターに渡し、出力を再構成します。結果は作成したスコープにプロットされます。

for i=1:100
    input = step(hSource);

    [hi, lo] = step(hAnalysis, input);  % Analysis
    reconstructed = step(hSynthesis, hi, lo);    % Synthesis

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

    % Plot error between signals
    err = step(hError, input(2:end) - reconstructed(1:end-1));
    step(hErrorPlot, err);

    % Estimate transfer function of cascade
    Txy = step(hTFEstimate, input(2:end), reconstructed(1:end-1));
    step(hTFResponse, 20*log10(abs(Txy)));
end

完全再構成の出力分析

最初の 2 つのプロットから、完全再構成 2 チャネル フィルター バンクによって元の信号 x[n] が完全に再構成されたことがわかります。初期の誤差はフィルターの遅延によるものです。3 番目のプロットは、サブバンド フィルターのカスケードによって信号の周波数特性が変更されないことを示しています。

サブバンド フィルターのアプリケーション - オーディオ処理

サブバンド フィルターでは、信号内の高周波数を低周波数とは異なる方法で処理できます。例として、オーディオ ファイルを読み込み、低周波数を高周波数の語長よりも大きい語長で量子化します。再構成は上記の例ほど完璧ではないかもしれませんが、妥当な範囲で正確なものとなります。

メモ: これには Fixed-Point Designer のライセンスが必要です。

まず、オーディオ ファイルの読み込みと再生のための System object を作成します。

hAudioInput = dsp.AudioFileReader;
hAudioPlayer = dsp.AudioPlayer('SampleRate',hAudioInput.SampleRate, ...
                               'QueueDuration', 1);

測定基準として、元のオーディオ ファイルを 1 回再生します。

while ~isDone(hAudioInput)
    input = step(hAudioInput);  % Load a frame
    step(hAudioPlayer, input);  % Play the frame
end
pause(hAudioPlayer.QueueDuration);  % Wait until audio is played to the end
reset(hAudioInput);         % Reset to beginning of the file
release(hAudioInput);       % Close input file
release(hAudioPlayer);      % Close audio output device

次に、上記の完全再構成の例のサブバンド フィルターをリセットして、再利用できるようにします。プロットで release メソッドを呼び出して特定のプロパティを変更できるようにします。

reset(hAnalysis);
release(hAnalysis);     % Release to change input data size
reset(hSynthesis);
release(hSynthesis);    % Release to change input data size


release(hErrorPlot);    % Plot for error
hErrorPlot.SampleRate = hAudioInput.SampleRate/hAudioInput.SamplesPerFrame;
hErrorPlot.TimeSpan = 5.5;

clear hSignalCompare    % Do not need a plot to compare signals

reset(hTFEstimate);     % Transfer function estimate
release(hTFEstimate);
hTFEstimate.SampleRate = hAudioInput.SampleRate;

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

シミュレーション ループの最初の部分は、完全再構成の例とよく似ています。変更されている点は次のとおりです。

  1. 低周波数成分は 8 ビット、高周波数成分は 4 ビットの語長で量子化を実行。

  2. ユーザーに聞こえるように再構成されたオーディオが再生されます。入力オーディオ ファイルから変わっているところがないか、注意して聴いてください。dsp.SubbandSynthesisFilter オブジェクトでは同じ数値型の入力が必要なため、量子化されたサブバンドは double のコンテナーに保存されています。

while ~isDone(hAudioInput)
    input = step(hAudioInput);  % Load a frame of audio

    [hi, lo] = step(hAnalysis, 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 = step(hSynthesis, QuantizedHi, QuantizedLo); % Synthesis

    % Plot error between signals
    err = step(hError, input(2:end) - reconstructed(1:end-1));
    step(hErrorPlot, err);

    % Play the reconstructed audio frame
    step(hAudioPlayer, reconstructed);

    % Estimate transfer function of cascade
    Txy = step(hTFEstimate, input(2:end), reconstructed(1:end-1));
    step(hTFResponse, 20*log10(abs(Txy)));
end
pause(hAudioPlayer.QueueDuration);  % Wait until audio is played to the end
release(hAudioPlayer);      % Close audio output device
reset(hAudioInput);         % Reset to beginning of the file
release(hAudioInput);       % Close input file

誤差のプロットは、量子化のために再構成は完璧ではないことを示しています。また、前の例とは異なり、システム全体の伝達関数の推定も 0dB ではありません。ゲインは低周波数と高周波数で異なると見ることができます。しかし、再構成されたオーディオ信号の再生を聴いてみると、分解能の変化は人間の耳では聞き取れないことが分かったと思います。特に、語長がさらに小さい高周波数では変化を聞きとることはより困難です。

この情報は役に立ちましたか?