利用java实现正弦曲线的绘制_浏览器中绘制调幅AM曲线

调幅AM,就是一个正弦曲线的幅度是随一种规律变化,比如声音或图像,因此就把声音信息或图像信息通过这个固定频率的信号传输出去了。一般情况下,使用的固定频率比较高,比要传输的声音或图像信号高很多,这个固定频率被称为载频,而这个载频的幅度则随着要传输的信号而变化。调幅是无线发射经常使用的一种方式,比如广播电视,收音机就有一个频段称为AM,其实普通收音机除了特定的调频频段,其他频段都是使用调幅方式实现的,这是因为实现起来比较简单,成本低,可以满足大部分情况下的声音传输需要。而电视信号,不用机顶盒的那种普通电视传输,也基本上是用调幅方式来传输图像,但经过了一些附加处理。

如果直接看AM信号,比如传输声音或图像的AM信号,因为声音或图像幅度一直在变化,而且没有规律,就难以看清楚其特性,因此一般都是以一种有规律的信号来替代声音或视频信号对载频进行调幅,而使用的这个信号一般也是一个正弦波,不过是频率比载频频率低得多的正弦波,这就可以看清楚其幅度的变化了。

be35aaa8c0f6a5e3b6e6db37932f83f7.gif

从图中可以看出,整个图像就是一个正弦波形式,但其幅度不是固定的,而是以正弦波的规律在不断变化。

在前面的正弦波绘制函数基础上,加上一部分改变,就能达到这种效果:

function draw(ctx,t){

let y;

ctx.beginPath();

ctx.moveTo(0,h);

for(let x=0;x<canvas.width;x++){

y=h*Math.sin(k*(x+t))*Math.sin(15*k*x)/2;

ctx.lineTo(x,y+h);

}

context.stroke();

}

可以发现,真正修改的只是y坐标的计算部分,把过去的y=h*Math.sin(k*(x+t))/2加上了一个乘积项Math.sin(15*k*x),这部分表示一个固定的载频频率,其频率是幅度变化的15倍。只需要修改这一点就可以达到上面的效果。完整代码为:

<!DOCTYPE html>

<html lang="zh-Hans">

<head>

<meta charset="gb18030" />

<meta http-equiv="refresh" content="9999" />

<title>调幅波AM</title>

</head>

<body>

<canvas id="canvas" width="600" height="300"> 你使用的浏览器不支持需要的功能,请升级或更换!</canvas>

<script type="text/javascript">

const canvas = document.getElementById('canvas'),

context = canvas.getContext('2d'),

h=canvas.height/2,

k=4*Math.PI/canvas.width;

function draw(ctx,t){

let y;

ctx.beginPath();

ctx.moveTo(0,h);

for(let x=0;x<canvas.width;x++){

y=h*Math.sin(k*(x+t))*Math.sin(15*k*x)/2;

ctx.lineTo(x,y+h);

}

context.stroke();

}

window.οnlοad=function(){

context.lineWidth=2;

context.strokeStyle="#336699";

let step=0;

(function drawFrame() {

window.requestAnimationFrame(drawFrame);

context.clearRect(0,0,canvas.width,canvas.height);

draw(context,step);

step+=1;

if(step>canvas.width) step=0;

}());

};

</script>

</body>

</html>

把以上代码存为一个html文件,然后鼠标双击打开就可以看到上面的动画图像。当然,也可以修改其中使用的参数,不过为了动画比较可看,一些参数不能取得过大,比如载频频率,不然可能影响显示效果。

当然,也可以用这种方式显示两种不同频率正弦波的叠加,或其他一些图形,不过限于浏览器的计算绘制都需要一定时间,过于复杂的计算会影响动画效果,但静态曲线问题则不大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值