整形三角波和锯齿波

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 的大小,因为采样率会导致峰值随着时间的推移而降低,然后再次上升。不过效果还是蛮不错的。 ;-)

以上是关于整形三角波和锯齿波的主要内容,如果未能解决你的问题,请参考以下文章

numpy绘制锯齿波和三角波

matlab 实现三角波倒锯齿波与锯齿波

如何将方波、三角波发生器电路进行改进,使之产生占空比可调的矩形波和锯齿波信号

SPWM

C语言波形实现三角波和正弦波

C语言波形实现三角波和正弦波