- 締切済み
MATLAB(再生している音の周波数をリアルタイムで変更したい)
MATLAB(R2008a)を利用しています。 sin関数で作成した正弦波をwavplay関数やaudioplayer・play関数で再生しているのですが、再生中に正弦波の周波数をキーボードからの入力にあわせて滑らかに変更したいと思っています。 どのような方法があるのでしょうか。 audioplayerで作った音をstopで一度とめて、違う周波数の正弦波をすぐにplayで再生しようと思っても間に少し空白の時間ができてしまって困っております。 お知恵いただけると助かります。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ICE_FALCON
- ベストアンサー率56% (63/111)
#1です。 > 周波数の変化はステップ的で構いません。現在、周波数変更時に一瞬起こる空白の時間をまずは消せればいいと思っております。 なるほど、じゃあ(1)だけが問題ですね。 #1でも書きましたが、mmioやwaveOut等をmexで作れば見た目はmatlab上だけで動いているように見えますよ。やったことないけど。 mexの例↓ http://www.edu.cs.kobe-u.ac.jp/~mori/Matlab/mexmemo.html mmio、waveOutの例↓ http://www.atelier-blue.com/memo/memo2006-4-22.htm どこまでmexにするかは個人の自由・・・。少なくともウインドウは要らないな・・。バッファの管理をmatlabでやれば、waveOut・・だけmex化でもOKかな?
- ICE_FALCON
- ベストアンサー率56% (63/111)
これはかなり難しいですね。 実現するには大きく分けて2つの項目を解決しなければいけません。 (1) MATLABには音声をリアルタイムに加工を施しつつ再生する関数が(私の知る限り)ありません。なので、mexを使って、mmio等をmatlab上で使えるようにしなければいけないですが、なかなか大変です。C言語とかなら簡単だけど・・・。 (2) 滑らかに変更するとはどの程度滑らかにですか? それなりにきれいに推移しようとすると、 ナイキストフィルタやワープフィルタを使わないといけません。 ある程度の専門知識が必要です。 500->1k->2k->4k[Hz]とか倍々に、滑らかではなくステップ的に変化させるのであれば簡単です。
補足
ご回答ありがとうございます。周波数の変化はステップ的で構いません。現在、周波数変更時に一瞬起こる空白の時間をまずは消せればいいと思っております。 Matlab上だけで実装できないとわかれば他の言語にデータをわたして実装する手段は考えているのですが、なんとかMatlabだけで実装できないものかと質問させていただいた次第でした。
お礼
これは、参考になります! ありがとうございます。 mexというのですね。知りませんでした。 ちなみに私は下記の方法を検討していました。 MATLABのコードをMATLAB Builder NEでコンパイルしてVB.NETで利用する。 MATLABとVB.NETでDDE通信またはファイルを介してデータを通信する。