Main Content

System object と MATLAB 関数

System object と MATLAB 関数

多くの System object には対応する MATLAB® 関数があります。単純な 1 回のみの計算には MATLAB 関数を使用します。一方、多くのコンポーネントをもつシステムを設計およびシミュレーションする場合は System object を使用します。また、計算で内部状態を管理する必要がある場合、入力が時間とともに変化する場合または大量のデータ ストリームを処理する場合にも System object が適しています。

MATLAB 関数のみを使用してさまざまな実行フェーズや内部状態をもつ動的システムを作成するには、複雑なプログラミングが必要となります。システムの初期化、データの検証、内部状態の管理、システムのリセットと終了のためのコードが必要です。System object はこれらの管理的な処理の多くを実行時に自動的に行います。プログラムで System object と他の MATLAB 関数を組み合わせて使用することで、コードを合理化し、効率性を向上できます。

MATLAB 関数コードのみを使用したオーディオ データの処理

この例では、オーディオ データを読み取るために MATLAB 関数のみを使用したコードを作成する方法を説明します。

このコードでは、ファイルからオーディオ データを読み取り、フィルターを適用し、フィルター処理されたオーディオ データを再生します。オーディオ データはフレーム単位で読み取られます。このコードの結果は次の例の System object のコードと同じになり、両方の方法を比較することができます。

ソースのオーディオ ファイルを指定します。

fname = 'speech_dft_8kHz.wav';

ソース ファイルからサンプルの合計数とサンプリング レートを取得します。

audioInfo = audioinfo(fname);
maxSamples = audioInfo.TotalSamples;
fs = audioInfo.SampleRate;

使用するフィルターを定義します。

b = fir1(160,.15);

フィルターの状態を初期化します。

z = zeros(1,numel(b)-1);

一度に処理するオーディオ データの量を定義し、while ループのインデックスを初期化します。

frameSize = 1024;
nIdx = 1;

オーディオ データを処理する while ループを定義します。

while nIdx <= maxSamples(1)-frameSize+1
    audio = audioread(fname,[nIdx nIdx+frameSize-1]);
    [y,z] = filter(b,1,audio,z);
    sound(y,fs);
    nIdx = nIdx+frameSize;
end  

このループでは明示的なインデックスと状態管理を使用していますが、これは面倒で間違いを起こしやすいアプローチです。サイズやデータ型などの状態について詳しく知っていなければなりません。また、この MATLAB のみを使用したコードにおけるもう 1 つの問題として、関数 sound はリアルタイムで実行するように設計されていないという点が挙げられます。結果のオーディオは途切れ途切れになり、ほとんど聞き取れません。

System object を使用したオーディオ データの処理

この例では、オーディオ データを読み取るための System object コードを記述する方法を示します。

コードでは DSP System Toolbox™ ソフトウェアの System object を使用してファイルからオーディオ データを読み取り、フィルターを適用したうえで、フィルター処理されたオーディオ データを再生します。このコードの結果は前述の MATLAB コードと同じになり、両方の方法を比較することができます。

ソースのオーディオ ファイルを指定します。

fname = "speech_dft_8kHz.wav";

ファイルを読み取る System object™ を定義します。

audioIn = dsp.AudioFileReader(fname,'OutputDataType','single');

データをフィルター処理する System object を定義します。

filtLP = dsp.FIRFilter('Numerator',fir1(160,.15));

フィルター処理されたオーディオ データを再生する System object を定義します。

audioOut = audioDeviceWriter('SampleRate',audioIn.SampleRate);

オーディオ データを処理する while ループを定義します。

while ~isDone(audioIn)
    audio = audioIn();    % Read audio source file
    y = filtLP(audio);   % Filter the data
    audioOut(y);         % Play the filtered data
end

この System object コードは MATLAB のみを使用したコードでの問題を回避します。明示的なインデックスが必要ないため、ファイル リーダー オブジェクトでデータ フレームのサイズが管理され、状態はフィルターによって管理されます。オーディオ デバイス ライター オブジェクトは各オーディオ フレームが処理され次第、その再生を行います。