This page is to show some snapshot and intuitive picture about LTE modulation schedule being supported as of now and how SNR would influence on signal quality at the reciever side. These snapshots are at the level of constellation meaning it is before any kind of channel decoding and error correction. (If you are not so familiar with the the concept of SNR, BER. See the SNR and BER page in this site. Also, you may get some intuitive understanding of effect of SNR on real UE after going through all those channel decoding and error correct from Physical Layer Performance Test page).
The page runs in three steps. First, it shows the ideal constellation points that 36.211 defines for each modulation scheme. Next, it adds AWGN at several SNR values and shows how the points spread. Finally, it converts SNR into a theoretical BER for each scheme, so you can connect the pictures to numbers.
- What do the LTE modulation constellations look like ?
- How does SNR spread each constellation ?
- How does SNR turn into BER for each modulation ?
- List 1 - Matlab code for the ideal constellations
- List 2 - Matlab code for constellations with AWGN
- Reference
What do the LTE modulation constellations look like ?
Before we add any noise, let's fix the reference points. Every modulation scheme in LTE maps a group of bits to one complex symbol. 36.211 clause 7.1 lists the exact I and Q value for every bit pattern, and these ideal points are what the receiver compares each noisy sample against.
Following shows the 3GPP specification of each of LTE Modulation scheme based on 36.211 7.1 Modulation mapper. Matlab code to show these plots is at < List 1 >. It is long code, but it is just bunch of numbers copied from the 3GPP specification. No complicated logic.

Ideal constellations from 36.211 clause 7.1, from left to right BPSK, QPSK, 16QAM, 64QAM and 256QAM. Every scheme is scaled to unit average power, so a higher order makes the grid denser rather than wider.
- BPSK, on the left, has two points at (1/sqrt(2), 1/sqrt(2)) and (-1/sqrt(2), -1/sqrt(2)). They sit on the diagonal rather than on the I axis, because Table 7.1.1-1 gives I and Q the same sign.
- QPSK has four points at +/-1/sqrt(2) on each axis. One bit sets the sign of I and the other sets the sign of Q.
- 16QAM is a 4 x 4 grid with the levels +/-1 and +/-3 on each axis, divided by sqrt(10).
- 64QAM is an 8 x 8 grid with the levels +/-1 to +/-7, divided by sqrt(42).
- 256QAM is a 16 x 16 grid with the levels +/-1 to +/-15, divided by sqrt(170). All five panels share the axis range -1.5 to 1.5.
The factors sqrt(10), sqrt(42) and sqrt(170) are the average energy of each unscaled grid. Dividing by them sets the average symbol power to 1 for every scheme. So the schemes do not differ in power. They differ in how close the neighbouring points sit. The distance between neighbours is 1.41 for BPSK and QPSK, 0.63 for 16QAM, 0.31 for 64QAM and 0.15 for 256QAM. Each step from 16QAM upward roughly halves this distance. Halving the distance costs about 6 dB of SNR for the same error rate, and the next two sections show that cost directly.
The picture stops at 256QAM, but the modulation mapper has grown since. Clause 7.1.6 of 36.211 adds 1024QAM, introduced in Release 15. Its grid has the levels +/-1 to +/-31 on each axis, and the unit power scaling divides them by sqrt(682). Table 6.3.2-1 lists 1024QAM for PDSCH only, while PMCH stops at 256QAM. On the uplink, Table 5.3.2-1 lists pi/2 BPSK, QPSK, 16QAM, 64QAM and 256QAM for PUSCH. Plain BPSK does not carry data. It appears on control channels such as PHICH and PUCCH format 1a.
Every scheme carries the same average power : the scaling factor normalises each grid to unit power, so a higher order only packs the points closer together.Point spacing decides the noise tolerance : the receiver decides on the nearest point, so the smaller the spacing, the less noise a scheme can take.The code copies the specification tables : List 1 holds the same points with the same normalisation, so the plot matches 36.211 point for point.
How does SNR spread each constellation ?
Now let's put the same points through a noisy channel. The question is how much noise each constellation can take before its clusters start to touch. Touching clusters mean wrong decisions at the receiver, so this is where each scheme stops being usable.
Followings are the plots showing the constellation of 10000 LTE symbols with different modulation scheme and AWGN with various level. Just look at how the range of error for each symbol (EVM) gets wider as SNR decreases. Matlab code for this is at < List 2 >.






