我怎样才能操纵三角波,特别是频率?

时间:2017-01-18 19:40:22

标签: javascript math waveform

我给出的动态值绘制了一个介于-1和1之间的三角波t。起始值为0.我想将这些值操作如下:

  1. 在0和1之间振荡
  2. 从.5开始(转移其阶段)
  3. 将频率提高3倍或更多(2仍然太慢)
  4. 使用三角波上的WikipediaWolfram条目,我可以使用与此类似的公式来部分完成此操作:

    Triangle wave with amplitude 2, period 4

    但特别是控制freq让我陷入困境。

    例如,(t+1)/2负责上面的1和2,但#3(频率)仅加倍...我将如何将频率增加三倍或四倍?

1 个答案:

答案 0 :(得分:2)

让我使用JS语法,因为我们在SO上没有MathJAX 我假设你熟悉这个等式

y = abs( 2*x % 2 - 1)

Triangular signal with frequency 1, amplitude 1, centered around the y-axis

价值观不是因果关系:

  • 模数是产生周期性图案所必需的。值为2是必要的,以便函数在开始新循环之前达到的最大值为2(实际上2是最小上限,但没关系)。
  • 最大振幅为2是必要的,因此在减去1之后,功能图像的范围为[-1,1]。
  • 减去1是必要的,以便使用绝对值将函数翻转为负值,假设三角形形状并且范围为[0,1]
  • 需要乘以2,以便 x 运行速度提高两倍,使得函数完成一个0.5的emi循环(因此一个循环以1个单位完成)。

这个函数比幅度1和频率1,假设x轴是时间(如果是空间那么它的波长是1个单位的空间)。

缩放和偏移函数很容易(由于单位值的幅度):

y = abs( 2*x % 2 - 1) * scale - offset

例如y = abs( 2*x % 2 - 1) * 3 - 1.5

Graph of the function with amplitude 3 and offset 1.5

请注意,此功能仍具有频率1.
要改变频率,只需通过乘以 x 来运行

就足够了
y = abs( 2*freq*x % 2 - 1) * scale - offset

添加一个阶段我们只需要为 x

添加一个偏移量
y = abs( (2*freq*x + phase) % 2 - 1) * scale - offset

相位在[0,2]范围内,其中0为0%,2为100%。

这是波幅为1,偏移1.5,频率1/3和相位1(50%)的波形示例:

Wave with amplitude 1, offset 1.5, frequency 1/3 and phase 1 (50%)

对于视觉参考,最终公式的更好类型版本是

y = abs( (2*freq*x + phase) % 2 - 1) * scale - offset