Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

音声の LPC 解析と合成

この例では MATLAB® コマンド ラインで使用可能な DSP System Toolbox™ 機能を使用して、LPC (線形予測符号化) と呼ばれる音声圧縮手法を実装する方法を示します。

はじめに

この例では、音声信号の LPC を実装します。このプロセスは、解析と合成という 2 つの手順で構成されています。解析では信号から反射係数を抽出し、これを使用して残差信号を計算します。合成では残差信号と反射係数を使用して信号を復元します。残差信号と反射係数のコーディングに必要なビット数は、元の音声信号より少なくなります。

次の図は、この例で実装するシステムを示しています。

このシステムでは、まず音声信号を 1600 サンプルのオーバーラップを含む 3200 サンプル サイズのフレームに分割し、ハミング ウィンドウで乗算します。12 次の自己相関係数を計算し、レビンソン・ダービン アルゴリズムを使用して自己相関係数から反射係数を計算します。次に、元の音声信号を解析フィルターに渡します。このフィルターは、前のステップの反射係数と同じ係数をもつ全零フィルターです。このフィルターの出力が残差信号になります。最後に、この残差信号を、解析フィルターの逆変換である合成フィルターに通過させます。この合成フィルターの出力が元の信号になります。

初期化

フレーム サイズおよび FFT 長の定数を初期化し、System object をインスタンス化します。これらのオブジェクトは必要な変数またはテーブルも事前に計算するため、ループ内で以降の呼び出しを効率よく処理できます。

frameSize = 1600;
fftLen = 2048;

System object™ を作成してオーディオ ファイルから読み取り、オーディオ サンプル レートを特定します。

audioReader = dsp.AudioFileReader(SamplesPerFrame=frameSize, OutputDataType='double');

fileInfo = info(audioReader);
Fs = fileInfo.SampleRate;

プリエンファシスに使用する FIR デジタル フィルター System object を作成します。

preEmphasisFilter = dsp.FIRFilter(Numerator=[1 -0.95]);

バッファー System object を作成し、frameSize の 2 倍の長さで、frameSize のオーバーラップ長をもつ出力が得られるようにプロパティを設定します。

signalBuffer = dsp.AsyncBuffer(2*frameSize);

解析に使用する FIR デジタル フィルター System object と、シンセシスおよびディエンファシスに使用する 2 つの全極デジタル IIR フィルター System object を作成します。

analysisFilter = dsp.FIRFilter(...
                    Structure='Lattice MA',...
                    ReflectionCoefficientsSource='Input port');

synthesisFilter = dsp.AllpoleFilter(Structure='Lattice AR');

deEmphasisFilter = dsp.AllpoleFilter(Denominator=[1 -0.95]);

結果として出力された音声を再生する System object を作成します。

audioWriter = audioDeviceWriter(SampleRate=Fs);

% Setup plots for visualization.
scope = spectrumAnalyzer(SampleRate=Fs, ...
    PlotAsTwoSidedSpectrum=false, YLimits=[-140, 0], ...
    Title='Linear Prediction of Speech', ...
    ShowLegend=true, ChannelNames={'Signal', 'LPC'});

ストリーム処理ループ

System object を使用して入力オーディオ信号の LPC 解析と合成を実行する処理ループを呼び出します。

入力ファイルの末尾に達するとループは停止します。ファイルの末尾は AudioFileReader System object によって検出されます。

while ~isDone(audioReader)
    % Read audio input
    sig = audioReader();                         
    
    % Analysis
    % Note that the filter coefficients are passed in as an argument to the
    % analysisFilter System object.    
    sigpreem   = preEmphasisFilter(sig);        
    write(signalBuffer,sigpreem);
    sigbuf     = read(signalBuffer,2*frameSize, frameSize);
    hammingwin = hamming(2*frameSize);
    sigwin     = hammingwin.*sigbuf;

    % Autocorrelation sequence on [0:13]
    sigacf = xcorr(sigwin, 12, 'biased');
    sigacf = sigacf(13:end);
    
    % Compute the reflection coefficients from auto-correlation function
    % using the Levinson-Durbin recursion. The function outputs both
    % polynomial coefficients and reflection coefficients. The polynomial
    % coefficients are used to compute and plot the LPC spectrum.
    [sigA, ~, sigK] = levinson(sigacf); % Levinson-Durbin
    siglpc          = analysisFilter(sigpreem, sigK);

    % Synthesis
    synthesisFilter.ReflectionCoefficients = sigK.';
    sigsyn = synthesisFilter(siglpc);          
    sigout = deEmphasisFilter(sigsyn);         
    
    % Play output audio
    audioWriter(sigout);

    % Update plots
    sigA_padded = zeros(size(sigwin), like=sigA.'); % Zero-padded to plot
    sigA_padded(1:size(sigA.',1), :) = sigA.';
    scope([sigwin, sigA_padded]);
end

Release

System object に対して release メソッドを呼び出して、開いているファイルとデバイスを閉じます。

release(audioReader);
pause(10*audioReader.SamplesPerFrame/audioReader.SampleRate); % Wait until audio finishes playing
release(audioWriter);
release(scope);

まとめ

この例では、LPC を使用して音声圧縮技術を実装する方法を示しました。この実装では、MATLAB コマンド ラインから使用できる DSP System Toolbox 機能を使用しました。この例で必要だったのは、適切な入力引数を使用して System object を呼び出すことのみでした。エラーが生じやすい手動の状態追跡が必要とされることは一切ありませんでした。