C 一个有效的整数一维抖动函数?

C 一个有效的整数一维抖动函数?,c,function,C,Function,我最近一直在玩LED,由8位微控制器供电。有时,有必要使用脉宽调制的纯软件实现来控制LED亮度——即快速打开和关闭灯光,改变打开和关闭时间的比率。这非常有效,直到我将亮度降低到5%左右,这时闪光灯开始在眼睛上闪烁,令人不舒服 将PWM作为一个回路来实现,它在0-255之间逐级遍历每个数字,并在该时刻设置灯的打开或关闭。设置为20值的灯将在前20个环路中亮起,然后关闭 我正在寻找一个很好的函数,它将围绕这些数字洗牌,所以不要循环通过0,1,2,3。。。我的循环可以从可能性池中半随机取样。随着时间的

我最近一直在玩LED,由8位微控制器供电。有时,有必要使用脉宽调制的纯软件实现来控制LED亮度——即快速打开和关闭灯光,改变打开和关闭时间的比率。这非常有效,直到我将亮度降低到5%左右,这时闪光灯开始在眼睛上闪烁,令人不舒服

将PWM作为一个回路来实现,它在0-255之间逐级遍历每个数字,并在该时刻设置灯的打开或关闭。设置为20值的灯将在前20个环路中亮起,然后关闭

我正在寻找一个很好的函数,它将围绕这些数字洗牌,所以不要循环通过0,1,2,3。。。我的循环可以从可能性池中半随机取样。随着时间的推移,总亮度是相同的,但是亮度值为20的灯光可能会在256个环路中打开和关闭十几次,而不是在大多数环路中仅打开和关闭一次灯光。即使循环运行稍慢,这也会减少闪烁效果

当使用每个8位数字调用时,一个好的抖动函数需要返回8位范围内的每个数字。因此,它还需要不产生重复的数字——不是随机的,只是乱序。最好不要把相似的数字按顺序放在一起——每个数字之间的差异可能很大——理想情况下大约是64-127个数字

这些限制也很有趣——它是一个时间关键型应用程序。加法、减法和位运算需要1个任意时间单位,乘法需要2个单位,除法需要4个单位。浮点数是不可能的,在一个中间数中,每使用8位的倍数,成本大约会翻一番。查找表是可能的,但将使用大约设备总内存容量的一半——因此,快速算法对于可重用性来说是最好的,但当有空间进行预计算时,高质量的慢速算法也非常有用


感谢您在任何想法或思考方面帮助我。:)

不是100%确定我理解正确,但基本上我认为任何不除以256的数字都会生成一组数字0..255,如果你一直将它以256模加在自身上。抽象代数课的一些倒叙

像这样:

s = {}

n = 157
for i in range(0, 256):
   s[n] = True
   print n
   n += 157
   n %= 256

print "check: has to be 256: ", len(s) 

编辑:用较大的发生器替换小型发生器,使分布更“随机”。

示例:在8位寄存器内使用相位累加器处理5位抖动,其中占空比=1到31[%=占空比/(1个缺少作业标记…;-)抱歉,最后一段的第二段给出了愚蠢的编造时间单位成本。实际上不是作业。我只是不确定这些操作在avr libc中需要多少个周期。这只是我对计时工作的一般理解。似乎最好不要比我自信的更具体,以免有人批评错误s、 :)天哪,你们这些家伙。我有时辅导高中生和一年级学生上一年级的计算机科学课程。我想我对这类问题的写作风格受到了一些影响。:P你们有一个频率调谐器,可以增加调制频率,从而减少闪烁?该死。我对这个网站有点陌生,我想小向上箭头就像一个“回复”按钮。@uDaY:就是这样。我们在最近的一次安装中使用了大约15个微型控制器,如果我们连接外部频率时钟,最好的情况是当时的成本会多20美元左右,还有几十个小东西需要焊接在一起——对于两个失业的艺术家来说,这相当可观ts.一些更好的芯片,你可以在软件中超频,但它们的价格也要高一些。:)哦,伙计,你完全赢了!这东西看起来就像是一张票。我再也没有闪烁的桌面装饰品了!:D@blixxy每次我真正运用我记忆中的任何一个数学,我都会非常高兴。
// Easier to do in assembly, where there is access to the carry flag
unsigned bits = 5;  // states = 1 << bits
unsigned carry = 7; // keep carry bit within an 8 bit register, limits bits
unsigned frq = ((1 << carry) * duty) / (1 << bits); // More than 8 bit intermediate value
unsigned phs = 0;
for (i = 0; i < (1 << bits); i++) {
    phs += frq;  // Carry is high bit
    output((phs >> carry) & 1);  // Output carry
    phs &= (1 << carry) - 1;  // Discard carry
}
00: 00000000000000000000000000000000
01: 00000000000000000000000000000001
02: 00000000000000010000000000000001
03: 00000000001000000000010000000001
04: 00000001000000010000000100000001
05: 00000010000010000001000001000001
06: 00000100001000010000010000100001
07: 00001000010001000010001000010001
08: 00010001000100010001000100010001
09: 00010001001000100100010010001001
10: 00010010010010010001001001001001
11: 00100100100100100100100100100101
12: 00100101001001010010010100100101
13: 00101001010010100101001010010101
14: 00101010010101010010101001010101
15: 00101010101010100101010101010101
16: 01010101010101010101010101010101
17: 01010101010101011010101010101011
18: 01010101101010110101010110101011
19: 01010110101101011010110101101011
20: 01011011010110110101101101011011
21: 01011011011011011011011011011011
22: 01101101101101110110110110110111
23: 01101110110111011011101101110111
24: 01110111011101110111011101110111
25: 01110111101110111101110111101111
26: 01111011110111110111101111011111
27: 01111101111101111110111110111111
28: 01111111011111110111111101111111
29: 01111111110111111111101111111111
30: 01111111111111110111111111111111
31: 01111111111111111111111111111111