请帮忙解释以下C语言代码

代码如下:

/* Sine Wave Table Values */
unsigned char idata sintab [] = {
0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0A,
0x0C, 0x0E, 0x0F, 0x11, 0x12, 0x14, 0x15, 0x17,
0x18, 0x1A, 0x1C, 0x1D, 0x1F, 0x20, 0x22, 0x23,
0x25, 0x26, 0x28, 0x29, 0x2B, 0x2C, 0x2E, 0x2F,
0x30, 0x32, 0x33, 0x35, 0x36, 0x38, 0x39, 0x3A,
0x3C, 0x3D, 0x3F, 0x40, 0x41, 0x43, 0x44, 0x45,
0x47, 0x48, 0x49, 0x4A, 0x4C, 0x4D, 0x4E, 0x4F,
0x51, 0x52, 0x53, 0x54, 0x55, 0x57, 0x58, 0x59,
0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61,
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x6A, 0x6B, 0x6C, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
0x70, 0x71, 0x72, 0x73, 0x73, 0x74, 0x75, 0x75,
0x76, 0x76, 0x77, 0x77, 0x78, 0x79, 0x79, 0x7A,
0x7A, 0x7A, 0x7B, 0x7B, 0x7C, 0x7C, 0x7C, 0x7D,
0x7D, 0x7D, 0x7E, 0x7E, 0x7E, 0x7E, 0x7F, 0x7F,
0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F };

if (i++ >= 511) i = 0;

if (i >= 384)
DA0_next_out = 127 - sintab[127 - (i % 128)]; /* 180 - 270 quadrant */
else if (i >= 256)
DA0_next_out = 127 - sintab[i % 128]; /* 90 - 180 quadrant */
else if (i >= 128)
DA0_next_out = 128 + sintab[127 - (i % 128)]; /* 0 - 90 quadrant */
else
DA0_next_out = 128 + sintab[i]; /* 270 - 0 quadrant */

DA1_next_out = i % 256; /* note */

--------------------------------
以上代码中,DA0要生成sine波,DA1要生成锯齿状的波。sintab定义了一些指定的地址给sine wave。
请问代码中的511, 127 - sintab[127 - (i % 128)] ,等等这些代表了什么?又为什么这样算就可以得到4个象限? 而 i % 256 为什么可以变成锯齿状的波??

你可以认为 sintab是个表, 里面从头到尾放的是从 0到 360之间角度的sin值(正好一个周期)。 这些角度对应的 sintab里的序号就是 0到512 。 基本来说这个逻辑就是 sin(alpha) = sintab[i] , 其中alpha是0 到 360的连续变量, i是跟它对应的离散序号。

但是其实这个表里用不着把整个周期的数据都放进来。 首先, 都放进来之后这个表的后一半(256个数)跟前一半是很有点关系的,后一半就是前一半加个负号(这个你画一下sin图像就知道)。所以不如把后一半去掉, 需要用这些的时候读相应的前一半值,然后加个负号。 也就是说, sintab[i] = -sintab[i-256] 其中( 256 < i < 512)

现在表里只有256个数了, 但其实这个也不必要。 因为这256个里,前一半跟后一半是对称的(这个也是看图像就知道), 也就是 129跟127应该是一样的, 130跟126应该是一样的。。。 所以这里的后127个数也可以去掉, 需要的时候找找对应的前面的, 基本关系是这样的:
sintab[ i ] = sintab[256 - i] 其中( 128 <i < 256)

总结起来就可以写出类似的代码了。

这里我写的关系跟你给的是略微有点差别的, 除了它写了很多不必要的 %之外(这些都可以用减解决,只要i的范围固定)还有一点差别就是某些序号差了1 。 他的这个写法是不准确的, 好处是sintab里面有128个数, 而我这个写法要需要129个。

另外就是它给的注释是错的

至于锯齿形状的波? 这个很明显啊, i%256从0涨上去到255然后一下掉到0,然后再上去到255然后再掉到0 。。。。 这就是你要的波形?
温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网