私は8ビットのマイクロコントローラを搭載したLEDを最近多く使用しています。時には、LEDの明るさを制御するために、パルス幅変調の純粋なソフトウェア実装を使用する必要があります。これは、時間の比率を素早く変化させながら光をオン/オフすることです。これは、私がストロボが目に不快なちらつきを見始めて約5%の明るさにまで落ちるまで素晴らしいです。効率的な整数1次元ディザリング関数?
PWMをループとして実装すると、0-255の各番号がステップごとに点灯または消灯します。 20の値に設定されたライトは、最初の20回のループでオンになり、次にオフになります。
私はこれらの数字の周りをシャッフルする良い関数を探していますので、0,1,2,3のループを繰り返す代わりに、私のループは可能性のプールから半無作為にサンプリングすることができます。時間の経過に伴う集光度は同じですが、明るさの値が20の光は、一度点灯するのではなく、大部分のループで消灯するのではなく、256回にわたって広がっています。これにより、ループがわずかに遅くなってもちらつき効果が減少します。
8ビットの数値ごとに呼び出されたときに、良好なディザリング機能を使用すると、8ビットの範囲内のすべての数値を返す必要があります。したがって、重複した数字を生成する必要もありません。ランダムではなく、シャッフルしただけです。似たような数字を順番に並べることができない場合は、最善です。各数字の差は、理想的には64〜127桁です。
この制限も興味深いものです。タイムクリティカルなアプリケーションです。加算、減算、ビット単位の演算には任意の1単位時間、乗算コストは2単位、除算コストは4単位です。フロートは質問から外れており、中間の数で使用される8ビットの倍数ごとにおよそ2倍のコストがかかります。ルックアップテーブルは可能ですが、デバイスの総メモリ容量のおよそ半分を使用します - 高速アルゴリズムは再利用性に最適ですが、良質の低速アルゴリズムも事前計算のスペースがある場合に非常に便利です。
アイデアやミューズグルで私を助けてくれてありがとう。 :)
宿題がありません... ;-)申し訳ありませんが、二番目に最後の段落は、愚かな構成単位の時間コストであなたを去りました。 –
@R haha良い点。私はどの学校がそのような開放的な問題を与えているのか不思議に思います。米国の場合は、おそらくEEプログラム。 CSの宿題のようなにおいはしません。 –
実際に宿題はありません。私は、これらの操作がavr-libcでどれくらいのサイクルかかるか厳密には分かりません。これは、タイミングがどのように機能するかについての私の一般的な理解です。誰かが間違ったことを批判しないように私は確信しているよりも具体的ではないのが最善のようでした。 :) – Blixxy