xxxxxxxxxx
139
let ft = [];
let sig = [];
let sig_x = [];
let sig_y = [];
let wave = [];
let t = 0;
let data, X, Y;
function setup() {
createCanvas(600, 500);
// frameRate(30);
// angleMode(DEGREES);
// sig = JSON.parse('imgdata.json');
skip = 7;
console.log(typeof sig);
for (let i = 0; i < sig.length; i+= skip) {
sig_x[i] = sig[i][0];
sig_y[i] = sig[i][1];
}
ft_x = dft(sig_x);
ft_y = dft(sig_y);
ft_x.sort((a, b) => b.amp - a.amp);
ft_y.sort((a, b) => b.amp - a.amp);
}
function draw() {
background(70);
// text(frameRate(), 10, 10);
X = epicycle(400, 100, ft_x, PI);
Y = epicycle(100, 330, ft_y, PI + HALF_PI);
data = { x: X.x, y: Y.y };
wave.unshift(data);
// translate(0, 0);
line(Y.x, Y.y, data.x, data.y);
line(X.x, X.y, data.x, data.y);
fill(220);
ellipse(data.x, data.y, 5);
noFill();
stroke(220);
strokeWeight(1.8);
beginShape();
for (let i = 0; i < wave.length; i++) {
vertex(wave[i].x, wave[i].y);
}
endShape();
strokeWeight(1);
if (wave.length > 450) {
wave.pop();
}
const dt = TWO_PI / ft_x.length;
// console.log(dt);
t += dt;
// if(frameCount == 30) {
// noLoop();
// }
}
function dft(x) {
let N = x.length;
let X = [];
for (let k = 0; k < N; k++) {
let re = 0;
let im = 0;
for (let n = 0; n < N; n++) {
let angle = (TWO_PI * k * n) / N;
re += x[n] * cos(angle);
im -= x[n] * sin(angle);
}
re = re / N;
im = im / N;
let amp = sqrt(re ** 2 + im ** 2);
let phase = atan2(im, re);
let fr = k;
X[k] = { re, im, fr, amp, phase };
}
return X;
}
function epicycle(x_loc, y_loc, dftsig, rot = 0) {
stroke(220, 140);
let x = x_loc;
let y = y_loc;
for (let k = 0; k < dftsig.length; k++) {
xold = x;
yold = y;
let r = dftsig[k].amp;
let phi = dftsig[k].phase;
let fr = dftsig[k].fr;
x += r * cos(fr * t + phi + rot);
y += r * sin(fr * t + phi + rot);
fill(220);
ellipse(x, y, r / 10);
line(xold, yold, x, y);
noFill();
ellipse(xold, yold, 2 * r);
}
return { x, y };
}
function generateSignal() {
for (let i = 0; i < 150; i++) {
tta = i * TWO_PI / 150;
sig_x[i] = 8 * 16 * sin(tta) ** 3;
sig_y[i] =
8 * (13 * cos(tta) - 4 * cos(2 * tta) - 2 * cos(3 * tta) - cos(4 * tta));
}
for (let i = 150; i < 300; i++) {
tta = i * TWO_PI / 150;
sig_x[i] = 7 * 16 * sin(tta) ** 3;
sig_y[i] =
8 * (13 * cos(tta) - 4 * cos(2 * tta) - 2 * cos(3 * tta) - cos(4 * tta));
}
for (let i = 300; i < 450; i++) {
tta = i * TWO_PI / 150;
sig_x[i] = 7 * 16 * sin(tta) ** 3;
sig_y[i] =
6 * (13 * cos(tta) - 4 * cos(2 * tta) - 2 * cos(3 * tta) - cos(4 * tta));
}
}