整形三角波和锯齿波
Posted
技术标签:
【中文标题】整形三角波和锯齿波【英文标题】:shaping triangle and sawtooth wave 【发布时间】:2012-09-03 09:38:02 【问题描述】:我很难用开放图表绘制三角形和锯齿波形。公式来自the answer in this post。 这就是我对三角形的看法:
var myArray = [];
var myVals = [];
var mytrin = [];
ti = 2.0 * Math.PI * (880 / 44100);
theta = 0;
for(i = 0; i <500; i++)
myArray.push(i);
var ke = value = (1.0 - Math.abs(theta - 0.5) * 4);
mytrin.push(ke);
theta = theta + ti;
这是online demo。
锯齿也一样:
var myArray = [];
var myVals = [];
var mytrin = [];
ti = 2.0 * Math.PI * (880 / 44100);
theta = 0;
for(i = 0; i <1000; i++)
myArray.push(i);
var ke = theta*2-1;
mytrin.push(ke);
theta = theta + ti;
还有here's the demo。
有什么错误的想法吗?
【问题讨论】:
【参考方案1】:问题在于您使用ke
。你有这个:
(1.0 - Math.abs(theta - 0.5) * 4)
在 theta = 0 时,这将给出 -1。当 theta 达到 0.5 时,您会上升到 1,但随着 theta 从那里增加Math.abs(theta - 0.5)
将继续增加,因此 ke 将继续下降和下降。
您想要做的是使用一些模块化算术将其保持在一个界限范围内。
我玩过并修改为:
1-Math.abs((theta%4)-2);
http://jsfiddle.net/chrisvenus/tMHR8/
这样做是做一个模数,使值变为 0-4,然后是 0-4 并重复(一种锯齿)。减去 2 使其重复 -2 到 +2。取这个 abs 使它从 2 反弹到 0 到 2,然后减去 1 得到漂亮的 -1 到 1 三角波。
我的小提琴也减少了 i 以使图表更明显。 :)
编辑添加:
另一个问题的函数不起作用的原因是他在那里说他的pos
是一个从0到1的循环变量(尽管我觉得解释得不是很清楚)。
【讨论】:
您是否也知道如何减小锯齿波的范围?三角形很棒,我一直试图获得 -1 和 1 之间的范围,但无法弄清楚。感谢您的帮助! 感谢您澄清有关循环变量的问题,我没有注意到 如果你看看公式是如何工作的,它应该是显而易见的。对于锯齿,您将从 0 变为 4,因为您正在执行mod 4
。因此,mod 值是您要在输出中获得的范围。如果您希望范围为 2(-1 到 +1),那么只需将其更改为 mod 2
。然后减法只是将波移动到正确的垂直位置。因此,如果您有 0 到 2,那么您只需减去 1 即可得到您想要的。即(theta%2)-1
事实上,理论上你的原件可以通过使用以下行来修复:theta = (theta + ti)%1
分配 theta 时。然后他的论坛工作。您可能需要稍微减小ti
的大小,因为采样率会导致峰值随着时间的推移而降低,然后再次上升。不过效果还是蛮不错的。 ;-)以上是关于整形三角波和锯齿波的主要内容,如果未能解决你的问题,请参考以下文章