在数字信号处理中,特别是在通信信号处理的应用中,经常会遇到复数乘法器。有些朋友可能会感到奇怪,信号都是实信号,哪来的复数呢?其实在通信信号中,基带信号会被分为I,Q两路,然后用QPSK/DQPSK进行调制。接收端解调后又会得到两路信号。所以一般来说为了表示和运算方便,一般把I路信号当成实部,Q路信号当成虚部。 打个比方,输入信号(I,Q两路)进行FFT变换为频率信号后(有实部和虚部)表示为a+b*i和另一个复数(cosx+sinx*i,表示为c+d*i)进行相乘,等效为时域上I,Q两路信号的移相。那么此时就用到了复数乘法器。粗浅的看上去,一个复数乘法器需要4个乘法器,3个加法器(减法其实就是补码加法):
(a+b*i)*(c+d*i) = (a*c - b*d) + (b*c + a*d)*i = x + y*i
但是该式子可以化简成:
其中x 可以等效为 a*c - b*d + (b*c - a*d) - (b*c - a*d)
于是化简为a*c - b*c + a*d - b*d + (b*c - a*d) = (c+d)*(a-b) + (b*c - a*d) = x
由于x的计算中已经包含了b*c和a*d的结果,因此只需算出x即可算出y。算出x只需要3个乘法器即可。如此节省了一个乘法器。如果使用了FPGA的DSP48作为乘法器的话,那么这种优化方法是非常有效的,因为省去了其中一个DSP48。当然,如果是使用Xilinx的IPCORE并且use DSP48来实现复数乘法器的话,Xilinx生成的乘法器也是差不多这种架构。但是如果是在ASIC设计或者是使用LUT来实现乘法器,那么这种架构未必节省资源。