チュートリアル:高速フーリエ変換(FFT)の計算
ここの学習では、騒音が付加された1000Hzと3000Hzの正弦波を生成して、チェビシェフタイプIIフィルターを適用します。続いて高速フーリエ変換(FFT)とパワースペクトル密度を計算して、シミュレーション結果をベクトルスコープで表示します。さらにバッファーの出力をダウンサンプリングします。
このチュートリアルのファイル
filterPSD.scm
付加雑音を持つ正弦波を生成する
モデルを作成して、雑音が付加された正弦波のダイアグラムコンテキストを定義します。
- ribbonで、新規モデル、モデルを保存の順に選択します。
- 表示されたダイアログで、目的の作業ディレクトリへのパスと、ファイル名filterPSD_practice.scmを入力します。
-
Palette Browserで、以下のブロックをmodeling windowに追加します:
- Activate#menucascade-separatorSignalGeneratorsから、1つのSampleClockブロック、1つのRandomブロック、および2つのSinewaveGeneratorブロックをドラッグします。
- Activate#menucascade-separatorMathOperationsからSumブロックをドラッグします。
-
ブロックごとにダブルクリックし、以下のようにパラメータ値を入力してOKをクリックします。
- Sumブロックをダブルクリックして、入力数に3と入力して、すべての入力ポートを"+"に変更します。
ブロック パラメーターの設定 SampleClock Sample period: 1/Fs Random Distribution: Normal SineWaveGenerator (1) Frequency: 2*pi*1000 SineWaveGenerator (2) Frequency: 2*pi*3000 Sum - Number of inputs: 3
- For all Input Ports: "+"
- Sumブロックをダブルクリックして、入力数に3と入力して、すべての入力ポートを"+"に変更します。
-
ブロックを次の図のように接続してリンクを調整します。
- リボンでダイアグラムツールを選択します。
- コンテキスト(Context )タブでFs = 10000と入力して適用をクリックします。
チェビシェフタイプIIローパスフィルターの適用
ダイアグラムのコンテキストでCheby2というOML関数を適用します。Cheby2関数によって、ローパスフィルターの伝達関数の係数が生成されます。
- リボンでダイアグラムツールを選択します。
-
コンテキスト(Context )タブで次のコマンドを入力します:[num,den]=cheby2(3,20,2000/5000);
このコマンドはローパスフィルターの伝達関数の係数を生成します。このフィルターの次数は3、カットオフ周波数は2000Hz、ストップバンドでの減衰は20dBです。返される変数numとdenは、フィルターを表す離散伝達関数の分子と分母の係数として使用されます。
- Palette Browser#menucascade-separatorActivate#menucascade-separatorDynamicalからDiscrTransFuncブロックをダイアグラムにドラッグします。
-
DiscrTransFuncブロックをダブルクリックし、次のようにパラメーターに値を入力します。
-
雑音が付加された正弦波が、離散伝達関数によるデジタルローパスフィルターを通過するようにブロックを接続します:
FFTとパワースペクトル密度の計算
高速フーリエ変換とパワースペクトル密度を計算するために、モデルにブロックを定義します。
- Palette Browser#menucascade-separatorActivate#menucascade-separatorBuffersからBufferブロックをダイアグラムにドラッグします。
- Bufferブロックをダブルクリックします。ブロックダイアログで、バッファ長さ(Buffer length)にNと入力します。
- Palette Browser#menucascade-separatorActivate #menucascade-separatorMatrixOperationsからFFTブロックをダイアグラムにドラッグします。
-
これらのブロックを次のように接続します:
- リボンでダイアグラムツールを選択します。
-
コンテキストタブでN変数に1024を入力します
この変数は、1024個のデータポイントがサンプリングされてFFTブロックに送信されることを指定します。NoteColonSymbol 片側のパワースペクトル密度は次の式で計算されます: P= 2 ∗ |ff | ^ 2/(F∗N)
- Palette Browser#menucascade-separatorActivate#menucascade-separatorMathOperationsからAbsブロックとPowerブロックをダイアグラムにドラッグします。
- Powerブロックをダブルクリックします。ブロックダイアログで、指数(Power)に2と入力します。
- Palette Browser#menucascade-separatorActivate#menucascade-separatorMathOperationsからGainブロックをダイアグラムにドラッグします。
- Gainブロックをダブルクリックします。ブロックダイアログで、ゲイン(Gain)に2/ (Fs*N)と入力します。
-
これらのブロックを次のように接続します:
- Palette Browser#menucascade-separatorActivate #menucascade-separatorMatrixOperationsからMatrixExtractorブロックをダイアグラムにドラッグします。
-
MatrixExtractorブロックをダブルクリックし、次のパラメーター値を入力してOKをクリックします。
- インデックスベクトル Iで、: (すべて)(:(all))を選択(デフォルト設定)します。
- インデックスベクトル Jで、パラメーターとして定義(Defined as parameter)を選択して、[1:N/2+1]と入力します。
- インデックスを1から作成(One-based indexing)を選択します。
-
これらのブロックを次のように接続します:
-
クリック&マウスドラッグによる領域選択で、FFT、Abs、Power、Gainの各ブロックを選択します。
- リボンのスーパーブロックの作成(Create Super Block)をクリックします。
-
プロパティエディターのツリーで、一般の下の名前欄をクリックし、PSDと入力します。
スーパーブロックに新しい名前が反映されます:
VectorScopeブロックを使用した結果の表示
パワースペクトル密度グラフでシミュレーション結果を表示します。
-
Palette Browserで、次のブロックをダイアグラムに追加します。
- Activate#menucascade-separatorMatrixOperationsからTransposeブロックをドラッグします。
- Activate#menucascade-separatorSignalViewersからVectorScopeブロックをドラッグします。
- Activate#menucascade-separatorSignalGeneratorsからConstantブロックをドラッグします。
- Constantブロックをダブルクリックします。ブロックダイアログで、定数(Constant)パラメーターに[0:Fs/N:Fs/2]'と入力してOKをクリックします。
- VectorScopeブロックをダブルクリックします。ブロックダイアログで、外部X値(External X Value)とシミュレーション終了後に表示(Plot after simulation ends)の各チェックボックスをオンにしてOKをクリックします。
-
これらのブロックを次のように組み立てて接続します。
- リボンでRunを選択します。
-
VectorScopeブロックをダブルクリックします。
VectorScopeウィンドウが開いて、シミュレーション結果のプロットが表示されます。プロットのビューをウィンドウにフィッティングするにはマウスの中央ボタンをクリックします。
-
Y軸を右クリックします。フローティングパネルが表示されたら、Scaleドロップダウンリストからdb10を選択します。
次のようなパワースペクトル密度のグラフが表示されます。周波数1000Hzと3000Hzに2つのピークが見られます。チェビシェフローパスフィルターによって元の信号が減衰するため、3000Hzのピークの方が低くなります。
バッファーの出力のダウンサンプリング
バッファーのサンプリング頻度を低減します。
-
Palette Browser#menucascade-separatorActivate#menucascade-separatorActivationOperationsからReSampleClockブロックをダイアグラムにドラッグします。
Bufferブロックの二つのアクティベーション入力ポートは、10,000HzでSampleClockブロックによってトリガー(駆動)されます。このトリガーにより、10,000Hzで実行するようにブロック(FFTブロックとVectorScopeブロックを含む)にダウンストリームが強制されるため、不要な計算とスコープ生成が発生する可能性があります。ReSampleClockブロックの追加により、Bufferブロックは必要な場合にのみ出力を更新するようになります。
-
これらのブロックを次のように組み立てて接続します。
-
ReSampleClockブロックをダブルクリックします。表示されるブロックダイアログで、Down sampling factor にNと入力します。
このパラメーターを変更することにより、BufferブロックがNポイントをサンプリングしフルになれば、常に送信アクティベーションが実行されるようになります。
-
リボンでRunを選択します。
このシミュレーションの実行は以前の反復より短い時間で完了しますが、同じような結果が得られます: