コントローラーなしでLEDの明るさを制御するためにいくつかのバイナリ配列を生成したいと思います。マイクロコントローラーでパルス幅を生成するのではなく(他の用途に使用する必要のある命令サイクルを消費します)、ルックアップテーブルとしてハードコーディングし、バイナリ配列を繰り返しループして設定します。その命令でLEDがオンまたはオフになります。
配列の長さが4であるとすると、5つの輝度レベルがあります。
{{ 0, 0, 0, 0 },
{ 1, 0, 0, 0 },
{ 1, 0, 1, 0 },
{ 1, 1, 1, 0 },
{ 1, 1, 1, 1 }}
アレイ全体で1をできるだけ均等に分散しようとしたことに注意してください。これは常に可能であるとは限りませんが、人間の目には小さな異常が表示されないようにする必要があります。
配列の長さが8で、明るさを5/8にしたいとします。
{ 1, 0, 1, 1, 0, 1, 1, 0 };
これは良い広がりのようですが、私も使用できたはずです:
{ 1, 0, 1, 1, 1, 0, 1, 0 };
どちらが良いですか?もちろん、平均的な明るさは同じです。ある状態から別の状態への変化の数も同じです。標準偏差は同じです。ただし、ランを見ると、最初の例ではランレングスの分散がはるかに小さく、より均一であるため、より優れています。
ともかく。与えられた長さと明るさでこれらの配列を生成するアルゴリズムが必要です。可能であれば、アルゴリズムは最適な配列(可能な限り均一な配列)を見つける必要があります。
思ったほど簡単ではありません。正直なところ、私はすべての可能性を比較し、最良のものを返すブルートフォースアルゴリズムを書きたくなります。
整数計画モデルをまとめることも考えていましたが、それはこの問題にはやり過ぎのようです。
誰かがより良いアイデアを持っていない限り?
編集:
と{ 1, 1, 1, 1, 0, 0, 0, 0 }
同じ実行分散が{ 1, 0, 1, 0, 1, 0, 1, 0 }
あることがわかります。したがって、2番目の例は最初の例よりも明らかに優れているため、メトリックはもう少し複雑にする必要があります。(アレイの長さが長い場合は、1が集まっているときにLEDのちらつきが見える場合があります)。