Skip to content

Digital modulation and OFDM

Raised-cosine pulses send symbols that leave each other's symbol times alone; with OFDM and a cyclic prefix, a channel becomes one gain per subcarrier.

Before this22.2 · 27.3 · 3 more
Chapter 27 · Lesson 5 of 5

First, the picture

A radio sends each symbol as a smooth pulse, and the pulses overlap in time. Watch twelve of them pile up below: at each symbol time their sum still lands on that symbol’s value.

Pulses that keep out of each other's way

Twelve 4-ASK symbols (seed 275), raised cosine with α = 0.35, 8 samples per symbol.

One pulse, for the first symbol (1): 1 at its own time, 0 at every other symbol time.

pulses added
1
largest miss at symbol times
—
0.00 / 14.00 s
Describe this picture

Twelve 4-ASK symbols (seed 275), each sent as a raised cosine with α = 0.35, 8 samples per symbol. One panel, height from −4.5 to 4.5 against time in symbols from −4 to 16. Each symbol’s pulse is a thin dashed curve and their sum a solid curve; filled circles on the sum mark where each symbol should be read. The readouts are how many pulses are added and the largest miss at symbol times. There is no control. The 14 s clip opens on the first pulse alone, for the first symbol, 1: it is 1 at its own time and 0 at every other symbol time. From 2.5 s a pulse is added every 0.6 s and the sum is redrawn each time. At 10 s all twelve are in: they overlap, yet at each symbol time the sum is that symbol’s value. At 11 s the circles appear, and the readouts show 12 pulses and a largest miss below 10⁻¹⁵, rounding only: no intersymbol interference.

Pulses that keep out of each other’s way

In I/Q and complex baseband (27.3), “A carrier offset spins the constellation” sent two bits at a time as one of four points in the I/Q plane. Each point sent is a symbol, and I write the one sent at symbol time mm as AmA_m. The set of points to choose from is the constellation.

This page asks two questions. What shape should each symbol take in time? And how can a radio send many symbols at once through a channel full of echoes?

First, the points themselves. There are three common ways to place them:

  • ASK, amplitude-shift keying, puts the points on a line, so only the size changes. 4-ASK uses −3, −1, 1 and 3.
  • PSK, phase-shift keying, puts them on a circle, so only the angle changes. 27.3’s QPSK is 4-PSK, and 8-PSK has eight points 45° apart.
  • QAM, quadrature amplitude modulation, puts them on a grid of I and Q values, so both change. 16-QAM is a grid of 4 by 4.
IQ4-ASKIQ8-PSKIQ16-QAM
Fig. Three constellations. 4-ASK changes only the size, 8-PSK only the angle, 16-QAM both.

Four points carry two bits per symbol, and sixteen carry four. The price: at the same average power, sixteen points sit closer together than four, so less noise is enough to confuse two of them.

From symbols to a signal

Now time. The plainest way to send 4-ASK is to hold each symbol’s value for LL samples, a staircase. But a staircase jumps, and sharp jumps need high frequencies, so it spreads across the band and disturbs the radios next to it.

So each symbol is sent as a smooth pulse p[n]p[n] instead. Putting each pulse in its place is the upsampling of Upsampling and interpolation (22.2), “Insert zeros: the spectrum squeezes and images appear”. Put L−1L-1 zeros after each symbol, so AmA_m sits at n=mLn=mL, and filter by pp. The convolution puts a copy of pp, scaled by AmA_m, at every symbol time:

x[n]=∑mAm p[n−mL].x[n]=\sum_mA_m\,p[n-mL].

Here LL is the number of samples per symbol, 22.2’s upsampling factor. The letter p[n]p[n] was the prototype low-pass of Filter banks (23.1), and the idea is the same: one low-pass shape that every symbol shifts. This way of building a signal is called pulse shaping.

Which pulse? In “Remove the images, and multiply by L” of 22.2 the ideal interpolation taps were sinc(m/L)\mathrm{sinc}(m/L), which is 0 at every old sample instant. That is exactly the property I want here: at each symbol time, every other symbol’s pulse is 0.

Otherwise a symbol’s value would leak into the reading of its neighbours. That leak is called intersymbol interference, ISI for short.

The sinc has one weakness: its tails die slowly. The raised cosine multiplies it by a factor that makes them die faster:

p[n]=sinc(n/L)cos⁡(παn/L)1−(2αn/L)2.p[n]=\frac{\mathrm{sinc}(n/L)\cos(\pi\alpha n/L)}{1-(2\alpha n/L)^2}.

The number α\alpha, from 0 to 1, is the roll-off. On this page α\alpha means only that, not the delay it meant in Linear-phase systems (17.3). With α=0\alpha=0 the factor is 1, and the pulse is the sinc again.

I use L=8L=8 and α=0.35\alpha=0.35, and keep nn from −32 to 32: 65 taps, four symbols to each side. The pulse is 1 at n=0n=0 and 0.619 halfway to the next symbol time, at n=±4n=\pm4. It dips lowest, to −0.171, at n=±11n=\pm11.

At n=±8n=\pm8, ±16\pm16, ±24\pm24 and ±32\pm32 the sinc is the sinc of a whole number, which is 0, so pp is 0 there. The denominator would be 0 at ∣n∣=L/(2α)=11.43\lvert n\rvert=L/(2\alpha)=11.43, but that is not a whole number, so no sample falls on it.

For the instrument, I drew twelve 4-ASK symbols with seed 275. Each uniform draw uu, between 0 and 1, picks the symbol −3, −1, 1 or 3 when ⌊4u⌋\lfloor4u\rfloor, the whole part of 4u4u, is 0, 1, 2 or 3. They came out 1, −3, 3, 3, 3, 3, 1, 1, 3, 3, −1, −3. The picture at the top of the page adds their pulses one by one.

Notice the end frame. Between symbol times the sum is free to move: it overshoots to 3.97, above the largest symbol, 3. At the symbol times it lands on each symbol, and the circles sit on it.

Why the sum lands on every symbol

