正弦波/余弦波の生成

1.概要

Node-REDで正弦波/余弦波の生成方法を説明します。正弦波はy=A・sin(ωt – φ)の数式で表現される関数です。同様に余弦波は y=A・cos(ωt – φ)の数式で表現される関数です。Aは振幅、ωは角周波数、-φは初期位相(t=0の時の位相)と言います。また、余弦波と正弦波の関係は、cos(x) = sin(x + π/2)であらわされ、π/2位相がずれた関係にあります。
また、角周波数ω = 2π・f であらわされます。fは周波数です。したがって、正弦波は、y=A・sin(2π・f – φ) = A・cos(2π・f – π/2 –φ)となります。
ここでは、正弦波/余弦波をNode-REDのフローとして出力します。

2.Node-REDのフロー

Node-REDのフローで正弦波・余弦波を生成するにあたり、変数を下記の様に設定します。これらの変数はflow変数として設定します。そして、計算スタート時に初期値を設定されます。

2.1. Node-REDフローの全体

上側の正弦波・余弦波計算部と下側のチャート表示部に分かれます。それらは、link outノードとlink inノードで接続されています。

2-2.正弦波・余弦波の生成

構成は、乱数の生成と同様に、funtionノードとdelayノードを使って、一定の時間ごとに計算点をインクリメントして正弦波・余弦波の計算を行います。
異なる点は、delayノードの遅延値を”msg.delay”で与えるようにしている点です。注意事項は、msg.delayの単位がmsということです。

var amp = flow.get("amplitude");
var frequency = flow.get("frequency");
var samplingFreq = flow.get("samplingFreq");
var ip = flow.get("initialPhase");
var n = flow.get("sampling");
var sp = frequency / samplingFreq;  // sampling point
var t = 1 / samplingFreq;  // for delay node
var pai = 3.14159265359

// calculate sin and cos value
var sin_val = amp * Math.sin(2 * pai * n / sp + ip);
var cos_val = amp * Math.cos(2 * pai * n / sp + ip);

flow.set("sampling", n + 1);  // increment point

// prepare return value
msg.payload ={"sin":sin_val, "cos":cos_val};
msg.delay = t * 1000;
return msg;

2-3.正弦波・余弦波のチャート生成

チャートでグラフにする方法は特に新しい点はありません。msg.payload.sin, msg.payload.cosで送られてきた計算結果をmsg.payloadに移してチャート表示させます。