spandsp: The V.29 transmitter

spandsp 0.0.6

The V.29 transmitter

# What does it do?

The V.29 transmitter implements the transmit side of a V.29 modem. This can operate at data rates of 9600, 7200 and 4800 bits/s. The audio output is a stream of 16 bit samples, at 8000 samples/second. The transmit and receive side of V.29 modems operate independantly. V.29 is mostly used for FAX transmission, where it provides the standard 9600 and 7200 bits/s rates (the 4800 bits/s mode is not used for FAX).

# How does it work?

V.29 uses QAM modulation. The standard method of producing a QAM modulated signal is to use a sampling rate which is a multiple of the baud rate. The raw signal is then a series of complex pulses, each an integer number of samples long. These can be shaped, using a suitable complex filter, and multiplied by a complex carrier signal to produce the final QAM signal for transmission.

The pulse shaping filter is only vaguely defined by the V.29 spec. Some of the other ITU modem specs. fully define the filter, typically specifying a root raised cosine filter, with 50% excess bandwidth. This is a pity, since it increases the variability of the received signal. However, the receiver's adaptive equalizer will compensate for these differences. The current design uses a root raised cosine filter with 25% excess bandwidth. Greater excess bandwidth will not allow the tranmitted signal to meet the spectral requirements.

The sampling rate for our transmitter is defined by the channel - 8000 per second. This is not a multiple of the baud rate (i.e. 2400 baud). The baud interval is actually 10/3 sample periods. Instead of using a symmetric FIR to pulse shape the signal, a polyphase filter is used. This consists of 10 sets of coefficients, offering zero to 9/10ths of a baud phase shift as well as root raised cosine filtering. The appropriate coefficient set is chosen for each signal sample generated.

The carrier is generated using the DDS method. Using two second order resonators, started in quadrature, might be more efficient, as it would have less impact on the processor cache than a table lookup approach. However, the DDS approach suits the receiver better, so the same signal generator is also used for the transmitter.

The equation defining QAM modulation is:

    s(n) = A*cos(2*pi*f*n + phi(n))

where phi(n) is the phase of the information, and A is the amplitude of the information

using the identity

    cos(x + y) = cos(x)*cos(y) - sin(x)*sin(y)

we get

    s(n) = A {cos(2*pi*f*n)*cos(phi(n)) - sin(2*pi*f*n)*sin(phi(n))}

substituting with the constellation positions

    I(n) = A*cos(phi(n))
    Q(n) = A*sin(phi(n))

gives

    s(n) = I(n)*cos(2*pi*f*n) - Q(n)*sin(2*pi*f*n)