我一直在看一些使用IFFT(快速反傅立叶变换)创建的样本填充数组的代码。
当作者迭代数组时,他使用一个if结构,如下所示:
int idx;
for (idx = 1; idx < (tableLen >> 1); idx++) {
freqWaveRe[idx] = 1.0 / idx; // sawtooth spectrum
freqWaveRe[tableLen - idx] = -freqWaveRe[idx]; // mirror
}
你能解释一下终止条件吗?
idx < (tableLen >> 1)
你为什么要做这样的事情,这是什么意思?
此表达式中使用的位移位运算符:
idx < (tableLen >> 1)
在遍历数组的前半部分后终止for循环。右移运算符将值向右移动一位。向右移动一位,除以2。
1010 in binary = 10
右移1位得到:
0101 in binary = 5
还有几件事:
Tony D提到了一些评论,这些评论认为"如果idx
是负的,这将不能很好地工作"。负数的表示方式不同。有时负号存储时,第一个位表示符号。如果你向右移动符号,你会丢失这些信息,并造成一些混乱。
Tony D还说:"从历史上看,当移位操作码的执行速度比除法快时,这是一种优化,优化器是不可信的"