QAM映射中功率归一化因子的理解

本文探讨了QAM调制中的缩放因子计算方法,并通过具体例子介绍了16-QAM和64-QAM的平均能量计算过程。文中还提供了一种简单的方法来确定M-QAM调制中确保符号平均能量为一所需的缩放因子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2011-03-08

转自http://www.dsplog.com/2007/09/23/scaling-factor-in-qam/

 

When QAM (Quadrature Amplitude Modulation) is used, typically one may find a scaling factor associated with the constellation mapping operation. It may be reasonably obvious that this scaling factor is for normalizing the average energy to one.

This post attempts to compute the average energy of the 16-QAM, 64-QAM and M-QAM constellation (where  is a power of 2), thanks to the nice example 5.16 in [DIG-COMM-BARRY-LEE-MESSERSCHMITT].

Consider a typical 16-QAM modulation scheme where the alphabets

 are used.

 

16_qam_constellation

 

Figure: 16QAM constellation mapping

Observations:

1. The number/type of the used constellation points in all the four quadrants are similar. Hence average energy computed over one quadrant is same as the energy over all the quadrants. The mean power can be computed over 16/4 = 4 constellation points.

2. The same alphabet set is used for real and imaginary axis. Hence energy of real and imaginary components are the same.

3. In each quadrant, the elements of each alphabet is used  times by real and imaginary part respectively.

Considering so the average energy of 16-QAM is,

.

Hence the constellation points of 16-QAM are normalized with the factor  to ensure that the average energy over all symbols is one.

Consider a 64-QAM modulation scheme with the alphabets

 

64_qam_constellation

 

Figure: 64QAM constellation mapping

Observations for 64-QAM:

1. Each quadrant has 16 constellation points

2. The energy of real and imaginary components are the same.

3. In each quadrant, the elements of each alphabet is used  times by real and imaginary part respectively.

Hence the constellation points of 64-QAM are normalized with the factor  to ensure that the average energy over all symbols is one.

Extending this to a general M-QAM constellation mapping, where  is a power of 2. The elements of the alphabet are

, where .

1. Each quadrant has  constellation points

2. The energy of real and imaginary components are the same.

3. In each quadrant, the elements of each alphabet is used  times by real and imaginary part respectively.

.

% Simple Matlab example

% QAM scaling factor
clear
clc
alpha_16qam = [-3 -1 1 3];
N = 10^5;
const_16qam = randsrc(1,N,alpha_16qam) + j*randsrc(1,N,alpha_16qam); % generating 16-QAM constellation points
energy_16qam = const_16qam*const_16qam’/N

alpha_64qam = [-7 -5 -3 -1 1 3 5 7];
const_64qam = randsrc(1,N,alpha_64qam) + j*randsrc(1,N,alpha_64qam); % generating 16-QAM constellation points
energy_64qam = const_64qam*const_64qam’/N

Can observe that energy_16qam and energy_64qam takes values close to 10 and 42 respectively.

Hope this helps.

Krishna

Reference

[DIG-COMM-BARRY-LEE-MESSERSCHMITT] Digital Communication: Third Edition, by John R. Barry, Edward A. Lee, David G. Messerschmitt

Please click here to SUBSCRIBE to newsletter and download the FREE e-Book on probability of error in AWGN. Thanks for visiting! Happy learning.

 