Received samples in black and ideal points in red, at 30, 25, 20, 10, 5 and 0 dB SNR from the top row down. The high order schemes lose their grid first, and even BPSK overlaps at 0 dB.
- 30 dB : every cluster is still a small dot, and 256QAM keeps a clear grid.
- 25 dB : 64QAM clusters are separate with small gaps. The 256QAM clusters touch each other, and the gaps in its grid fill in.
- 20 dB : 16QAM still shows clear gaps. 64QAM clusters start to touch, and 256QAM becomes a filled square with the red points inside it.
- 10 dB : BPSK and QPSK clusters are wide but still apart. The 16QAM clusters have merged into one cloud.
- 5 dB : the QPSK clouds meet along the I and Q axes. The two BPSK clouds are still split by an empty band along the other diagonal.
- 0 dB : the BPSK clouds also overlap near the origin, and no scheme shows separate clusters any more.
What does SNR mean in these plots? List 2 sets the noise from the measured symbol energy. It computes the average energy Eavg of the transmitted samples and sets the standard deviation of each noise component to sqrt(Eavg/(2 x SNR_lin)). The noise power in I and Q together is then Eavg/SNR_lin. So SNR on this page is the symbol energy over the noise power, Es/N0, and all five panels in a row see the same noise power.
A simple ratio predicts where each grid breaks. The decision boundary sits halfway between two neighbours, so a sample goes wrong when the noise moves it by more than half the point spacing. At 20 dB the noise standard deviation per axis is 0.071. Half the point spacing is 0.32 for 16QAM, 0.15 for 64QAM and 0.077 for 256QAM. That is 4.5, 2.2 and 1.1 standard deviations. This matches the 20 dB row. 16QAM stays clean, 64QAM starts to touch and 256QAM fills in completely.
The spread you see is also what EVM measures. For AWGN on a unit power signal, the RMS EVM is about 1/sqrt(SNR). So 30 dB gives about 3 percent, 20 dB about 10 percent and 10 dB about 32 percent. For comparison, 36.101 Table 6.5.2.1.1-1 limits the UE transmitter EVM to 17.5 percent for QPSK and BPSK, 12.5 percent for 16QAM, 8 percent for 64QAM and 3.5 percent for 256QAM. In SNR terms these limits are about 15, 18, 22 and 29 dB.
Each modulation needs its own SNR : the grid that survives 20 dB for 16QAM is already lost for 256QAM.The SNR on this page is Es/N0 : List 2 scales the noise to the measured symbol energy, so the five schemes in one row see the same noise power.EVM and SNR describe the same spread : RMS EVM is about 1/sqrt(SNR) in AWGN, which is why the 256QAM EVM limit of 3.5 percent corresponds to about 29 dB.
How does SNR turn into BER for each modulation ?
The plots show the spread, but they do not give a number. You usually need the bit error rate instead, for example to decide which modulation a given SNR can carry. For AWGN and Gray mapping, a closed form expression gives that number directly.
Let's check the Gray mapping first. 36.211 maps the bits so that neighbouring points differ in one bit only. For example, no two adjacent points in the 256QAM Table 7.1.5-1 differ in more than one bit. So a symbol error to a neighbour usually costs one bit, and the BER is close to the symbol error rate divided by the number of bits per symbol.
With that, the BER of BPSK is Q(sqrt(2 x SNR)). For square M-QAM, including QPSK, a standard approximation is BER = (4/log2M) x (1 - 1/sqrt(M)) x Q(sqrt(3 x SNR/(M - 1))). Here SNR is the linear Es/N0 that List 2 uses, and Q(x) is the probability that a unit Gaussian variable exceeds x. The expression is exact for QPSK. For 16QAM and above it is tight at low BER, and it is only a rough estimate at 0 and 5 dB.
The table below evaluates these expressions at the SNR values of the plots above. The last column gives the SNR at which each scheme reaches a raw BER of 10-3. The 1024QAM row has no plot on this page, but it follows the same expression.
Modulation | 0 dB | 5 dB | 10 dB | 20 dB | 25 dB | 30 dB | SNR for BER 10-3 |
BPSK | 7.9 x 10-2 | 6.0 x 10-3 | 3.9 x 10-6 | below 10-6 | below 10-6 | below 10-6 | 6.8 dB |
QPSK | 1.6 x 10-1 | 3.8 x 10-2 | 7.8 x 10-4 | below 10-6 | below 10-6 | below 10-6 | 9.8 dB |
16QAM | 2.5 x 10-1 | 1.6 x 10-1 | 5.9 x 10-2 | 2.9 x 10-6 | below 10-6 | below 10-6 | 16.5 dB |
64QAM | 2.4 x 10-1 | 2.0 x 10-1 | 1.4 x 10-1 | 8.5 x 10-3 | 3.0 x 10-5 | below 10-6 | 22.6 dB |
256QAM | 2.1 x 10-1 | 2.0 x 10-1 | 1.7 x 10-1 | 6.5 x 10-2 | 1.3 x 10-2 | 1.4 x 10-4 | 28.4 dB |
1024QAM | 1.9 x 10-1 | 1.8 x 10-1 | 1.7 x 10-1 | 1.1 x 10-1 | 6.5 x 10-2 | 1.7 x 10-2 | 34.3 dB |
Read the table against the plots. At 10 dB, BPSK and QPSK stay below 10-3, while 16QAM loses about one bit in 17. That matches the merged 16QAM cloud in the 10 dB row. 64QAM needs about 23 dB and 256QAM about 28 dB for a raw BER of 10-3. These values sit close to the EVM limits of the previous section, about 22 and 29 dB. The match is expected, because both numbers describe the same noise spread.
The plot below draws the same expressions from 0 to 40 dB on a log scale. The horizontal gap between two neighbouring curves is the SNR cost of one step in modulation order. The dashed line marks a BER of 10-3, and 1024QAM is drawn dashed because it has no simulation on this page.
Theoretical BER in AWGN for the LTE modulation schemes, with Gray mapping. Each step from 16QAM upward moves the curve about 6 dB to the right.
- The BPSK and QPSK curves are 3 dB apart. At the same Es/N0, QPSK splits the symbol energy over two bits.
- The QPSK to 16QAM step is about 7 dB, and every later step is about 6 dB, at 16.5, 22.6, 28.4 and 34.3 dB on the dashed line.
- At 0 and 5 dB the approximation is rough for 16QAM and above, so read the upper left part of those curves as a trend only.
Keep one warning in mind. These are raw bit errors before channel decoding, and LTE link adaptation does not aim at a raw BER. 36.213 clause 7.2.3 defines the CQI as the highest MCS that the UE can receive with a transport block error probability not exceeding 0.1. Turbo decoding corrects many raw bit errors, so a link can run 64QAM at an SNR where the raw BER is well above 10-3.
BER follows from SNR and the point spacing : in AWGN with Gray mapping, one Q function expression gives the raw BER of every LTE modulation.Each step in order costs about 6 dB : 16QAM, 64QAM, 256QAM and 1024QAM reach a raw BER of 10-3 at about 16.5, 22.6, 28.4 and 34.3 dB.Raw BER is not the link target : the CQI definition uses a transport block error probability of 0.1 after decoding. So an MCS works at a lower SNR than these raw values suggest.
List 1 - Matlab code for the ideal constellations
List 1 draws the ideal constellation plot of the first section. Each array holds the points of one modulation scheme, typed in from the 36.211 tables together with the normalisation factor. The arrays also keep the row order of the tables. For example, element k of QAM256 is the point for the bit pattern k - 1 in Table 7.1.5-1. The plotting part at the end puts the five schemes side by side on the same axis range.
Following constellation is based on 36.211 7.1 Modulation mapper.
clear all;
BPSK = [1/sqrt(2) + j*1/sqrt(2);
-1/sqrt(2) - j*1/sqrt(2)];
QPSK = [1/sqrt(2) + j*1/sqrt(2);
1/sqrt(2) - j*1/sqrt(2);
-1/sqrt(2) + j*1/sqrt(2);
-1/sqrt(2) - j*1/sqrt(2)];
QAM16 = [1/sqrt(10) + j*1/sqrt(10);
1/sqrt(10) + j*3/sqrt(10);
3/sqrt(10) + j*1/sqrt(10);
3/sqrt(10) + j*3/sqrt(10);
1/sqrt(10) - j*1/sqrt(10);
1/sqrt(10) - j*3/sqrt(10);
3/sqrt(10) - j*1/sqrt(10);
3/sqrt(10) - j*3/sqrt(10);
-1/sqrt(10) + j*1/sqrt(10);
-1/sqrt(10) + j*3/sqrt(10);
-3/sqrt(10) + j*1/sqrt(10);
-3/sqrt(10) + j*3/sqrt(10);
-1/sqrt(10) - j*1/sqrt(10);
-1/sqrt(10) - j*3/sqrt(10);
-3/sqrt(10) - j*1/sqrt(10);
-3/sqrt(10) - j*3/sqrt(10)];
QAM64 = [3/sqrt(42) + j*3/sqrt(42);
3/sqrt(42) + j*1/sqrt(42);
1/sqrt(42) + j*3/sqrt(42);
1/sqrt(42) + j*1/sqrt(42);
3/sqrt(42) + j*5/sqrt(42);
3/sqrt(42) + j*7/sqrt(42);
1/sqrt(42) + j*5/sqrt(42);
1/sqrt(42) + j*7/sqrt(42);
5/sqrt(42) + j*3/sqrt(42);
5/sqrt(42) + j*1/sqrt(42);
7/sqrt(42) + j*3/sqrt(42);
7/sqrt(42) + j*1/sqrt(42);
5/sqrt(42) + j*5/sqrt(42);
5/sqrt(42) + j*7/sqrt(42);
7/sqrt(42) + j*5/sqrt(42);
7/sqrt(42) + j*7/sqrt(42);
3/sqrt(42) - j*3/sqrt(42);
3/sqrt(42) - j*1/sqrt(42);
1/sqrt(42) - j*3/sqrt(42);
1/sqrt(42) - j*1/sqrt(42);
3/sqrt(42) - j*5/sqrt(42);
3/sqrt(42) - j*7/sqrt(42);
1/sqrt(42) - j*5/sqrt(42);
1/sqrt(42) - j*7/sqrt(42);
5/sqrt(42) - j*3/sqrt(42);
5/sqrt(42) - j*1/sqrt(42);
7/sqrt(42) - j*3/sqrt(42);
7/sqrt(42) - j*1/sqrt(42);
5/sqrt(42) - j*5/sqrt(42);
5/sqrt(42) - j*7/sqrt(42);
7/sqrt(42) - j*5/sqrt(42);
7/sqrt(42) - j*7/sqrt(42);
-3/sqrt(42) + j*3/sqrt(42);
-3/sqrt(42) + j*1/sqrt(42);
-1/sqrt(42) + j*3/sqrt(42);
-1/sqrt(42) + j*1/sqrt(42);
-3/sqrt(42) + j*5/sqrt(42);
-3/sqrt(42) + j*7/sqrt(42);
-1/sqrt(42) + j*5/sqrt(42);
-1/sqrt(42) + j*7/sqrt(42);
-5/sqrt(42) + j*3/sqrt(42);
-5/sqrt(42) + j*1/sqrt(42);
-7/sqrt(42) + j*3/sqrt(42);
-7/sqrt(42) + j*1/sqrt(42);
-5/sqrt(42) + j*5/sqrt(42);
-5/sqrt(42) + j*7/sqrt(42);
-7/sqrt(42) + j*5/sqrt(42);
-7/sqrt(42) + j*7/sqrt(42);
-3/sqrt(42) - j*3/sqrt(42);
-3/sqrt(42) - j*1/sqrt(42);
-1/sqrt(42) - j*3/sqrt(42);
-1/sqrt(42) - j*1/sqrt(42);
-3/sqrt(42) - j*5/sqrt(42);
-3/sqrt(42) - j*7/sqrt(42);
-1/sqrt(42) - j*5/sqrt(42);
-1/sqrt(42) - j*7/sqrt(42);
-5/sqrt(42) - j*3/sqrt(42);
-5/sqrt(42) - j*1/sqrt(42);
-7/sqrt(42) - j*3/sqrt(42);
-7/sqrt(42) - j*1/sqrt(42);
-5/sqrt(42) - j*5/sqrt(42);
-5/sqrt(42) - j*7/sqrt(42);
-7/sqrt(42) - j*5/sqrt(42);
-7/sqrt(42) - j*7/sqrt(42)];
QAM256 = [5/sqrt(170) + j*5/sqrt(170);
5/sqrt(170) + j*7/sqrt(170);
7/sqrt(170) + j*5/sqrt(170);
7/sqrt(170) + j*7/sqrt(170);
5/sqrt(170) + j*3/sqrt(170);
5/sqrt(170) + j*1/sqrt(170);
7/sqrt(170) + j*3/sqrt(170);
7/sqrt(170) + j*1/sqrt(170);
3/sqrt(170) + j*5/sqrt(170);
3/sqrt(170) + j*7/sqrt(170);
1/sqrt(170) + j*5/sqrt(170);
1/sqrt(170) + j*7/sqrt(170);
3/sqrt(170) + j*3/sqrt(170);
3/sqrt(170) + j*1/sqrt(170);
1/sqrt(170) + j*3/sqrt(170);
1/sqrt(170) + j*1/sqrt(170);
5/sqrt(170) + j*11/sqrt(170);
5/sqrt(170) + j*9/sqrt(170);
7/sqrt(170) + j*11/sqrt(170);
7/sqrt(170) + j*9/sqrt(170);
5/sqrt(170) + j*13/sqrt(170);
5/sqrt(170) + j*15/sqrt(170);
7/sqrt(170) + j*13/sqrt(170);
7/sqrt(170) + j*15/sqrt(170);
3/sqrt(170) + j*11/sqrt(170);
3/sqrt(170) + j*9/sqrt(170);
1/sqrt(170) + j*11/sqrt(170);
1/sqrt(170) + j*9/sqrt(170);
3/sqrt(170) + j*13/sqrt(170);
3/sqrt(170) + j*15/sqrt(170);
1/sqrt(170) + j*13/sqrt(170);
1/sqrt(170) + j*15/sqrt(170);
11/sqrt(170) + j*5/sqrt(170);
11/sqrt(170) + j*7/sqrt(170);
9/sqrt(170) + j*5/sqrt(170);
9/sqrt(170) + j*7/sqrt(170);
11/sqrt(170) + j*3/sqrt(170);
11/sqrt(170) + j*1/sqrt(170);
9/sqrt(170) + j*3/sqrt(170);
9/sqrt(170) + j*1/sqrt(170);
13/sqrt(170) + j*5/sqrt(170);
13/sqrt(170) + j*7/sqrt(170);
15/sqrt(170) + j*5/sqrt(170);
15/sqrt(170) + j*7/sqrt(170);
13/sqrt(170) + j*3/sqrt(170);
13/sqrt(170) + j*1/sqrt(170);
15/sqrt(170) + j*3/sqrt(170);
15/sqrt(170) + j*1/sqrt(170);
11/sqrt(170) + j*11/sqrt(170);
11/sqrt(170) + j*9/sqrt(170);
9/sqrt(170) + j*11/sqrt(170);
9/sqrt(170) + j*9/sqrt(170);
11/sqrt(170) + j*13/sqrt(170);
11/sqrt(170) + j*15/sqrt(170);
9/sqrt(170) + j*13/sqrt(170);
9/sqrt(170) + j*15/sqrt(170);
13/sqrt(170) + j*11/sqrt(170);
13/sqrt(170) + j*9/sqrt(170);
15/sqrt(170) + j*11/sqrt(170);
15/sqrt(170) + j*9/sqrt(170);
13/sqrt(170) + j*13/sqrt(170);
13/sqrt(170) + j*15/sqrt(170);
15/sqrt(170) + j*13/sqrt(170);
15/sqrt(170) + j*15/sqrt(170);
5/sqrt(170) - j*5/sqrt(170);
5/sqrt(170) - j*7/sqrt(170);
7/sqrt(170) - j*5/sqrt(170);
7/sqrt(170) - j*7/sqrt(170);
5/sqrt(170) - j*3/sqrt(170);
5/sqrt(170) - j*1/sqrt(170);
7/sqrt(170) - j*3/sqrt(170);
7/sqrt(170) - j*1/sqrt(170);
3/sqrt(170) - j*5/sqrt(170);
3/sqrt(170) - j*7/sqrt(170);
1/sqrt(170) - j*5/sqrt(170);
1/sqrt(170) - j*7/sqrt(170);
3/sqrt(170) - j*3/sqrt(170);
3/sqrt(170) - j*1/sqrt(170);
1/sqrt(170) - j*3/sqrt(170);
1/sqrt(170) - j*1/sqrt(170);
5/sqrt(170) - j*11/sqrt(170);
5/sqrt(170) - j*9/sqrt(170);
7/sqrt(170) - j*11/sqrt(170);
7/sqrt(170) - j*9/sqrt(170);
5/sqrt(170) - j*13/sqrt(170);
5/sqrt(170) - j*15/sqrt(170);
7/sqrt(170) - j*13/sqrt(170);
7/sqrt(170) - j*15/sqrt(170);
3/sqrt(170) - j*11/sqrt(170);
3/sqrt(170) - j*9/sqrt(170);
1/sqrt(170) - j*11/sqrt(170);
1/sqrt(170) - j*9/sqrt(170);
3/sqrt(170) - j*13/sqrt(170);
3/sqrt(170) - j*15/sqrt(170);
1/sqrt(170) - j*13/sqrt(170);
1/sqrt(170) - j*15/sqrt(170);
11/sqrt(170) - j*5/sqrt(170);
11/sqrt(170) - j*7/sqrt(170);
9/sqrt(170) - j*5/sqrt(170);
9/sqrt(170) - j*7/sqrt(170);
11/sqrt(170) - j*3/sqrt(170);
11/sqrt(170) - j*1/sqrt(170);
9/sqrt(170) - j*3/sqrt(170);
9/sqrt(170) - j*1/sqrt(170);
13/sqrt(170) - j*5/sqrt(170);
13/sqrt(170) - j*7/sqrt(170);
15/sqrt(170) - j*5/sqrt(170);
15/sqrt(170) - j*7/sqrt(170);
13/sqrt(170) - j*3/sqrt(170);
13/sqrt(170) - j*1/sqrt(170);
15/sqrt(170) - j*3/sqrt(170);
15/sqrt(170) - j*1/sqrt(170);
11/sqrt(170) - j*11/sqrt(170);
11/sqrt(170) - j*9/sqrt(170);
9/sqrt(170) - j*11/sqrt(170);
9/sqrt(170) - j*9/sqrt(170);
11/sqrt(170) - j*13/sqrt(170);
11/sqrt(170) - j*15/sqrt(170);
9/sqrt(170) - j*13/sqrt(170);
9/sqrt(170) - j*15/sqrt(170);
13/sqrt(170) - j*11/sqrt(170);
13/sqrt(170) - j*9/sqrt(170);
15/sqrt(170) - j*11/sqrt(170);
15/sqrt(170) - j*9/sqrt(170);
13/sqrt(170) - j*13/sqrt(170);
13/sqrt(170) - j*15/sqrt(170);
15/sqrt(170) - j*13/sqrt(170);
15/sqrt(170) - j*15/sqrt(170);
-5/sqrt(170) + j*5/sqrt(170);
-5/sqrt(170) + j*7/sqrt(170);
-7/sqrt(170) + j*5/sqrt(170);
-7/sqrt(170) + j*7/sqrt(170);
-5/sqrt(170) + j*3/sqrt(170);
-5/sqrt(170) + j*1/sqrt(170);
-7/sqrt(170) + j*3/sqrt(170);
-7/sqrt(170) + j*1/sqrt(170);
-3/sqrt(170) + j*5/sqrt(170);
-3/sqrt(170) + j*7/sqrt(170);
-1/sqrt(170) + j*5/sqrt(170);
-1/sqrt(170) + j*7/sqrt(170);
-3/sqrt(170) + j*3/sqrt(170);
-3/sqrt(170) + j*1/sqrt(170);
-1/sqrt(170) + j*3/sqrt(170);
-1/sqrt(170) + j*1/sqrt(170);
-5/sqrt(170) + j*11/sqrt(170);
-5/sqrt(170) + j*9/sqrt(170);
-7/sqrt(170) + j*11/sqrt(170);
-7/sqrt(170) + j*9/sqrt(170);
-5/sqrt(170) + j*13/sqrt(170);
-5/sqrt(170) + j*15/sqrt(170);
-7/sqrt(170) + j*13/sqrt(170);
-7/sqrt(170) + j*15/sqrt(170);
-3/sqrt(170) + j*11/sqrt(170);
-3/sqrt(170) + j*9/sqrt(170);
-1/sqrt(170) + j*11/sqrt(170);
-1/sqrt(170) + j*9/sqrt(170);
-3/sqrt(170) + j*13/sqrt(170);
-3/sqrt(170) + j*15/sqrt(170);
-1/sqrt(170) + j*13/sqrt(170);
-1/sqrt(170) + j*15/sqrt(170);
-11/sqrt(170) + j*5/sqrt(170);
-11/sqrt(170) + j*7/sqrt(170);
-9/sqrt(170) + j*5/sqrt(170);
-9/sqrt(170) + j*7/sqrt(170);
-11/sqrt(170) + j*3/sqrt(170);
-11/sqrt(170) + j*1/sqrt(170);
-9/sqrt(170) + j*3/sqrt(170);
-9/sqrt(170) + j*1/sqrt(170);
-13/sqrt(170) + j*5/sqrt(170);
-13/sqrt(170) + j*7/sqrt(170);
-15/sqrt(170) + j*5/sqrt(170);
-15/sqrt(170) + j*7/sqrt(170);
-13/sqrt(170) + j*3/sqrt(170);
-13/sqrt(170) + j*1/sqrt(170);
-15/sqrt(170) + j*3/sqrt(170);
-15/sqrt(170) + j*1/sqrt(170);
-11/sqrt(170) + j*11/sqrt(170);
-11/sqrt(170) + j*9/sqrt(170);
-9/sqrt(170) + j*11/sqrt(170);
-9/sqrt(170) + j*9/sqrt(170);
-11/sqrt(170) + j*13/sqrt(170);
-11/sqrt(170) + j*15/sqrt(170);
-9/sqrt(170) + j*13/sqrt(170);
-9/sqrt(170) + j*15/sqrt(170);
-13/sqrt(170) + j*11/sqrt(170);
-13/sqrt(170) + j*9/sqrt(170);
-15/sqrt(170) + j*11/sqrt(170);
-15/sqrt(170) + j*9/sqrt(170);
-13/sqrt(170) + j*13/sqrt(170);
-13/sqrt(170) + j*15/sqrt(170);
-15/sqrt(170) + j*13/sqrt(170);
-15/sqrt(170) + j*15/sqrt(170);
-5/sqrt(170) - j*5/sqrt(170);
-5/sqrt(170) - j*7/sqrt(170);
-7/sqrt(170) - j*5/sqrt(170);
-7/sqrt(170) - j*7/sqrt(170);
-5/sqrt(170) - j*3/sqrt(170);
-5/sqrt(170) - j*1/sqrt(170);
-7/sqrt(170) - j*3/sqrt(170);
-7/sqrt(170) - j*1/sqrt(170);
-3/sqrt(170) - j*5/sqrt(170);
-3/sqrt(170) - j*7/sqrt(170);
-1/sqrt(170) - j*5/sqrt(170);
-1/sqrt(170) - j*7/sqrt(170);
-3/sqrt(170) - j*3/sqrt(170);
-3/sqrt(170) - j*1/sqrt(170);
-1/sqrt(170) - j*3/sqrt(170);
-1/sqrt(170) - j*1/sqrt(170);
-5/sqrt(170) - j*11/sqrt(170);
-5/sqrt(170) - j*9/sqrt(170);
-7/sqrt(170) - j*11/sqrt(170);
-7/sqrt(170) - j*9/sqrt(170);
-5/sqrt(170) - j*13/sqrt(170);
-5/sqrt(170) - j*15/sqrt(170);
-7/sqrt(170) - j*13/sqrt(170);
-7/sqrt(170) - j*15/sqrt(170);
-3/sqrt(170) - j*11/sqrt(170);
-3/sqrt(170) - j*9/sqrt(170);
-1/sqrt(170) - j*11/sqrt(170);
-1/sqrt(170) - j*9/sqrt(170);
-3/sqrt(170) - j*13/sqrt(170);
-3/sqrt(170) - j*15/sqrt(170);
-1/sqrt(170) - j*13/sqrt(170);
-1/sqrt(170) - j*15/sqrt(170);
-11/sqrt(170) - j*5/sqrt(170);
-11/sqrt(170) - j*7/sqrt(170);
-9/sqrt(170) - j*5/sqrt(170);
-9/sqrt(170) - j*7/sqrt(170);
-11/sqrt(170) - j*3/sqrt(170);
-11/sqrt(170) - j*1/sqrt(170);
-9/sqrt(170) - j*3/sqrt(170);
-9/sqrt(170) - j*1/sqrt(170);
-13/sqrt(170) - j*5/sqrt(170);
-13/sqrt(170) - j*7/sqrt(170);
-15/sqrt(170) - j*5/sqrt(170);
-15/sqrt(170) - j*7/sqrt(170);
-13/sqrt(170) - j*3/sqrt(170);
-13/sqrt(170) - j*1/sqrt(170);
-15/sqrt(170) - j*3/sqrt(170);
-15/sqrt(170) - j*1/sqrt(170);
-11/sqrt(170) - j*11/sqrt(170);
-11/sqrt(170) - j*9/sqrt(170);
-9/sqrt(170) - j*11/sqrt(170);
-9/sqrt(170) - j*9/sqrt(170);
-11/sqrt(170) - j*13/sqrt(170);
-11/sqrt(170) - j*15/sqrt(170);
-9/sqrt(170) - j*13/sqrt(170);
-9/sqrt(170) - j*15/sqrt(170);
-13/sqrt(170) - j*11/sqrt(170);
-13/sqrt(170) - j*9/sqrt(170);
-15/sqrt(170) - j*11/sqrt(170);
-15/sqrt(170) - j*9/sqrt(170);
-13/sqrt(170) - j*13/sqrt(170);
-13/sqrt(170) - j*15/sqrt(170);
-15/sqrt(170) - j*13/sqrt(170);
-15/sqrt(170) - j*15/sqrt(170)];
subplot(1,5,1);
plot(real(BPSK),imag(BPSK),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
subplot(1,5,2);
plot(real(QPSK),imag(QPSK),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
subplot(1,5,3);
plot(real(QAM16),imag(QAM16),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
subplot(1,5,4);
plot(real(QAM64),imag(QAM64),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
subplot(1,5,5);
plot(real(QAM256),imag(QAM256),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
List 2 - Matlab code for constellations with AWGN
List 2 produces one row of the SNR plots per run. It repeats the arrays of List 1, draws 10000 random symbols for each scheme, and adds complex Gaussian noise scaled to the measured symbol energy. To get the six rows, set SNR_dB to 30, 25, 20, 10, 5 and 0 and run the script once for each value.
Check three details before you reuse it. First, the line marked in red is the only one to change between runs. Second, the loops grow sBPSK and the other arrays one element at a time. This is slow, but it is statistically the same as indexing each array with one randi call. Third, randn draws I and Q separately with the same standard deviation, so the noise power splits equally between the two axes.
clear all;
BPSK = [1/sqrt(2) + j*1/sqrt(2);
-1/sqrt(2) - j*1/sqrt(2)];
QPSK = [1/sqrt(2) + j*1/sqrt(2);
1/sqrt(2) - j*1/sqrt(2);
-1/sqrt(2) + j*1/sqrt(2);
-1/sqrt(2) - j*1/sqrt(2)];
QAM16 = [1/sqrt(10) + j*1/sqrt(10);
1/sqrt(10) + j*3/sqrt(10);
3/sqrt(10) + j*1/sqrt(10);
3/sqrt(10) + j*3/sqrt(10);
1/sqrt(10) - j*1/sqrt(10);
1/sqrt(10) - j*3/sqrt(10);
3/sqrt(10) - j*1/sqrt(10);
3/sqrt(10) - j*3/sqrt(10);
-1/sqrt(10) + j*1/sqrt(10);
-1/sqrt(10) + j*3/sqrt(10);
-3/sqrt(10) + j*1/sqrt(10);
-3/sqrt(10) + j*3/sqrt(10);
-1/sqrt(10) - j*1/sqrt(10);
-1/sqrt(10) - j*3/sqrt(10);
-3/sqrt(10) - j*1/sqrt(10);
-3/sqrt(10) - j*3/sqrt(10)];
QAM64 = [3/sqrt(42) + j*3/sqrt(42);
3/sqrt(42) + j*1/sqrt(42);
1/sqrt(42) + j*3/sqrt(42);
1/sqrt(42) + j*1/sqrt(42);
3/sqrt(42) + j*5/sqrt(42);
3/sqrt(42) + j*7/sqrt(42);
1/sqrt(42) + j*5/sqrt(42);
1/sqrt(42) + j*7/sqrt(42);
5/sqrt(42) + j*3/sqrt(42);
5/sqrt(42) + j*1/sqrt(42);
7/sqrt(42) + j*3/sqrt(42);
7/sqrt(42) + j*1/sqrt(42);
5/sqrt(42) + j*5/sqrt(42);
5/sqrt(42) + j*7/sqrt(42);
7/sqrt(42) + j*5/sqrt(42);
7/sqrt(42) + j*7/sqrt(42);
3/sqrt(42) - j*3/sqrt(42);
3/sqrt(42) - j*1/sqrt(42);
1/sqrt(42) - j*3/sqrt(42);
1/sqrt(42) - j*1/sqrt(42);
3/sqrt(42) - j*5/sqrt(42);
3/sqrt(42) - j*7/sqrt(42);
1/sqrt(42) - j*5/sqrt(42);
1/sqrt(42) - j*7/sqrt(42);
5/sqrt(42) - j*3/sqrt(42);
5/sqrt(42) - j*1/sqrt(42);
7/sqrt(42) - j*3/sqrt(42);
7/sqrt(42) - j*1/sqrt(42);
5/sqrt(42) - j*5/sqrt(42);
5/sqrt(42) - j*7/sqrt(42);
7/sqrt(42) - j*5/sqrt(42);
7/sqrt(42) - j*7/sqrt(42);
-3/sqrt(42) + j*3/sqrt(42);
-3/sqrt(42) + j*1/sqrt(42);
-1/sqrt(42) + j*3/sqrt(42);
-1/sqrt(42) + j*1/sqrt(42);
-3/sqrt(42) + j*5/sqrt(42);
-3/sqrt(42) + j*7/sqrt(42);
-1/sqrt(42) + j*5/sqrt(42);
-1/sqrt(42) + j*7/sqrt(42);
-5/sqrt(42) + j*3/sqrt(42);
-5/sqrt(42) + j*1/sqrt(42);
-7/sqrt(42) + j*3/sqrt(42);
-7/sqrt(42) + j*1/sqrt(42);
-5/sqrt(42) + j*5/sqrt(42);
-5/sqrt(42) + j*7/sqrt(42);
-7/sqrt(42) + j*5/sqrt(42);
-7/sqrt(42) + j*7/sqrt(42);
-3/sqrt(42) - j*3/sqrt(42);
-3/sqrt(42) - j*1/sqrt(42);
-1/sqrt(42) - j*3/sqrt(42);
-1/sqrt(42) - j*1/sqrt(42);
-3/sqrt(42) - j*5/sqrt(42);
-3/sqrt(42) - j*7/sqrt(42);
-1/sqrt(42) - j*5/sqrt(42);
-1/sqrt(42) - j*7/sqrt(42);
-5/sqrt(42) - j*3/sqrt(42);
-5/sqrt(42) - j*1/sqrt(42);
-7/sqrt(42) - j*3/sqrt(42);
-7/sqrt(42) - j*1/sqrt(42);
-5/sqrt(42) - j*5/sqrt(42);
-5/sqrt(42) - j*7/sqrt(42);
-7/sqrt(42) - j*5/sqrt(42);
-7/sqrt(42) - j*7/sqrt(42)];
QAM256 = [5/sqrt(170) + j*5/sqrt(170);
5/sqrt(170) + j*7/sqrt(170);
7/sqrt(170) + j*5/sqrt(170);
7/sqrt(170) + j*7/sqrt(170);
5/sqrt(170) + j*3/sqrt(170);
5/sqrt(170) + j*1/sqrt(170);
7/sqrt(170) + j*3/sqrt(170);
7/sqrt(170) + j*1/sqrt(170);
3/sqrt(170) + j*5/sqrt(170);
3/sqrt(170) + j*7/sqrt(170);
1/sqrt(170) + j*5/sqrt(170);
1/sqrt(170) + j*7/sqrt(170);
3/sqrt(170) + j*3/sqrt(170);
3/sqrt(170) + j*1/sqrt(170);
1/sqrt(170) + j*3/sqrt(170);
1/sqrt(170) + j*1/sqrt(170);
5/sqrt(170) + j*11/sqrt(170);
5/sqrt(170) + j*9/sqrt(170);
7/sqrt(170) + j*11/sqrt(170);
7/sqrt(170) + j*9/sqrt(170);
5/sqrt(170) + j*13/sqrt(170);
5/sqrt(170) + j*15/sqrt(170);
7/sqrt(170) + j*13/sqrt(170);
7/sqrt(170) + j*15/sqrt(170);
3/sqrt(170) + j*11/sqrt(170);
3/sqrt(170) + j*9/sqrt(170);
1/sqrt(170) + j*11/sqrt(170);
1/sqrt(170) + j*9/sqrt(170);
3/sqrt(170) + j*13/sqrt(170);
3/sqrt(170) + j*15/sqrt(170);
1/sqrt(170) + j*13/sqrt(170);
1/sqrt(170) + j*15/sqrt(170);
11/sqrt(170) + j*5/sqrt(170);
11/sqrt(170) + j*7/sqrt(170);
9/sqrt(170) + j*5/sqrt(170);
9/sqrt(170) + j*7/sqrt(170);
11/sqrt(170) + j*3/sqrt(170);
11/sqrt(170) + j*1/sqrt(170);
9/sqrt(170) + j*3/sqrt(170);
9/sqrt(170) + j*1/sqrt(170);
13/sqrt(170) + j*5/sqrt(170);
13/sqrt(170) + j*7/sqrt(170);
15/sqrt(170) + j*5/sqrt(170);
15/sqrt(170) + j*7/sqrt(170);
13/sqrt(170) + j*3/sqrt(170);
13/sqrt(170) + j*1/sqrt(170);
15/sqrt(170) + j*3/sqrt(170);
15/sqrt(170) + j*1/sqrt(170);
11/sqrt(170) + j*11/sqrt(170);
11/sqrt(170) + j*9/sqrt(170);
9/sqrt(170) + j*11/sqrt(170);
9/sqrt(170) + j*9/sqrt(170);
11/sqrt(170) + j*13/sqrt(170);
11/sqrt(170) + j*15/sqrt(170);
9/sqrt(170) + j*13/sqrt(170);
9/sqrt(170) + j*15/sqrt(170);
13/sqrt(170) + j*11/sqrt(170);
13/sqrt(170) + j*9/sqrt(170);
15/sqrt(170) + j*11/sqrt(170);
15/sqrt(170) + j*9/sqrt(170);
13/sqrt(170) + j*13/sqrt(170);
13/sqrt(170) + j*15/sqrt(170);
15/sqrt(170) + j*13/sqrt(170);
15/sqrt(170) + j*15/sqrt(170);
5/sqrt(170) - j*5/sqrt(170);
5/sqrt(170) - j*7/sqrt(170);
7/sqrt(170) - j*5/sqrt(170);
7/sqrt(170) - j*7/sqrt(170);
5/sqrt(170) - j*3/sqrt(170);
5/sqrt(170) - j*1/sqrt(170);
7/sqrt(170) - j*3/sqrt(170);
7/sqrt(170) - j*1/sqrt(170);
3/sqrt(170) - j*5/sqrt(170);
3/sqrt(170) - j*7/sqrt(170);
1/sqrt(170) - j*5/sqrt(170);
1/sqrt(170) - j*7/sqrt(170);
3/sqrt(170) - j*3/sqrt(170);
3/sqrt(170) - j*1/sqrt(170);
1/sqrt(170) - j*3/sqrt(170);
1/sqrt(170) - j*1/sqrt(170);
5/sqrt(170) - j*11/sqrt(170);
5/sqrt(170) - j*9/sqrt(170);
7/sqrt(170) - j*11/sqrt(170);
7/sqrt(170) - j*9/sqrt(170);
5/sqrt(170) - j*13/sqrt(170);
5/sqrt(170) - j*15/sqrt(170);
7/sqrt(170) - j*13/sqrt(170);
7/sqrt(170) - j*15/sqrt(170);
3/sqrt(170) - j*11/sqrt(170);
3/sqrt(170) - j*9/sqrt(170);
1/sqrt(170) - j*11/sqrt(170);
1/sqrt(170) - j*9/sqrt(170);
3/sqrt(170) - j*13/sqrt(170);
3/sqrt(170) - j*15/sqrt(170);
1/sqrt(170) - j*13/sqrt(170);
1/sqrt(170) - j*15/sqrt(170);
11/sqrt(170) - j*5/sqrt(170);
11/sqrt(170) - j*7/sqrt(170);
9/sqrt(170) - j*5/sqrt(170);
9/sqrt(170) - j*7/sqrt(170);
11/sqrt(170) - j*3/sqrt(170);
11/sqrt(170) - j*1/sqrt(170);
9/sqrt(170) - j*3/sqrt(170);
9/sqrt(170) - j*1/sqrt(170);
13/sqrt(170) - j*5/sqrt(170);
13/sqrt(170) - j*7/sqrt(170);
15/sqrt(170) - j*5/sqrt(170);
15/sqrt(170) - j*7/sqrt(170);
13/sqrt(170) - j*3/sqrt(170);
13/sqrt(170) - j*1/sqrt(170);
15/sqrt(170) - j*3/sqrt(170);
15/sqrt(170) - j*1/sqrt(170);
11/sqrt(170) - j*11/sqrt(170);
11/sqrt(170) - j*9/sqrt(170);
9/sqrt(170) - j*11/sqrt(170);
9/sqrt(170) - j*9/sqrt(170);
11/sqrt(170) - j*13/sqrt(170);
11/sqrt(170) - j*15/sqrt(170);
9/sqrt(170) - j*13/sqrt(170);
9/sqrt(170) - j*15/sqrt(170);
13/sqrt(170) - j*11/sqrt(170);
13/sqrt(170) - j*9/sqrt(170);
15/sqrt(170) - j*11/sqrt(170);
15/sqrt(170) - j*9/sqrt(170);
13/sqrt(170) - j*13/sqrt(170);
13/sqrt(170) - j*15/sqrt(170);
15/sqrt(170) - j*13/sqrt(170);
15/sqrt(170) - j*15/sqrt(170);
-5/sqrt(170) + j*5/sqrt(170);
-5/sqrt(170) + j*7/sqrt(170);
-7/sqrt(170) + j*5/sqrt(170);
-7/sqrt(170) + j*7/sqrt(170);
-5/sqrt(170) + j*3/sqrt(170);
-5/sqrt(170) + j*1/sqrt(170);
-7/sqrt(170) + j*3/sqrt(170);
-7/sqrt(170) + j*1/sqrt(170);
-3/sqrt(170) + j*5/sqrt(170);
-3/sqrt(170) + j*7/sqrt(170);
-1/sqrt(170) + j*5/sqrt(170);
-1/sqrt(170) + j*7/sqrt(170);
-3/sqrt(170) + j*3/sqrt(170);
-3/sqrt(170) + j*1/sqrt(170);
-1/sqrt(170) + j*3/sqrt(170);
-1/sqrt(170) + j*1/sqrt(170);
-5/sqrt(170) + j*11/sqrt(170);
-5/sqrt(170) + j*9/sqrt(170);
-7/sqrt(170) + j*11/sqrt(170);
-7/sqrt(170) + j*9/sqrt(170);
-5/sqrt(170) + j*13/sqrt(170);
-5/sqrt(170) + j*15/sqrt(170);
-7/sqrt(170) + j*13/sqrt(170);
-7/sqrt(170) + j*15/sqrt(170);
-3/sqrt(170) + j*11/sqrt(170);
-3/sqrt(170) + j*9/sqrt(170);
-1/sqrt(170) + j*11/sqrt(170);
-1/sqrt(170) + j*9/sqrt(170);
-3/sqrt(170) + j*13/sqrt(170);
-3/sqrt(170) + j*15/sqrt(170);
-1/sqrt(170) + j*13/sqrt(170);
-1/sqrt(170) + j*15/sqrt(170);
-11/sqrt(170) + j*5/sqrt(170);
-11/sqrt(170) + j*7/sqrt(170);
-9/sqrt(170) + j*5/sqrt(170);
-9/sqrt(170) + j*7/sqrt(170);
-11/sqrt(170) + j*3/sqrt(170);
-11/sqrt(170) + j*1/sqrt(170);
-9/sqrt(170) + j*3/sqrt(170);
-9/sqrt(170) + j*1/sqrt(170);
-13/sqrt(170) + j*5/sqrt(170);
-13/sqrt(170) + j*7/sqrt(170);
-15/sqrt(170) + j*5/sqrt(170);
-15/sqrt(170) + j*7/sqrt(170);
-13/sqrt(170) + j*3/sqrt(170);
-13/sqrt(170) + j*1/sqrt(170);
-15/sqrt(170) + j*3/sqrt(170);
-15/sqrt(170) + j*1/sqrt(170);
-11/sqrt(170) + j*11/sqrt(170);
-11/sqrt(170) + j*9/sqrt(170);
-9/sqrt(170) + j*11/sqrt(170);
-9/sqrt(170) + j*9/sqrt(170);
-11/sqrt(170) + j*13/sqrt(170);
-11/sqrt(170) + j*15/sqrt(170);
-9/sqrt(170) + j*13/sqrt(170);
-9/sqrt(170) + j*15/sqrt(170);
-13/sqrt(170) + j*11/sqrt(170);
-13/sqrt(170) + j*9/sqrt(170);
-15/sqrt(170) + j*11/sqrt(170);
-15/sqrt(170) + j*9/sqrt(170);
-13/sqrt(170) + j*13/sqrt(170);
-13/sqrt(170) + j*15/sqrt(170);
-15/sqrt(170) + j*13/sqrt(170);
-15/sqrt(170) + j*15/sqrt(170);
-5/sqrt(170) - j*5/sqrt(170);
-5/sqrt(170) - j*7/sqrt(170);
-7/sqrt(170) - j*5/sqrt(170);
-7/sqrt(170) - j*7/sqrt(170);
-5/sqrt(170) - j*3/sqrt(170);
-5/sqrt(170) - j*1/sqrt(170);
-7/sqrt(170) - j*3/sqrt(170);
-7/sqrt(170) - j*1/sqrt(170);
-3/sqrt(170) - j*5/sqrt(170);
-3/sqrt(170) - j*7/sqrt(170);
-1/sqrt(170) - j*5/sqrt(170);
-1/sqrt(170) - j*7/sqrt(170);
-3/sqrt(170) - j*3/sqrt(170);
-3/sqrt(170) - j*1/sqrt(170);
-1/sqrt(170) - j*3/sqrt(170);
-1/sqrt(170) - j*1/sqrt(170);
-5/sqrt(170) - j*11/sqrt(170);
-5/sqrt(170) - j*9/sqrt(170);
-7/sqrt(170) - j*11/sqrt(170);
-7/sqrt(170) - j*9/sqrt(170);
-5/sqrt(170) - j*13/sqrt(170);
-5/sqrt(170) - j*15/sqrt(170);
-7/sqrt(170) - j*13/sqrt(170);
-7/sqrt(170) - j*15/sqrt(170);
-3/sqrt(170) - j*11/sqrt(170);
-3/sqrt(170) - j*9/sqrt(170);
-1/sqrt(170) - j*11/sqrt(170);
-1/sqrt(170) - j*9/sqrt(170);
-3/sqrt(170) - j*13/sqrt(170);
-3/sqrt(170) - j*15/sqrt(170);
-1/sqrt(170) - j*13/sqrt(170);
-1/sqrt(170) - j*15/sqrt(170);
-11/sqrt(170) - j*5/sqrt(170);
-11/sqrt(170) - j*7/sqrt(170);
-9/sqrt(170) - j*5/sqrt(170);
-9/sqrt(170) - j*7/sqrt(170);
-11/sqrt(170) - j*3/sqrt(170);
-11/sqrt(170) - j*1/sqrt(170);
-9/sqrt(170) - j*3/sqrt(170);
-9/sqrt(170) - j*1/sqrt(170);
-13/sqrt(170) - j*5/sqrt(170);
-13/sqrt(170) - j*7/sqrt(170);
-15/sqrt(170) - j*5/sqrt(170);
-15/sqrt(170) - j*7/sqrt(170);
-13/sqrt(170) - j*3/sqrt(170);
-13/sqrt(170) - j*1/sqrt(170);
-15/sqrt(170) - j*3/sqrt(170);
-15/sqrt(170) - j*1/sqrt(170);
-11/sqrt(170) - j*11/sqrt(170);
-11/sqrt(170) - j*9/sqrt(170);
-9/sqrt(170) - j*11/sqrt(170);
-9/sqrt(170) - j*9/sqrt(170);
-11/sqrt(170) - j*13/sqrt(170);
-11/sqrt(170) - j*15/sqrt(170);
-9/sqrt(170) - j*13/sqrt(170);
-9/sqrt(170) - j*15/sqrt(170);
-13/sqrt(170) - j*11/sqrt(170);
-13/sqrt(170) - j*9/sqrt(170);
-15/sqrt(170) - j*11/sqrt(170);
-15/sqrt(170) - j*9/sqrt(170);
-13/sqrt(170) - j*13/sqrt(170);
-13/sqrt(170) - j*15/sqrt(170);
-15/sqrt(170) - j*13/sqrt(170);
-15/sqrt(170) - j*15/sqrt(170)];
% Number of Symbols (Data Points)
N = 10000;
% Change this value and see how the result changes
SNR_dB = 30;
% Convert SNR from dB scale to Linear Scale
SNR_lin = 10 .^ (SNR_dB/10);
% Generate BPSK and AWGN
sBPSK = [];
for i = 1:N
idx = randi([1 length(BPSK)]);
sBPSK = [sBPSK BPSK(idx)];
end;
EavgBPSK = sum(abs(sBPSK) .^ 2)/N;
awgnSigmaBPSK = sqrt(EavgBPSK/(2*SNR_lin));
awgnBPSK = awgnSigmaBPSK*(randn(1,N)+j*randn(1,N));
yBPSK = sBPSK + awgnBPSK;
% Generate QPSK and AWGN
sQPSK = [];
for i = 1:N
idx = randi([1 length(QPSK)]);
sQPSK = [sQPSK QPSK(idx)];
end;
EavgQPSK = sum(abs(sQPSK) .^ 2)/N;
awgnSigmaQPSK = sqrt(EavgQPSK/(2*SNR_lin));
awgnQPSK = awgnSigmaQPSK*(randn(1,N)+j*randn(1,N));
yQPSK = sQPSK + awgnQPSK;
% Generate 16QAM and AWGN
sQAM16 = [];
for i = 1:N
idx = randi([1 length(QAM16)]);
sQAM16 = [sQAM16 QAM16(idx)];
end;
EavgQAM16 = sum(abs(sQAM16) .^ 2)/N;
awgnSigmaQAM16 = sqrt(EavgQAM16/(2*SNR_lin));
awgnQAM16 = awgnSigmaQAM16*(randn(1,N)+j*randn(1,N));
yQAM16 = sQAM16 + awgnQAM16;
% Generate 64QAM and AWGN
sQAM64 = [];
for i = 1:N
idx = randi([1 length(QAM64)]);
sQAM64 = [sQAM64 QAM64(idx)];
end;
EavgQAM64 = sum(abs(sQAM64) .^ 2)/N;
awgnSigmaQAM64 = sqrt(EavgQAM64/(2*SNR_lin));
awgnQAM64 = awgnSigmaQAM64*(randn(1,N)+j*randn(1,N));
yQAM64 = sQAM64 + awgnQAM64;
% Generate 256 QAM and AWGN
sQAM256 = [];
for i = 1:N
idx = randi([1 length(QAM256)]);
sQAM256 = [sQAM256 QAM256(idx)];
end;
EavgQAM256 = sum(abs(sQAM256) .^ 2)/N;
awgnSigmaQAM256 = sqrt(EavgQAM256/(2*SNR_lin));
awgnQAM256 = awgnSigmaQAM256*(randn(1,N)+j*randn(1,N));
yQAM256 = sQAM256 + awgnQAM256;
% Plot the constellation and noise for BPSK
subplot(1,5,1);
plot(real(yBPSK),imag(yBPSK),'ko','MarkerFaceColor',[0,0,0],'MarkerSize',1);
axis([-1.5 1.5 -1.5 1.5]);
hold on;
plot(real(BPSK),imag(BPSK),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
title(strcat('SNR=',num2str(SNR_dB),'dB'));
hold off;
% Plot the constellation and noise for QPSK
subplot(1,5,2);
plot(real(yQPSK),imag(yQPSK),'ko','MarkerFaceColor',[0,0,0],'MarkerSize',1);
axis([-1.5 1.5 -1.5 1.5]);
hold on;
plot(real(QPSK),imag(QPSK),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
title(strcat('SNR=',num2str(SNR_dB),'dB'));
hold off;
% Plot the constellation and noise for 16 QAM
subplot(1,5,3);
plot(real(yQAM16),imag(yQAM16),'ko','MarkerFaceColor',[0,0,0],'MarkerSize',1);
axis([-1.5 1.5 -1.5 1.5]);
hold on;
plot(real(QAM16),imag(QAM16),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
title(strcat('SNR=',num2str(SNR_dB),'dB'));
hold off;
% Plot the constellation and noise for 64 QAM
subplot(1,5,4);
plot(real(yQAM64),imag(yQAM64),'ko','MarkerFaceColor',[0,0,0],'MarkerSize',1);
axis([-1.5 1.5 -1.5 1.5]);
hold on;
plot(real(QAM64),imag(QAM64),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
title(strcat('SNR=',num2str(SNR_dB),'dB'));
hold off;
% Plot the constellation and noise for 256 QAM
subplot(1,5,5);
plot(real(yQAM256),imag(yQAM256),'ko','MarkerFaceColor',[0,0,0],'MarkerSize',1);
axis([-1.5 1.5 -1.5 1.5]);
hold on;
plot(real(QAM256),imag(QAM256),'ro','MarkerFaceColor',[1,0,0],'MarkerSize',2);
axis([-1.5 1.5 -1.5 1.5]);
title(strcat('SNR=',num2str(SNR_dB),'dB'));
hold off;
Reference
- 3GPP TS 36.211 v19.3.0 : Physical channels and modulation - clause 7.1 Modulation mapper, Table 5.3.2-1, Table 6.3.2-1
- 3GPP TS 36.101 v20.0.0 : UE radio transmission and reception - Table 6.5.2.1.1-1, EVM requirements
- 3GPP TS 36.213 v19.4.0 : Physical layer procedures - clause 7.2.3, CQI definition