Simulinkでサンプルレート変換をしようとして引っかかったので記録しておきます。
ファイルからの入力をSRCにかけるときには、SRCのブロックサイズに合わせてファイル入力のブロックサイズを変更しなければなりません。これは”Frome Multimedia File”ブロックのプロパティで変更します。
経緯
最初に作ったSimulinkモデルは以下のようなものです。これはCDからリッピングしたMP4ファイル(金馬師匠の『目黒のさんま』)を読み込み、44.1kHzから48kHzにサンプルレート変換してファイルに書き出すものです。
恐ろしいことに、こんな簡単なモデルでもエラーが出ます。
SRCの入力データを147の倍数個にしなさいと書いてあります。ちなみに、このとき、モデルの状態が変わっています。
SRCの入力データのブロック・サイズが表示されています。デフォルトの1024はもちろん147の整数倍ではありません。エラー表示として抜群の方法ですね。毎度のことですがMATLAB/Simulinkには舌を巻きます。
さて、長さを予測できないファイルからのデータのブロック化について検索したのですが、これというものがありません。普遍的な処理なのでみんなはまっているはずですが…。というのは私の勘違いでした。この問題の修正に追加ブロックは必要ありません。
問題を解決するには、From Multimedia Fileブロックのプロパティを開き、「オーディオチャンネル当たりのサンプル数」を147の倍数にしてやれば済みます。
今度は実行時エラーは出ません。出力されたファイルのビットレートを見ると、1536kbpsになっており、これは16bit 2chの場合は48kHzサンプルになります。
まとめ
ファイル入力に対するサンプルレート変換でブロックサイズに関するエラーが出た時場合の対処を調べました。
この問題はファイルの『入力チャンネルあたりのサンプル数』をSRCのブロックサイズの整数倍に変更することで対処できます。問題が起きている結線には、Simulinkが現在のブロックサイズを表示しています。