【问题标题】:How can I manipulate a triangle wave, frequency in particular?如何操纵三角波,特别是频率?
【发布时间】:2017-01-18 19:40:21
【问题描述】:

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

  1. 在 0 和 1 之间振荡
  2. 从 0.5 开始(改变其相位)
  3. 将其频率提高 3 倍或更多(提高 2 倍仍然太慢)

使用 Triangle Waves 上的 WikipediaWolfram 条目,我可以使用与此类似的公式部分完成此操作:

但特别是对频率的控制让我陷入了困境。

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

【问题讨论】:

  • 不知道为什么我会被否决,希望了解如何让这个问题变得更好......我现在已经轻松地花了几天时间与这些东西搏斗。

标签: javascript math waveform


【解决方案1】:

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

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

             

这些值不是因果关系:

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

假设 x 轴是时间(如果是空间,那么它的波长为 1 个空间单位),则该函数具有幅度一和频率一。

函数的缩放和偏移很容易(感谢单一值的幅度):

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

例如y = abs( 2*x % 2 - 1) * 3 - 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%) 的波示例:


为了视觉参考,最终公式的更好的类型是

                                           

【讨论】:

  • 非常感谢您的深入解释! y = abs( (2*freq*x + phase) % 2 - 1) * scale - offset 正是我需要的,但我自己却找不到。我不确定为什么我的问题仍然被否决,但你的回答肯定会帮助其他人。摇滚!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2018-10-19
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多