使用正弦和余弦的 DMX 值。从 8bit(1 通道)到 16bit(2 通道)

问题描述 投票:0回答:1

我(仍在)从事一个控制 DMX 灯的小项目(使用 Art-Net)。 目前我正在研究“运动发生器”,我基本上做的是使用正弦和余弦来计算平移和倾斜通道的 DMX 值 (0-255),就像这种方法一样:

public void runSineMovement() {

    double degrees = x;
    double radians = Math.toRadians(degrees);
    double sine = Math.sin(radians);

    double dmxValue = (int) ((sine * 127) + 127);

    dmxValuesOBJ.setDmxValuesInArray(1, (int) dmxValue);

    SendArtnet.SendArtnetNow();

    x = x + 1;

    if (x > 360) {

        x = 1;

    }

}

x = 1

然后我有一个 ScheduledExecutorService 将定期调用该方法,如下所示:

int speed = 100;
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(SineMovement::runSineMovement, 0, 100000 * speed, TimeUnit.NANOSECONDS);

以上工作正常,移动头(本例中的倾斜通道)移动完美。现在我想使用“精细通道”,即从 8 位到 16 位(从 1 通道到 2 通道控制倾斜通道),这样我即使在非常慢的速度下也能获得平滑的运动。请记住,“fine-channel”必须先从 0 到 255,然后“coarse-channel”可以到 1,然后“fine-channel”从 0 到 255,然后“coarse-channel”到 2,依此类推.

早些时候,我构建了一个具有“三角效应”的运动发生器,其中我从 0 循环到 65.536 然后回到 0 等等,并且在每次运行时我都计算了“粗通道”(计数器/256)和“精细通道” -channel”(计数器 % 256),这种方法工作得很好。

关于在生成效果时使用正弦和余弦时如何处理这个问题的任何想法?我可以使用三角形生成器的方法使用除法和模数计算“粗略”和“精细”吗?

编辑:考虑到这一点时,我认为“精细”不应该具有正弦波的形式,我的意思是,“精细”将(如果使用正弦波)非常非常快地上升向下,如果“粗略”仍在“向上”,那将把事情搞砸。我猜正确的是,“精细”将始终具有锯齿形状 -> 当粗糙上升时锯齿从零到最大,当粗糙下降时锯齿从最大到零。这有意义吗?

谢谢😊

java trigonometry dmx512
1个回答
0
投票

您应该只为值 0 - 65535 计算正弦波,然后使用您用于三角波形的拆分方法将其分成两个通道,如下所示:

public void runSineMovement() {

    x = (x + 1) % 360; // this increments x and "wraps around" between 0-359

    double radians = Math.toRadians(x);
    double sine = Math.sin(radians);

    int dmxValue = (int) (sine * 32767.0 + 32767.0);

    int fineDmxValue = dmxValue & 255; // "lowByte"
    int coarseDmxValue = (dmxValue >> 8) & 255; // "hiByte"

    // TODO: set your DMX values here and send them
}

在这段代码中我使用了几个改进:

  1. 我用增量和模数计算替换了 x 值的增量 +

    if

  2. 我使用改进的打字:

    • double
      尽可能使用常量(
      32767.0
      而不是
      32767
      ),因此程序不会在每次运行时将
      int
      转换为
      double
    • int dmxValue
      而不是多次投射到
      int
  3. 我使用更快的位右移

    >>
    )和二进制和
    &
    )运算符,而不是除法和模数。

精细值由您的数字的 8 个最低有效位组成,因此您可以简单地用二进制和运算“屏蔽掉”所有其他位。

粗略值由“其他”8 位组成(16 位值的最高有效位,您正在有效使用),因此您可以将它们放在右边的 8 位(等于除以 2 的次方) 8),然后 - 为了确保,再次屏蔽掉所有其他位。

不要将逻辑AND

&&
)与此处使用的二进制AND
&
混淆,前者只能与
boolean
值一起使用。

为什么会这样:对于粗略值的每次变化,精细值不会在 0 到 255 之间振荡(以正弦形式!),因为代码只计算一个正弦波并将值“拆分”为精细值和粗略值。所以如果你有例如

dmxValue
的值为 255,这将使您的
fineDmxValue
为 255,
coarseDmxValue
为 0。但是对于
dmxValue
的值为 256,
fineDmxValue
将为 0,而
coarseDmxValue
将为1.

精细和粗糙的计算与您在

dmxValue
中生成波形的方式无关。

© www.soinside.com 2019 - 2024. All rights reserved.