開発環境 |
メモ帳 |
実行環境 |
Internet Explorer 11 |
svgFourierSeries.html
<!doctype html>
<head>
<title>svgFourierSeries</title>
</head>
<body>
<svg id="svg" width=360 height=200 overflow="hidden"></svg><br>
<br>
<textarea id="ta" cols=80 rows=10></textarea>
<script>
const N = 9;
var svg;
main();
function f(x)
{
// return Math.sin(2 * Math.PI * x) / 2;
return (x < 0.5) ? 0.5 : -0.5;
}
function main()
{
svg = document.getElementById("svg");
var width = svg.getAttribute("width");
var height_2 = Math.floor(svg.getAttribute("height") / 2);
// 係数計算
var a = []; // フーリエ余弦係数
var b = []; // フーリエ正弦係数
for (var n = 0; n <= N; n++) {
a[n] = 0;
b[n] = 0;
}
var src = []; // 元の波形 source waveform
for (var i = 0; i < width; i++) {
var x = i / width;
var y = f(x);
for (var n = 0; n <= N; n++) {
var nx = n * (2 * Math.PI * x);
a[n] += y * Math.cos(nx);
b[n] += y * Math.sin(nx);
}
src.push(i + "," + Math.round(height_2 - y * height_2));
}
var str = "";
for (var n = 0; n <= N; n++) {
a[n] /= 180;
b[n] /= 180;
str += "a" + n + "=" + a[n].toFixed(3) + ", b" + n + "=" + b[n].toFixed(3) + "\n";
}
var ta = document.getElementById("ta");
ta.value = str;
// 波形の合成
var syn = []; // 合成波形 synthesized waveform
for (var i = 0; i < width; i++) {
var x = i / width;
var y = a[0] / 2;
for (var n = 1; n <= N; n++) {
var nx = n * (2 * Math.PI * x);
y += a[n] * Math.cos(nx) + b[n] * Math.sin(nx);
}
syn.push(i + "," + Math.round(height_2 - y * height_2));
}
// グラフ描画
append("line", {x1:0, y1:height_2, x2:width, y2:height_2, stroke:"#000"});
append("polyline", {points:src.join(" "), stroke:"#f00", fill:"none"});
append("polyline", {points:syn.join(" "), stroke:"#00f", fill:"none"});
}
function append(type, attr)
{
var e = document.createElementNS("http://www.w3.org/2000/svg", type);
for (var n in attr) {
e.setAttribute(n, attr[n]);
}
svg.appendChild(e);
}
</script>
</body>
最終更新:2014年11月15日 17:19