このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
多くの系统对象には対応するMATLAB®関数があります。単純な1回のみの計算にはMATLAB関数を使用します。一方,多くのコンポーネントをもつシステムを設計およびシミュレーションする場合は系统对象を使用します。また,計算で内部状態を管理する必要がある場合,入力が時間とともに変化する場合または大量のデータストリームを処理する場合にも系统对象が適しています。
MATLAB関数のみを使用してさまざまな実行フェーズや内部状態をもつ動的システムを作成するには,複雑なプログラミングが必要となります。システムの初期化,データの検証,内部状態の管理,システムのリセットと終了のためのコードが必要です。系统对象はこれらの管理的な処理の多くを実行時に自動的に行います。プログラムで系统对象と他のMATLAB関数を組み合わせて使用することで,コードを合理化し,効率性を向上できます。
この例では,オーディオデータを読み取るためにMATLAB関数のみを使用したコードを作成する方法を説明します。
このコードでは,ファイルからオーディオデータを読み取り,フィルターを適用し,フィルター処理されたオーディオデータを再生します。オーディオデータはフレーム単位で読み取られます。このコードの結果は次の例の系统对象のコードと同じになり,両方の方法を比較することができます。
ソースのオーディオファイルを指定します。
帧=“speech_dft_8kHz.wav”;
ソースファイルからサンプルの合計数とサンプリングレートを取得します。
audioInfo = audioInfo(帧);maxSamples = audioInfo.TotalSamples;fs = audioInfo.SampleRate;
使用するフィルターを定義します。
b = fir1(160 .15点);
フィルターの状態を初期化します。
z = 0(1,元素个数(b) (1);
一度に処理するオーディオデータの量を定義し,虽然ループのインデックスを初期化します。
frameSize = 1024;nIdx = 1;
オーディオデータを処理する虽然ループを定義します。
while nIdx <= maxSamples(1)-frameSize+1 audio = audioread(fname,[nIdx nIdx+frameSize-1]); / /输出[y, z] =过滤器(b, 1,音频,z);声音(y, fs);nIdx = nIdx + frameSize;结束
このループでは明示的なインデックスと状態管理を使用していますが,これは面倒で間違いを起こしやすいアプローチです。サイズやデータ型などの状態について詳しく知っていなければなりません。また,このMATLABのみを使用したコードにおけるもう1つの問題として,関数声はリアルタイムで実行するように設計されていないという点が挙げられます。結果のオーディオは途切れ途切れになり,ほとんど聞き取れません。
この例では,オーディオデータを読み取るための系统对象コードを記述する方法を示します。
コードではDSP系统工具箱™ソフトウェアの系统对象を使用してファイルからオーディオデータを読み取り,フィルターを適用したうえで,フィルター処理されたオーディオデータを再生します。このコードの結果は前述のMATLABコードと同じになり,両方の方法を比較することができます。
ソースのオーディオファイルを指定します。
帧=“speech_dft_8kHz.wav”;
ファイルを読み取る系统对象™を定義します。
audioIn = dsp。AudioFileReader(帧,“OutputDataType”,“单一”);
データをフィルター処理する系统对象を定義します。
filtLP = dsp。FIRFilter (“分子”fir1(160 .15点));
フィルター処理されたオーディオデータを再生する系统对象を定義します。
audioOut = audioDeviceWriter (“SampleRate”, audioIn.SampleRate);
オーディオデータを処理する虽然ループを定義します。
而~isDone(audioIn)音频= audioIn();%读取音频源文件y = filtLP(音频);%过滤数据audioOut (y);播放过滤后的数据结束
この系统对象コードはMATLABのみを使用したコードでの問題を回避します。明示的なインデックスが必要ないため,ファイルリーダーオブジェクトでデータフレームのサイズが管理され,状態はフィルターによって管理されます。オーディオデバイスライターオブジェクトは各オーディオフレームが処理され次第,その再生を行います。