Read the sum at symbol time mm, at n=mLn=mL. Pulse mm contributes Am p[0]=AmA_m\,p[0]=A_m. Every other pulse, m′m', contributes Am′ p[(m−m′)L]A_{m'}\,p[(m-m')L], and pp is 0 at every nonzero multiple of LL:

x[mL]=Am p[0]+∑m′≠mAm′ p[(m−m′)L]=Am.\begin{aligned} x[mL]&=A_m\,p[0]\\ &\quad+\sum_{m'\ne m}A_{m'}\,p[(m-m')L]\\ &=A_m. \end{aligned}

So this pulse train has no intersymbol interference at the symbol times. A pulse that is 0 at every other symbol time is a Nyquist pulse, after Harry Nyquist, who stated this condition for telegraph signals in 1928.

The instrument’s misses, about 10−1610^{-16}, are the computer’s rounding: the samples of pp at the other symbol times come out at most 3.5×10−173.5\times10^{-17} rather than exactly 0. In my sums the largest miss is 2.2×10−162.2\times10^{-16}.

Between the symbol times there is no such promise. Near n=19n=19, between two symbols of value 3, the neighbours’ pulses all push the same way, and the sum reaches 3.97. That is harmless, because the receiver reads only at the symbol times.

What the roll-off buys

The sinc pulse of 22.2, α=0\alpha=0, is the ideal low-pass with cutoff π/L\pi/L rad/sample, which is 1/(2L)1/(2L) cycles per sample. That is the narrowest band any Nyquist pulse can have.

The raised cosine pays for its faster tails with a wider band. I state its spectrum without proof. It is flat up to (1−α)/(2L)(1-\alpha)/(2L) cycles per sample. Then it falls along half a period of a cosine, raised so that it ends at 0, at (1+α)/(2L)(1+\alpha)/(2L). That shape gives the pulse its name.

So the band is

1+α2L cycles per sample.\frac{1+\alpha}{2L}\ \text{cycles per sample}.

With L=8L=8 and α=0.35\alpha=0.35 that is 0.0844, against the sinc’s 0.0625: the roll-off is the extra width as a fraction, 35 % here.

What does the extra width buy? Look at the tails, three symbols or more from the centre. The raised cosine’s largest there is 0.016, at n=±27n=\pm27; the sinc’s is 0.091, at n=±28n=\pm28.

That matters, because a real pulse must be cut somewhere. Cut to 65 taps, the raised cosine’s spectrum above 0.0844 cycles per sample stays at least 44.1 dB below its value at 0. The sinc, cut the same way, reaches up to 27.7 dB below.

One number per subcarrier

Now the second question: how to send many symbols at once through a channel with echoes.

The symbols here are 16-QAM. Each symbol carries four bits: the first two choose I and the last two choose Q, each from −3, −1, 1, 3.

The order is 00 → −3, 01 → −1, 11 → 1, 10 → 3. Neighbouring levels differ in one bit only, so mistaking a point for its neighbour costs one bit, not two. This order is called a Gray code.

Then everything is divided by 10\sqrt{10}. The four levels have squares 9, 1, 1 and 9, which average 5, and I and Q together make 10. So the sixteen points have average power 1.

Echoes

A radio signal reaches you along several paths: straight, and bounced off buildings. Each bounce arrives later and weaker. That is the echo of “Same rule, different h” in Discrete convolution (5.2), several of them at once, so the channel is an impulse response hh. My channel is

h=1, 0.6, 0, −0.3, 0, 0.2.h=1,\ 0.6,\ 0,\ -0.3,\ 0,\ 0.2.

Its last echo comes 5 samples after the first. This span is the channel’s delay spread.

A fast single stream of symbols would smear each symbol over the next five. OFDM, orthogonal frequency-division multiplexing, does something else. It sends many slow symbols side by side, each on its own frequency.

One block, many subcarriers

Take N=64N=64 symbols X[0],…,X[63]X[0],\dots,X[63] and turn them into 64 samples:

x[n]=1N∑k=0N−1X[k] ej2πkn/N.x[n]=\frac1{\sqrt N}\sum_{k=0}^{N-1}X[k]\,e^{j2\pi kn/N}.

This is N\sqrt N times the inverse DFT of The DFT (13.2). Each symbol X[k]X[k] rides on its own arrow, which turns k/Nk/N of a turn per sample. Each arrow is a subcarrier, and the 64 samples are one OFDM block.

By “Energy in time and in bins” of 13.2, the N\sqrt N keeps the power: the samples have the same average power as the symbols. “Orthogonal” refers to “Rows that cancel” of The DFT as a matrix (13.5): over one block, two different arrows cancel, so the receiver’s DFT separates them again.

The cyclic prefix

Send the block through hh as it is, and two things go wrong. The channel’s echoes of each block’s last five samples spill into the start of the next. And within a block, the convolution is linear, not circular, so the DFT’s neat rule does not apply.

The fix is the cyclic prefix. Copy the block’s last NcpN_\text{cp} samples and send them in front of it. I use Ncp=8N_\text{cp}=8, so each block becomes 72 samples: x[56],…,x[63]x[56],\dots,x[63], then x[0],…,x[63]x[0],\dots,x[63].

The receiver drops the first 8 samples of each block and keeps 64. At kept sample nn, the channel adds up the inputs x[n−i]x[n-i] for ii = 0 to 5. When n−in-i is negative, that input is a prefix sample, a copy of x[n−i+N]x[n-i+N]. The prefix is longer than the delay spread, so the channel never reaches back into the previous block.

So the kept samples are

y[n]=∑i=05h[i] x[(n−i) mod N]+v[n]=(h⊛Nx)[n]+v[n],\begin{aligned} y[n]&=\sum_{i=0}^{5}h[i]\,x[(n-i)\bmod N]\\ &\quad+v[n]\\ &=(h\circledast_N x)[n]+v[n], \end{aligned}

where v[n]v[n] is the noise. That is the circular convolution of Properties of the DFT (13.3), “Circular convolution”. In “The tail wraps round” of Circular vs linear convolution (13.4), the tail of a convolution wrapped onto its start by accident. Here the prefix makes it happen on purpose.

Now take the receiver’s DFT, divided by N\sqrt N. By 13.3, a circular convolution becomes a product, bin by bin:

Y[k]=H[k] X[k]+V[k].Y[k]=H[k]\,X[k]+V[k].

Here H[k]H[k] is the DFT of hh, the channel’s gain on subcarrier kk, and V[k]V[k] is the noise, transformed the same way. The channel has become one complex number per subcarrier. Dividing by it, the one-tap equaliser, gives

Y[k]H[k]=X[k]+V[k]H[k].\frac{Y[k]}{H[k]}=X[k]+\frac{V[k]}{H[k]}.

The symbols come back, plus noise. On this page the receiver knows H[k]H[k]. Real receivers estimate it from known symbols sent for that purpose, called pilot symbols.

The instrument sends 20 blocks of 64 subcarriers, 1280 symbols in all. Their 5120 bits come from 5120 uniform draws with seed 2751, a bit being 1 when the draw is at least 0.5; 2592 of them are 1. The symbols’ average power measures 0.983.

Each received sample gets complex noise, 10−2.5/2 (g0+jg1)\sqrt{10^{-2.5}/2}\,(g_0+jg_1), from two Gaussian draws with seed 2750. Its power is set to 10−2.510^{-2.5}, 25 dB below 1, the power the symbols were scaled to. This draw measures −24.8 dB.

To measure how far the points land from where they should be, I use 27.3’s error vector. The error vector magnitude, EVM\mathrm{EVM}, is the RMS of the differences between the points and the symbols sent, divided by the RMS of the symbols sent, in percent. To read a symbol, the receiver picks the nearest of the 16 ideal points. When that is not the point sent, it is a symbol error.

One number per subcarrier

20 OFDM blocks of 64 subcarriers, 16-QAM (bits from seed 2751), a 6-tap channel, 8-sample cyclic prefix, noise at 25 dB SNR (seed 2750; measured noise power −24.8 dB re 1, an SNR of 24.7 dB).

The sent symbols: 16-QAM on 64 subcarriers. The channel's gain differs per subcarrier, from 0.413 to 1.792.

stage
sent
error vector
0.0 %
symbol errors
0
Cyclic prefix
0.00 / 14.00 s
Describe this picture

20 OFDM blocks of 64 subcarriers, 16-QAM (bits from seed 2751), a 6-tap channel, an 8-sample cyclic prefix and noise at 25 dB SNR (seed 2750; measured noise power −24.8 dB re 1, an SNR of 24.7 dB). Two panels. The first, a square constellation from −2.5 to 2.5 in I and Q, draws the current stage’s 1280 points as small dots, with the 16 ideal points as open rings. The second, the channel gain, draws one bar of ∣H[k]∣\lvert H[k]\rvert, from 0 to 2, per subcarrier kk from 0 to 63. The readouts are the stage, the error vector in percent with one decimal and the symbol errors out of 1280. The 14 s clip opens on the sent symbols, 16-QAM on 64 subcarriers, with a channel gain that differs per subcarrier, from 0.413 to 1.792. From 3 s each point moves to its received value Y[k]Y[k], scaled and turned by its own H[k]H[k]: the error vector is 70.2 %. From 8.5 s each point is divided by its subcarrier’s gain: the 16 clusters return, with an error vector of 7.5 % and 0 symbol errors in 1280. When the clip ends, two full-width buttons in a group named “Cyclic prefix”, “prefix on” and “prefix off”, switch the prefix; the setting is kept in the link, as ofdm.cp. Without the prefix the error vector is 18.6 %, with 68 symbol errors: the tail of each block spills into the next.

Watch the dots: the channel scatters them, and one division per subcarrier gathers them back into 16 clusters. When the clip ends, switch the prefix off and watch them scatter again.

Notice the middle frame against the end frame. After the channel the points are scattered, with an error vector of 70.2 %. One division per subcarrier brings it to 7.5 %, and every symbol is read correctly.

Reading the numbers

Why 70 %? Before the division, the error on subcarrier kk is Y[k]−X[k]=(H[k]−1)X[k]+V[k]Y[k]-X[k]=(H[k]-1)X[k]+V[k]. And H[k]−1H[k]-1 is the DFT of the channel without its first tap: 0, 0.6, 0, −0.3, 0, 0.2.

By “Energy in time and in bins” of 13.2, the average of ∣H[k]−1∣2\lvert H[k]-1\rvert^2 over the 64 subcarriers is that channel’s energy: 0.36+0.09+0.04=0.490.36+0.09+0.04=0.49. Its square root is 0.7, so the channel alone puts the points about 70 % off; the noise adds a little more.

Why 7.5 % and not less? The noise alone would give 5.7 %. But the division also divides the noise by H[k]H[k], and on weak subcarriers that makes it larger. On the weakest, k=22k=22, the error vector is 14.5 %; on the strongest, k=12k=12, it is 3.2 %.

Switch the prefix off, and the error vector jumps to 18.6 %, with 68 symbol errors. The blocks now bleed into each other, and the convolution no longer wraps, so no single number per subcarrier undoes it. Of the 68 errors, 55 fall on the 16 weakest subcarriers.

The prefix is not free. It costs 8 of every 72 samples, 11.1 %, of the time on air. It also has a minimum length: it must be at least as long as the channel’s delay spread, here 5 samples.

The maths behind it · circulant matrices

With the prefix, the channel acts on each block as the circulant matrix C\mathbf{C} of hh. “Arrows in, the same arrows out” of 13.5 showed that the DFT diagonalises every circulant matrix, with the H[k]H[k] on the diagonal. OFDM sends the symbols along those eigenvectors, so the channel only scales each one. That is why one division per subcarrier undoes it.

The maths behind it · Gaussian noise clouds

Around each ideal point the noise makes a cloud, the two-dimensional Gaussian cloud of 27.3. A symbol error happens when a point lands closer to a neighbouring ideal point. Dividing by a small H[k]H[k] enlarges the cloud. With the prefix, the weakest subcarrier’s equalised noise has a standard deviation of 0.096 in I and in Q. The halfway line to a neighbour lies 0.316 away, 3.3 standard deviations.

Worked example

1. The raised cosine at a symbol time. With L=8L=8 and α=0.35\alpha=0.35, p[8]=sinc(1)cos⁡(0.35π)/(1−0.72)p[8]=\mathrm{sinc}(1)\cos(0.35\pi)/\big(1-0.7^2\big). Here sinc(1)=0\mathrm{sinc}(1)=0, and the denominator is 1−0.49=0.511-0.49=0.51, not 0. So p[8]=0p[8]=0.

2. Bits to 16-QAM. The first eight bits of the instrument are 0001 1010. The first four give I from 00, −3, and Q from 01, −1, so X[0]=(−3−j)/10X[0]=(-3-j)/\sqrt{10}. That is −0.949−0.316j-0.949-0.316j.

The next four give 10 and 10, so X[1]=(3+3j)/10X[1]=(3+3j)/\sqrt{10}, or 0.949+0.949j0.949+0.949j.

3. Two channel gains by hand. At k=0k=0 every arrow is 1, so H[0]=1+0.6−0.3+0.2=1.5H[0]=1+0.6-0.3+0.2=1.5. At k=32k=32 the arrow is e−jπn=(−1)ne^{-j\pi n}=(-1)^n, so H[32]=1−0.6+0.3−0.2=0.5H[32]=1-0.6+0.3-0.2=0.5. A symbol on subcarrier 32 arrives at half its size, and the equaliser doubles it back, with its noise.

4. The prefix. The channel has 6 taps, so its delay spread is 5 samples. A prefix of 8 covers it, at a cost of 8/72=11.18/72=11.1 % of the samples.

Where you’ll meet this

Wi-Fi uses OFDM, from 802.11a and g through n, ac and ax. In 802.11a, blocks of 64 subcarriers carry data and pilot symbols on 52 of them, with a prefix of 16 samples, 0.8 µs at 20 MHz. That prefix costs 16 of every 80 samples, 20 %.

LTE and 5G NR use OFDM in their downlinks, with subcarriers 15 kHz apart in LTE. Digital audio and TV broadcasting use it too (DAB, DVB-T), and DSL lines use a form of it called discrete multitone.

Single-carrier links with raised-cosine pulses carry satellite and cable signals. Satellite TV by DVB-S uses a roll-off of 0.35, the one on this page.

In those links the raised cosine is usually split in two: a “root raised cosine” at the transmitter and the same at the receiver, which together make the raised cosine. The receiver’s half is then the matched filter of Matched filters and detection (26.1), “Slide the template, find the pulse”.

A single-carrier link cannot use one tap per subcarrier, so its receiver needs a longer equalising filter. Channels and equalisation (33.2) builds one. Radar signal processing (33.1) also sends pulses, and listens for their echoes.

I left a lot out. A real receiver estimates H[k]H[k] from pilot symbols and finds the start of each block. Real links add error-correcting codes and must handle OFDM’s high peaks against its average power. Single-carrier links are judged with the eye diagram. For more, see Proakis and Salehi, Digital Communications (5th ed., 2008), chapters 9 and 11, and Goldsmith, Wireless Communications (2005), chapter 12.

Reference card

QuantityFormulaNotes
Pulse train∑mAm p[n−mL]\sum_mA_m\,p[n-mL]upsample by LL, filter by pp
Raised cosinesinc(n/L)cos⁡(παn/L)1−(2αn/L)2\dfrac{\mathrm{sinc}(n/L)\cos(\pi\alpha n/L)}{1-(2\alpha n/L)^2}1 at n=0n=0, 0 at the other multiples of LL: no ISI
Bandwidth(1+α)/(2L)(1+\alpha)/(2L) cycles per sampleα=0.35\alpha=0.35, L=8L=8: 0.0844
16-QAMI and Q from −3, −1, 1, 3, over 10\sqrt{10}Gray order 00, 01, 11, 10; average power 1
OFDM blockN\sqrt N times the inverse DFT of X[k]X[k]last NcpN_\text{cp} samples copied in front
With a prefixY[k]=H[k]X[k]+V[k]Y[k]=H[k]X[k]+V[k]needs NcpN_\text{cp} at least the delay spread
One-tap equaliserY[k]/H[k]Y[k]/H[k]weak subcarriers get more noise
Prefix costNcp/(N+Ncp)N_\text{cp}/(N+N_\text{cp})8 of 72: 11.1 %

End of lesson 27.5

Where to go next.

Phasorium
LibraryEvery lesson, in order

Parts

About Phasorium
Look