首页 > 解决方案 > 时间抖动的一般方法

问题描述

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

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

谁能指出我正确的方向?

编辑:我目前实现了以下内容:首先,我计算 LED 上可实现的帧速率,这给出了我可以插入的抖动帧的数量,基于我的串中 LED 的数量和 SPI 时钟速度。LEDstrip 可以以 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

标签: processingledtemporalditheringfastled

解决方案


您可以在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。

再次从您的描述中,我不确定为什么您没有看到预期的效果。


推荐阅读