Simulinkで遊んだので備忘録として残しておきます。
下の図は、-1200Hzと12040Hzの二つの解析信号を周波数変換するSimulinkのモデルです。SimulinkにはSine波を連続生成するモデルが用意されていますが、サンプル周期の整数倍周期の波形しか作ることができません。そこで、好きに周波数を変更できるモデルを自分で作ってみました。
以下、思いつくままに引っかかったところやメモを。
freq_scaleは、Hz単位の周波数を以下の倍率でスケールします。
double(intmax('uint32'))/48000
前のエントリでふれたように、intmax()は整数型であり式全体の型が引きずられるのでdoubleに型変換しています。
accumulatorは加算器です。1サンプル遅れてフィードバックすることでaccumulatorとしています。加算器の出力を明示的にuint32と指定することで、値を0から2^32-1の範囲に強制しています。特に指定しない限り、Simulinkは値が溢れたら0にラップアラウンドします。このラップアラウンドを利用して、三角波を作っています。
scale_2piはuint32の値域を[0..2pi)にスケールしています。
analytic_oscは、SinCosモジュールです。このモジュールは非常に柔軟で、出力をいろいろに設定できます。ここでは複素数の値として出力しています。
二つの複素発振器の信号は乗算器で周波数変換されます。
最初は変な雑音に悩まされましたが、正しい使い方に落ち着くにつれて信号がきれいになりました。型をsingleにすると-150dBあたりにノイズフロアが現れます。元の12kHzはFs 48kHzの1/4ですのでガタガタですが、周波数混合して低い周波数に持ってくるときれいな正弦波になります。