<think>好的,用户现在想查找关于16QAM的代码实现。我需要先回顾之前的对话和相关引用,确保回答准确。首先,用户之前的问题可能涉及调制技术,特别是16-QAM。根据引用[2],16-QAM每个符号代表4个比特,结合幅度和相位。现在需要生成代码示例,可能用Python实现。接下来,我需要考虑如何将比特转换为符号。通常,格雷码映射可以减少误码率,所以应该使用16-QAM的格雷编码星座图。需要确定符号的坐标,比如归一化的幅度,使得平均功率为1。常见的星座点坐标是±1和±3的归一化版本,这样计算平均功率时不会超过。然后,编写代码步骤:生成随机比特流,分成每组4比特,映射到对应的复数符号。可能需要使用字典或查找表来映射4位组合到对应的IQ值。归一化因子需要计算,比如sqrt(10),因为每个符号的功率是(1^2 +1^2+3^2 +3^2)/4 =10,所以归一化因子是sqrt(10)。接下来,生成代码时要注意正确性。比如,使用numpy库处理数组,比特到符号的转换可能需要遍历,或者用reshape和二进制转换。然后,绘制星座图,使用matplotlib的scatter函数,显示IQ点的分布。 测试部分,可能需要生成测试比特并验证映射是否正确。例如,输入0000应该对应到(-3+3j)/sqrt(10)吗?需要检查星座图的坐标定义是否正确,是否与标准一致。另外,引用[3]提到FBMC调制,但用户问题不涉及,所以可以忽略。引用[1]关于Reed-Solomon码可能不相关,但用户需要的是调制代码,所以专注于引用[2]的内容。 用户可能需要进一步的性能分析或应用场景,所以在相关问题中,可以提出误码率计算、与其他调制方式的比较,或者实际应用如Wi-Fi中的使用。确保问题相关且有帮助。最后,检查代码是否符合Python语法,是否正确处理比特分组,是否有归一化步骤,星座图是否正确显示。确保回答结构清晰,分步骤说明,引用正确来源,并在末尾添加相关问题。</think>### 16-QAM调制代码实现 以下是一个基于Python的16-QAM调制实现示例,包含比特到符号的映射和星座图绘制。 --- #### 1. 16-QAM调制原理 16-QAM将每4个比特映射为一个复数符号,通过组合不同的幅度和相位表示16种状态。其星座图通常采用格雷编码(相邻符号仅1位差异),以降低误码率[^2]。 #### 2. Python代码实现 ```python import numpy as np import matplotlib.pyplot as plt # 定义16-QAM映射表(归一化后) QAM16_MAP = { (0,0,0,0): (-3 + 3j)/np.sqrt(10), (0,0,0,1): (-3 + 1j)/np.sqrt(10), (0,0,1,0): (-3 - 3j)/np.sqrt(10), (0,0,1,1): (-3 - 1j)/np.sqrt(10), (0,1,0,0): (-1 + 3j)/np.sqrt(10), (0,1,0,1): (-1 + 1j)/np.sqrt(10), (0,1,1,0): (-1 - 3j)/np.sqrt(10), (0,1,1,1): (-1 - 1j)/np.sqrt(10), (1,0,0,0): (3 + 3j)/np.sqrt(10), (1,0,0,1): (3 + 1j)/np.sqrt(10), (1,0,1,0): (3 - 3j)/np.sqrt(10), (1,0,1,1): (3 - 1j)/np.sqrt(10), (1,1,0,0): (1 + 3j)/np.sqrt(10), (1,1,0,1): (1 + 1j)/np.sqrt(10), (1,1,1,0): (1 - 3j)/np.sqrt(10), (1,1,1,1): (1 - 1j)/np.sqrt(10) } def qam16_modulate(bits): # 将比特流分组成4位一组 symbols = [] for i in range(0, len(bits), 4): quad = tuple(bits[i:i+4]) symbols.append(QAM16_MAP[quad]) return np.array(symbols) # 生成测试比特流 bits = np.random.randint(0, 2, 4000) # 4000个随机比特 symbols = qam16_modulate(bits) # 绘制星座图 plt.figure(figsize=(8,6)) plt.scatter(np.real(symbols), np.imag(symbols), alpha=0.5) plt.title("16-QAM Constellation Diagram") plt.xlabel("In-phase (I)") plt.ylabel("Quadrature (Q)") plt.grid(True) plt.show() ``` --- #### 3. 关键说明 - **归一化因子**:$\sqrt{10}$用于确保符号平均功率为1,避免信号幅度过大[^2]。 - **格雷编码**:相邻符号仅1位差异(如`0000`和`0001`对应相邻星座点),提升抗噪声能力。 - **应用场景**:Wi-Fi(802.11a/g/n)、数字电视广播等高速通信系统[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值