jsdoでAM変調、復調
概要
jsdoでAM変調、復調やってみた。
復調は、IQ復調。
写真
実際
サンプルコード
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function lpf(input, samplerate, freq) {
var q = 1.0;
var omega = 2.0 * 3.14159265 * freq / samplerate;
var alpha = Math.sin(omega) / (2.0 * q);
var a0 = 1.0 + alpha;
var a1 = -2.0 * Math.cos(omega);
var a2 = 1.0 - alpha;
var b0 = (1.0 - Math.cos(omega)) / 2.0;
var b1 = 1.0 - Math.cos(omega);
var b2 = (1.0 - Math.cos(omega)) / 2.0;
var output = new Float32Array(1000);
var size = 1000;
var in1 = 0;
var in2 = 0;
var out1 = 0;
var out2 = 0;
for (var i = 0; i < size; i++)
{
output[i] = b0 / a0 * input[i] + b1 / a0 * in1 + b2 / a0 * in2 - a1 / a0 * out1 - a2 / a0 * out2;
in2 = in1;
in1 = input[i];
out2 = out1;
out1 = output[i];
}
return output;
}
function draw(data, n) {
var hcenter = n * 150 + 100;
ctx.strokeStyle = "#0f0";
ctx.lineWidth = 2;
ctx.moveTo(0, hcenter);
for (var i = 1; i < canvas.width; i++)
{
ctx.lineTo(i, data[i] * 15 + hcenter);
}
ctx.stroke();
}
function make() {
var t;
var src = new Float32Array(1000);
var am = new Float32Array(1000);
var I = new Float32Array(1000);
var Q = new Float32Array(1000);
var I2;
var Q2;
var o = new Float32Array(1000);
for (t = 0; t < 1000; t++)
{
src[t] = Math.sin(t / 8000 * 2 * Math.PI * 220) * 2 - 1;
}
draw(src, 0);
for (t = 0; t < 1000; t++)
{
am[t] = (0.6 * Math.sin(t / 8000 * 2 * Math.PI * 220) + 1.0) * Math.sin(t / 8000 * 2 * Math.PI * 3000) * 2 - 1;
}
draw(am, 1);
for (t = 0; t < 1000; t++)
{
I[t] = am[t] * Math.cos(t / 8000 * 2 * Math.PI * 2800);
Q[t] = am[t] * Math.sin(t / 8000 * 2 * Math.PI * 2800);
}
I2 = lpf(I, 8000, 300);
Q2 = lpf(Q, 8000, 300);
for (t = 0; t < 1000; t++)
{
o[t] = Math.sqrt(I2[t] * I2[t] + Q2[t] * Q2[t]) * 4 - 6;
}
draw(o, 2);
}
make();
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function lpf(input, samplerate, freq) {
var q = 1.0;
var omega = 2.0 * 3.14159265 * freq / samplerate;
var alpha = Math.sin(omega) / (2.0 * q);
var a0 = 1.0 + alpha;
var a1 = -2.0 * Math.cos(omega);
var a2 = 1.0 - alpha;
var b0 = (1.0 - Math.cos(omega)) / 2.0;
var b1 = 1.0 - Math.cos(omega);
var b2 = (1.0 - Math.cos(omega)) / 2.0;
var output = new Float32Array(1000);
var size = 1000;
var in1 = 0;
var in2 = 0;
var out1 = 0;
var out2 = 0;
for (var i = 0; i < size; i++)
{
output[i] = b0 / a0 * input[i] + b1 / a0 * in1 + b2 / a0 * in2 - a1 / a0 * out1 - a2 / a0 * out2;
in2 = in1;
in1 = input[i];
out2 = out1;
out1 = output[i];
}
return output;
}
function draw(data, n) {
var hcenter = n * 150 + 100;
ctx.strokeStyle = "#0f0";
ctx.lineWidth = 2;
ctx.moveTo(0, hcenter);
for (var i = 1; i < canvas.width; i++)
{
ctx.lineTo(i, data[i] * 15 + hcenter);
}
ctx.stroke();
}
function make() {
var t;
var src = new Float32Array(1000);
var am = new Float32Array(1000);
var I = new Float32Array(1000);
var Q = new Float32Array(1000);
var I2;
var Q2;
var o = new Float32Array(1000);
for (t = 0; t < 1000; t++)
{
src[t] = Math.sin(t / 8000 * 2 * Math.PI * 220) * 2 - 1;
}
draw(src, 0);
for (t = 0; t < 1000; t++)
{
am[t] = (0.6 * Math.sin(t / 8000 * 2 * Math.PI * 220) + 1.0) * Math.sin(t / 8000 * 2 * Math.PI * 3000) * 2 - 1;
}
draw(am, 1);
for (t = 0; t < 1000; t++)
{
I[t] = am[t] * Math.cos(t / 8000 * 2 * Math.PI * 2800);
Q[t] = am[t] * Math.sin(t / 8000 * 2 * Math.PI * 2800);
}
I2 = lpf(I, 8000, 300);
Q2 = lpf(Q, 8000, 300);
for (t = 0; t < 1000; t++)
{
o[t] = Math.sqrt(I2[t] * I2[t] + Q2[t] * Q2[t]) * 4 - 6;
}
draw(o, 2);
}
make();
Author And Source
この問題について(jsdoでAM変調、復調), 我々は、より多くの情報をここで見つけました https://qiita.com/ohisama@github/items/9e251842cca8d6a33362著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .