是否有产生三角波的单线函数?

wil*_*lc2 61 c

以类似的方式,模数生成锯齿波.它不必是连续的.

这就是我的意思:

int m = 10;
int x = 0;
int i = 0;
while (i < m*3) {
    printf("%d ", x);
    x++;
    x = x % m;
    i++;
}
Run Code Online (Sandbox Code Playgroud)

生成一个序列0..9,三次,如下所示:

锯齿波图

请注意,峰值右侧的斜率只是一个图形伪影

在这种情况下,单线是x = i ++%m


我想要的是这个:

三角波图

如果你知道其他波形的单线(正弦波,方波),那么也应该知道.

更新:每个人的答案都非常有用,我有一个后续问题.

将添加到三角波函数中以使线的斜率曲线变为或变为这样:

凸出的波形

谢谢大家,您的各种答案帮助我从更大的角度看问题.特别感谢Noldorin将方程扩展到二次曲线.

Nol*_*rin 90

三角波

y = abs((x++ % 6) - 3);
Run Code Online (Sandbox Code Playgroud)

这给出了周期6的三角波,在3和0之间振荡.

方波

y = (x++ % 6) < 3 ? 3 : 0;
Run Code Online (Sandbox Code Playgroud)

这给出了周期6的规则方波,在3和0之间振荡.

正弦波

y = 3 * sin((float)x / 10);
Run Code Online (Sandbox Code Playgroud)

这给出了一个正弦波周期20 pi,在3和-3之间振荡.


更新:

弯曲的三角波

要获得具有曲线而不是直线的三角波的变化,您只需要在方程中引入一个指数使其成为二次方程.

凹曲线(即x^2形状):

y = pow(abs((x++ % 6) - 3), 2.0);
Run Code Online (Sandbox Code Playgroud)

凹曲线(即sqrt(x)形状):

y = pow(abs((x++ % 6) - 3), 0.5);
Run Code Online (Sandbox Code Playgroud)

或者使用该pow函数,您可以简单地定义一个square函数并使用sqrt函数math.h,这可能会提高性能.

此外,如果您想使曲线更陡/更浅,只需尝试更改索引.


在所有这些情况下,您应该能够轻松地调整常数并在正确的位置添加缩放因子,以给出给定波形的变化(不同的周期,放大,不对称等).

  • 很好的答案.可惜这不是公认的,imho (7认同)
  • 请注意,我的x与问题中的x不对应.这里使用的x I表示沿x轴的常规值,并且类似地y表示沿y轴的值.这里的x似乎是你问题中的我. (2认同)

Lig*_*der 37

扩展Eric Bainville的答案:

y = (A/P) * (P - abs(x % (2*P) - P) )
Run Code Online (Sandbox Code Playgroud)

其中x是运行整数,y是三角波输出.A是波的幅度,P是半周期.例如,A = 5将产生一个从0到5的波; P = 10将产生周期为20的波.对于x = 0,波在y = 0处开始.

请注意,除非P是A的因子,否则y将是一个浮点数.而且,是的,对于数学纯粹主义者:A在技术上是波的幅度的两倍,但是看下面的图片,你会明白我的意思意思.

可视化:

  • 这是一个更好的答案,纯粹是因为它有记录. (6认同)

小智 7

我知道这是一个老帖子,但是对于那些正在寻找类似的东西的人我建议看一下. http://en.wikipedia.org/wiki/Triangle_wave

最后一个公式y(x)=(2a /π)ar​​csin(sin((2π/ p)*x))

要么.

(2 * amplitudeConstant / Math.PI) * Math.Asin(Math.Sin(2 * (Math.PI / periodConstant) * Convert.ToDouble(variableX)))
Run Code Online (Sandbox Code Playgroud)


bal*_*pha 5

y = abs( amplitude - x % (2*amplitude) )
Run Code Online (Sandbox Code Playgroud)

改变波长只需要一个因素x.

编辑:我称之为幅度实际上不是幅度,而是最大值(即曲线在0和5之间振荡时为5).数学意义上的振幅是其中的一半.但你明白了.