了解使用&按位运算符

时间:2014-02-09 10:26:46

标签: c++ signal-processing

我一直在分析代码并试图理解算法的每个部分。 我遇到了使用按位和运算符的部分

if (qpd >= 0) qpd += qpd&1;
else qpd -= qpd&1;

根据我的理解,该算法希望使用1作为变量qpd的掩码,但由于该数字仅为1,因此在进行几乎不做任何更改的操作时没有多大意义。因为我迷路了,请在这里赐教。

使用按位运算符获取数组大小和频率的foor循环如下:

/* this is the analysis step */
            for (k = 0; k <= fftFrameSize2; k++) {

                /* de-interlace FFT buffer */
                real = gFFTworksp[2*k];
                imag = gFFTworksp[2*k+1];

                /* compute magnitude and phase */
                magn = 2.*sqrt(real*real + imag*imag);
                phase = atan2(imag,real);

                /* compute phase difference */
                tmp = phase - gLastPhase[k];
                gLastPhase[k] = phase;

                /* subtract expected phase difference */
                tmp -= (double)k*expct;

                /* map delta phase into +/- Pi interval */
                qpd = tmp/M_PI;
                if (qpd >= 0) qpd += qpd&1;
                else qpd -= qpd&1;
                tmp -= M_PI*(double)qpd;

                /* get deviation from bin frequency from the +/- Pi interval */
                tmp = osamp*tmp/(2.*M_PI);

                /* compute the k-th partials' true frequency */
                tmp = (double)k*freqPerBin + tmp*freqPerBin;

                /* store magnitude and true frequency in analysis arrays */
                gAnaMagn[k] = magn;
                gAnaFreq[k] = tmp;

            }

2 个答案:

答案 0 :(得分:7)

代码用于将数字舍入到下一个偶数值;舍入正数和负数:例如

7 becomes 8
12 remains 12
-7 becomes -8

它的工作原理是加上或减去该值的最后一位,即奇数为1,偶数为0。

答案 1 :(得分:1)

嗯,我不完全确定所有这一切在做什么,但&运算符正在做的基本上是添加一个或零,如果qbd高于或等于零,如果它小于零,则减去一个或零(全部基于第一个位)。

不确定这是否是您要找的。