时间抖动的一般方法

时间:2019-05-12 19:04:34

标签: processing led temporal dithering

我正在寻找有关在处理中实现时间抖动的一般方法的一些输入。

目前,我有一个处理草图,可以生成一个十六进制文件,该文件可以通过SPI发送到APA102 LED灯条。我能够达到的帧速率应该足以实现时间抖动,以增加LED的动态范围,主要是降低亮度。我调查了FastLed和Fadecandy,以尝试了解它是如何完成的,但我无法真正弄清楚。不能选择使用这些库,因为应在十六进制文件中对动画进行“硬编码”。

谁能指出正确的方向?

编辑: 目前,我实现了以下操作:首先,根据字符串中的LED数量和SPI时钟速度,计算LED上可达到的帧速率,这使我可以插入的抖动帧数量。 LED灯带可以420fps更新,因此我每帧有7个“虚拟”帧,仍然能够具有60fps的基本刷新率。 然后,我计算出一个7x7的查找表,如下所示:

0 0 0 0 0 0 0 
0 0 0 1 0 0 0
0 0 1 0 0 1 0
0 1 0 1 0 1 0
0 1 0 1 1 0 1
1 1 0 1 1 1 0
0 1 1 1 1 1 1

我用浮点数进行所有的伽玛校正,而查找表中的每一行对应两个值之间1/7的步长。然后将这些值添加到下限RGB值以实现抖动。 但是,所有这些在视觉上并没有真正改变。与没有抖动的动画相比,我看不出有什么区别。 我希望看到类似https://www.youtube.com/watch?v=1-_JtRl2ks0

的东西

1 个答案:

答案 0 :(得分:0)

您可以在master/controller.h中阅读FastLED用于抖动的代码-搜索init_binary_dithering。通过阅读这些内容,我发现他们只是检查自上次更新以来已经花费了多少时间,以估计他们可以获得多少“虚拟抖动”。

由于您没有提供有效的代码,所以我不确定为什么您看不到任何区别。但是,我可以通过一个示例来了解时间抖动应该在做什么。

假设全局亮度设置为32。这意味着在显示之前,所有RGB值均被除以8(256/32)。例如255,255,255实际上将显示为31,31,31。

(目前,我将只忽略“ G”和“ B”,让我们假装它只是“ R”。)

  • 如何显示32?显示为1。
  • 如何显示0?显示为0。

现在

  • 如何显示16?它将显示为0。但这是时间抖动可能有用的地方。我们真正想要做的是将其显示为一半的时间为0,一半的时间为1。

  • 24如何显示?它也将显示为0,但在使用时间抖动时,我们应将其四分之一的时间显示为0,将其四分之三的时间显示为1。

根据您的描述,我不确定您为什么看不到预期的效果。