Location : Home >> Technology Notes >> ASIC Design for Signal Processing

Complex Number Multipliers

[Last modified 11:12:05 PM on Tuesday, 27 July 2010]
Once an efficient design for a multiplier had been designed, it could then be extended to multiply complex numbers. However, since complex numbers consist of two components, multiplication is more involved. [See web references for links about complex numbers]

A typical complex multiplication is (a + ib)(c + id), but to perform this calculation in hardware we need to separate the two components:
             (a + ib)(c + id) = (ac - bd) + i(bc + ad)
This means that four separate multiplications are required in total. By observing that the multiplications can be arranged so that "a" and "b" are always the multipliers, and "c" and "d" are always the multiplicands, we can make some savings in logic. This means that only two, not four, booth recoder sections are required, as shown in figure 1.

Complex number multiplier architecture
Figure 1: Architecture for a complex multiplier circuit, based on the components of the original multiplier.
In addition, it is only necessary to have one adder tree for each component of the output. The only inconsistent part of the design is dealing with the subtraction of the "bd" term, but this can easily be handled by inverting the NEG booth recoded input to the partial product generator.

A further complication is that sometimes, in this particular project, it is necessary to multiply by the conjugate of the value that is read from the inputs. Explicitly taking the conjugate of those values would involve the problem of having to add "1" to the result, especially when we may need to do so again after the booth recoding. Instead, I found it was easier to incorporate this feature into the multiplier, after observing the output of such a calculation:
           (a + ib)(c - id) = (ac + bd) + i(bc - ad)
All that is required is to invert the NEG signal for the bd and ad partial products.


Alternative Approaches
There have been numerous designs for complex multiplication algorithms. Two particular approaches of interest are: The most appropriate design was the previously described method of using carry-save adder trees. Unlike the above methods, this technique allows data values to be kept in carry-save format, and manipulated in that form, until the normal binary form is required. This proves particularly useful for matrix multiplication, because the results for an output cell of a matrix consist of the addition of several separate multiplications. In these cases, we only need to know the value of total sum, and not the individual multiplications, so there is no need to convert the multiplication results out of carry-save form.

References
(C)opyright 2001-2010, Geoff Knagge.
Continued use of this site indicates your agreement to the Conditions of use and Privacy Policy.
complexmultipliers.shtml, last modified 11:12:05 PM on Tuesday, 27 July 2010