news 2025/12/30 6:40:10

通信系统仿真:数字调制与解调技术_(46).QAM调制解调实验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
通信系统仿真:数字调制与解调技术_(46).QAM调制解调实验

QAM调制解调实验

1. QAM调制原理

1.1 正交振幅调制(QAM)概述

正交振幅调制(Quadrature Amplitude Modulation, QAM)是一种数字调制技术,通过同时改变载波的幅度和相位来传输信息。QAM 结合了幅度调制(AM)和相位调制(PM)的优点,能够在相同的带宽内传输更多的信息。QAM 调制通过将输入的二进制数据映射到一个复数平面上的点,这些点称为星座点(constellation points)。每个星座点代表一组特定的幅度和相位组合,从而实现高效的数据传输。

1.2 QAM 调制的基本过程

QAM 调制的基本过程可以分为以下几个步骤:

  1. 二进制数据映射:将输入的二进制数据序列映射到星座点上。
  2. 正交调制:将映射后的星座点转换为两个正交的载波信号。
  3. 信号合成:将两个正交的载波信号合成一个复信号。
  4. 信号发送:将合成的复信号通过传输信道发送出去。

1.3 QAM 调制的星座图

QAM 的星座图是一个二维平面,通常用笛卡尔坐标系表示。每个点代表一个特定的幅度和相位组合。常见的 QAM 调制方式有 4-QAM(即 QPSK)、16-QAM、64-QAM 等。星座点的数量决定了每个符号可以传输的比特数。例如,16-QAM 可以在每个符号中传输 4 个比特。

1.4 QAM 调制的数学表示

QAM 调制的数学表示可以通过以下公式来描述:

s(t)=I(t)cos⁡(2πfct)−Q(t)sin⁡(2πfct) s(t) = I(t) \cos(2\pi f_c t) - Q(t) \sin(2\pi f_c t)s(t)=I(t)cos(2πfct)Q(t)sin(2πfct)

其中:

  • s(t)s(t)s(t)是调制后的信号。
  • I(t)I(t)I(t)Q(t)Q(t)Q(t)分别是同相分量和正交分量。
  • fcf_cfc是载波频率。

2. QAM 解调原理

2.1 QAM 解调概述

QAM 解调是将接收到的复信号还原为原始的二进制数据序列的过程。解调过程通常包括以下几个步骤:

  1. 信号接收:从传输信道中接收复信号。
  2. 信号分离:将复信号分离为同相分量和正交分量。
  3. 星座图映射:将分离后的分量映射到星座图上,确定对应的星座点。
  4. 二进制数据还原:将确定的星座点转换为对应的二进制数据序列。

2.2 QAM 解调的基本过程

QAM 解调的基本过程可以分为以下几个步骤:

  1. 信号接收:接收通过传输信道传输的复信号r(t)r(t)r(t)
  2. 信号分离:将r(t)r(t)r(t)分离为同相分量Ir(t)I_r(t)Ir(t)和正交分量Qr(t)Q_r(t)Qr(t)
  3. 星座图映射:将Ir(t)I_r(t)Ir(t)Qr(t)Q_r(t)Qr(t)映射到星座图上,确定对应的星座点。
  4. 二进制数据还原:根据星座图上的点位置,还原为对应的二进制数据序列。

2.3 QAM 解调的数学表示

QAM 解调的数学表示可以通过以下公式来描述:

Ir(t)=r(t)cos⁡(2πfct) I_r(t) = r(t) \cos(2\pi f_c t)Ir(t)=r(t)cos(2πfct)
Qr(t)=−r(t)sin⁡(2πfct) Q_r(t) = -r(t) \sin(2\pi f_c t)Qr(t)=r(t)sin(2πfct)

其中:

  • r(t)r(t)r(t)是接收到的复信号。
  • Ir(t)I_r(t)Ir(t)Qr(t)Q_r(t)Qr(t)分别是接收到的同相分量和正交分量。

3. QAM 调制解调实验设计

3.1 实验目的

通过本实验,学生将了解 QAM 调制和解调的基本原理,并能够使用 MATLAB 或 Python 等工具实现 QAM 调制和解调的过程。实验将包括以下几个部分:

  1. 二进制数据生成:生成随机的二进制数据序列。
  2. QAM 调制:将生成的二进制数据映射到星座图上,并生成调制信号。
  3. 信道传输:通过一个简单的信道模型(如加性高斯白噪声信道)传输调制信号。
  4. QAM 解调:将接收到的信号解调并还原为原始的二进制数据序列。
  5. 性能评估:评估解调后的数据与原始数据的误码率(Bit Error Rate, BER)。

3.2 实验环境

实验环境建议使用 MATLAB 或 Python。以下是两种环境的基本配置:

  • MATLAB:确保安装了 Signal Processing Toolbox 和 Communications System Toolbox。
  • Python:确保安装了 NumPy、SciPy 和 Matplotlib 库。

3.3 实验步骤

3.3.1 生成二进制数据

首先,生成一个随机的二进制数据序列。以下是 Python 代码示例:

importnumpyasnp# 生成二进制数据序列defgenerate_binary_data(num_bits):""" 生成随机的二进制数据序列 参数: num_bits (int): 生成的二进制数据的长度 返回: np.array: 随机二进制数据序列 """returnnp.random.randint(0,2,num_bits)# 生成 1000 个二进制数据num_bits=1000binary_data=generate_binary_data(num_bits)print(binary_data)
3.3.2 QAM 调制

将生成的二进制数据映射到 QAM 星座图上,并生成调制信号。以下是 Python 代码示例:

importnumpyasnpimportmatplotlib.pyplotasplt# QAM 调制defqam_modulation(binary_data,M):""" QAM 调制 参数: binary_data (np.array): 二进制数据序列 M (int): 星座点的数量 返回: np.array: 调制后的复信号 """# 计算每个符号所需的比特数bits_per_symbol=int(np.log2(M))# 计算符号数量num_symbols=int(len(binary_data)/bits_per_symbol)# 将二进制数据转换为符号symbols=binary_data.reshape(num_symbols,bits_per_symbol)# 定义星座点constellation=np.array([1,1j,-1,-1j])# 4-QAM 示例ifM==16:constellation=np.array([1,1j,-1,-1j,2,2j,-2,-2j,3,3j,-3,-3j,4,4j,-4,-4j])elifM==64:constellation=np.array([1,1j,-1,-1j,2,2j,-2,-2j,3,3j,-3,-3j,4,4j,-4,-4j,5,5j,-5,-5j,6,6j,-6,-6j,7,7j,-7,-7j,8,8j,-8,-8j])# 将符号映射到星座点modulated_signal=np.zeros(num_symbols,dtype=complex)foriinrange(num_symbols):symbol_index=int(np.sum(symbols[i]*(2**np.arange(bits_per_symbol-1,-1,-1))))modulated_signal[i]=constellation[symbol_index]returnmodulated_signal# 4-QAM 调制M=4modulated_signal=qam_modulation(binary_data,M)print(modulated_signal)# 绘制星座图plt.scatter(np.real(modulated_signal),np.imag(modulated_signal))plt.title('4-QAM Constellation')plt.xlabel('In-Phase Component')plt.ylabel('Quadrature Component')plt.grid(True)plt.show()
3.3.3 信道传输

通过一个简单的加性高斯白噪声(Additive White Gaussian Noise, AWGN)信道模型传输调制信号。以下是 Python 代码示例:

# 信道传输defawgn_channel(signal,snr):""" 通过 AWGN 信道传输信号 参数: signal (np.array): 调制后的信号 snr (float): 信噪比(以 dB 为单位) 返回: np.array: 通过信道后的信号 """# 计算信号功率signal_power=np.mean(np.abs(signal)**2)# 计算噪声功率noise_power=signal_power/10**(snr/10)# 生成高斯白噪声noise=np.sqrt(noise_power)*(np.random.randn(len(signal))+1j*np.random.randn(len(signal)))# 传输信号received_signal=signal+noisereturnreceived_signal# 信噪比设置snr=10received_signal=awgn_channel(modulated_signal,snr)print(received_signal)# 绘制接收到的信号星座图plt.scatter(np.real(received_signal),np.imag(received_signal))plt.title('Received 4-QAM Constellation')plt.xlabel('In-Phase Component')plt.ylabel('Quadrature Component')plt.grid(True)plt.show()
3.3.4 QAM 解调

将接收到的信号解调并还原为原始的二进制数据序列。以下是 Python 代码示例:

# QAM 解调defqam_demodulation(received_signal,M):""" QAM 解调 参数: received_signal (np.array): 接收到的信号 M (int): 星座点的数量 返回: np.array: 解调后的二进制数据序列 """# 计算每个符号所需的比特数bits_per_symbol=int(np.log2(M))# 定义星座点constellation=np.array([1,1j,-1,-1j])# 4-QAM 示例ifM==16:constellation=np.array([1,1j,-1,-1j,2,2j,-2,-2j,3,3j,-3,-3j,4,4j,-4,-4j])elifM==64:constellation=np.array([1,1j,-1,-1j,2,2j,-2,-2j,3,3j,-3,-3j,4,4j,-4,-4j,5,5j,-5,-5j,6,6j,-6,-6j,7,7j,-7,-7j,8,8j,-8,-8j])# 解调信号demodulated_symbols=np.zeros(len(received_signal),dtype=int)foriinrange(len(received_signal)):distances=np.abs(received_signal[i]-constellation)symbol_index=np.argmin(distances)demodulated_symbols[i]=symbol_index# 将符号转换为二进制数据demodulated_data=np.zeros(len(demodulated_symbols)*bits_per_symbol,dtype=int)fori,symbol_indexinenumerate(demodulated_symbols):symbol_bits=np.array(list(np.binary_repr(symbol_index,bits_per_symbol)),dtype=int)demodulated_data[i*bits_per_symbol:(i+1)*bits_per_symbol]=symbol_bitsreturndemodulated_data# 4-QAM 解调demodulated_data=qam_demodulation(received_signal,M)print(demodulated_data)# 绘制解调后的二进制数据与原始数据的对比plt.figure(figsize=(12,6))plt.subplot(2,1,1)plt.plot(binary_data,label='Original Data')plt.title('Original Binary Data')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.subplot(2,1,2)plt.plot(demodulated_data,label='Demodulated Data')plt.title('Demodulated Binary Data')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.tight_layout()plt.show()
3.3.5 性能评估

评估解调后的数据与原始数据的误码率(Bit Error Rate, BER)。以下是 Python 代码示例:

# 计算误码率defcalculate_ber(original_data,demodulated_data):""" 计算误码率 参数: original_data (np.array): 原始二进制数据 demodulated_data (np.array): 解调后的二进制数据 返回: float: 误码率 """errors=np.sum(original_data!=demodulated_data)ber=errors/len(original_data)returnber# 计算误码率ber=calculate_ber(binary_data,demodulated_data)print(f'BER:{ber}')# 绘制不同信噪比下的误码率defplot_ber_vs_snr(binary_data,M,snr_range):""" 绘制不同信噪比下的误码率 参数: binary_data (np.array): 原始二进制数据 M (int): 星座点的数量 snr_range (list): 信噪比范围 """bers=[]forsnrinsnr_range:modulated_signal=qam_modulation(binary_data,M)received_signal=awgn_channel(modulated_signal,snr)demodulated_data=qam_demodulation(received_signal,M)ber=calculate_ber(binary_data,demodulated_data)bers.append(ber)plt.plot(snr_range,bers,marker='o')plt.title(f'BER vs SNR for{M}-QAM')plt.xlabel('SNR (dB)')plt.ylabel('BER')plt.grid(True)plt.show()# 绘制 4-QAM 的 BER vs SNRsnr_range=np.arange(0,20,2)plot_ber_vs_snr(binary_data,M,snr_range)

4. 实验结果分析

4.1 原始数据与调制信号

通过生成的二进制数据序列,我们将其映射到 4-QAM 星座图上,并生成调制信号。调制信号的星座图展示了各个星座点的位置及其在信道传输前后的变化。原始数据和调制信号的对比如下:

  • 原始数据:生成的随机二进制数据序列。
  • 调制信号:将二进制数据映射到 4-QAM 星座图上的复信号。

4.2 信道传输的影响

通过 AWGN 信道传输调制信号后,星座图上的点会受到噪声的影响,导致位置偏离。这种偏离会影响解调过程的准确性,从而影响最终的误码率。接收到的信号的星座图如下:

  • 信道传输前的星座图:清晰的星座点位置。
  • 信道传输后的星座图:受到噪声影响的星座点位置,点的位置会有所偏离。

4.3 解调后的数据

解调后的二进制数据序列与原始数据进行对比,可以观察到误码的情况。通过绘制原始数据和解调后的数据图,可以直观地看到误码的位置。解调后的数据如下:

  • 原始数据:生成的随机二进制数据序列。
  • 解调后的数据:通过 QAM 解调还原的二进制数据序列。

4.4 误码率分析

误码率(BER)是评估通信系统性能的重要指标。通过计算不同信噪比(SNR)下的误码率,可以绘制出 BER vs SNR 的曲线。该曲线展示了信噪比对误码率的影响,通常随着信噪比的增加,误码率会逐渐降低。误码率计算如下:

  • 信噪比范围:从 0 dB 到 20 dB,步长为 2 dB。
  • 误码率曲线:绘制不同信噪比下的误码率,观察误码率随信噪比变化的趋势。

5. 实验拓展

5.1 不同 QAM 调制方式的比较

可以通过改变星座点的数量(如 16-QAM、64-QAM 等),比较不同 QAM 调制方式的性能。以下是一个示例,展示了 16-QAM 和 64-QAM 的调制和解调过程:

# 16-QAM 调制M_16=16modulated_signal_16=qam_modulation(binary_data,M_16)received_signal_16=awgn_channel(modulated_signal_16,snr)demodulated_data_16=qam_demodulation(received_signal_16,M_16)ber_16=calculate_ber(binary_data,demodulated_data_16)print(f'16-QAM BER:{ber_16}')# 64-QAM 调制M_64=64modulated_signal_64=qam_modulation(binary_data,M_64)received_signal_64=awgn_channel(modulated_signal_64,snr)demodulated_data_64=qam_demodulation(received_signal_64,M_64)ber_64=calculate_ber(binary_data,demodulated_data_64)print(f'64-QAM BER:{ber_64}')# 绘制 16-QAM 和 64-QAM 的 BER vs SNRplot_ber_vs_snr(binary_data,M_16,snr_range)plot_ber_vs_snr(binary_data,M_64,snr_range)

5.2 信道模型的改进

可以通过引入不同的信道模型(如瑞利衰落信道、多径信道等),进一步研究 QAM 调制在复杂信道环境下的性能。以下是一个瑞利衰落信道的示例:

# 瑞利衰落信道defrayleigh_channel(signal,snr):""" 通过瑞利衰落信道传输信号 参数: signal (np.array): 调制后的信号 snr (float): 信噪比(以 dB 为单位) 返回: np.array: 通过信道后的信号 """# 计算信号功率signal_power=np.mean(np.abs(signal)**2)# 计算噪声功率noise_power=signal_power/10**(snr/10)# 生成高斯白噪声noise=np.sqrt(noise_power)*(np.random.randn(len(signal))+1j*np.random.randn(len(signal)))# 生成瑞利衰落系数h=np.sqrt(0.5)*(np.random.randn(len(signal))+1j*np.random.randn(len(signal)))# 传输信号received_signal=h*signal+noisereturnreceived_signal# 通过瑞利衰落信道传输 4-QAM 信号received_signal_rayleigh=rayleigh_channel(modulated_signal,snr)print(received_signal_rayleigh)# 绘制接收到的信号星座图plt.scatter(np.real(received_signal_rayleigh),np.imag(received_signal_rayleigh))plt.title('Received 4-QAM Constellation in Rayleigh Fading Channel')plt.xlabel('In-Phase Component')plt.ylabel('Quadrature Component')plt.grid(True)plt.show()# 解调接收到的信号demodulated_data_rayleigh=qam_demodulation(received_signal_rayleigh,M)print(demodulated_data_rayleigh)# 绘制解调后的二进制数据与原始数据的对比plt.figure(figsize=(12,6))plt.subplot(2,1,1)plt.plot(binary_data,label='Original Data')plt.title('Original Binary Data')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.subplot(2,1,2)plt.plot(demodulated_data_rayleigh,label='Demodulated Data in Rayleigh Fading Channel')plt.title('Demodulated Binary Data in Rayleigh Fading Channel')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.tight_layout()plt.show()# 计算误码率ber_rayleigh=calculate_ber(binary_data,demodulated_data_rayleigh)print(f'BER in Rayleigh Fading Channel:{ber_rayleigh}')# 绘制不同信噪比下的误码率plot_ber_vs_snr(binary_data,M,snr_range,channel='rayleigh')

5.3 多径信道的影响

除了瑞利衰落信道,还可以研究多径信道对 QAM 调制的影响。多径信道会导致信号的时延和相位变化,进一步增加解调的难度。以下是一个多径信道的示例:

# 多径信道defmultipath_channel(signal,snr,delays,gains):""" 通过多径信道传输信号 参数: signal (np.array): 调制后的信号 snr (float): 信噪比(以 dB 为单位) delays (list): 时延列表(单位:样本数) gains (list): 增益列表 返回: np.array: 通过信道后的信号 """# 计算信号功率signal_power=np.mean(np.abs(signal)**2)# 计算噪声功率noise_power=signal_power/10**(snr/10)# 生成高斯白噪声noise=np.sqrt(noise_power)*(np.random.randn(len(signal))+1j*np.random.randn(len(signal)))# 生成多径信道响应multipath_signal=np.zeros(len(signal),dtype=complex)fordelay,gaininzip(delays,gains):multipath_signal+=np.roll(signal,delay)*gain# 传输信号received_signal=multipath_signal+noisereturnreceived_signal# 通过多径信道传输 4-QAM 信号delays=[0,10,20]# 时延列表gains=[1,0.5,0.3]# 增益列表received_signal_multipath=multipath_channel(modulated_signal,snr,delays,gains)print(received_signal_multipath)# 绘制接收到的信号星座图plt.scatter(np.real(received_signal_multipath),np.imag(received_signal_multipath))plt.title('Received 4-QAM Constellation in Multipath Channel')plt.xlabel('In-Phase Component')plt.ylabel('Quadrature Component')plt.grid(True)plt.show()# 解调接收到的信号demodulated_data_multipath=qam_demodulation(received_signal_multipath,M)print(demodulated_data_multipath)# 绘制解调后的二进制数据与原始数据的对比plt.figure(figsize=(12,6))plt.subplot(2,1,1)plt.plot(binary_data,label='Original Data')plt.title('Original Binary Data')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.subplot(2,1,2)plt.plot(demodulated_data_multipath,label='Demodulated Data in Multipath Channel')plt.title('Demodulated Binary Data in Multipath Channel')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.tight_layout()plt.show()# 计算误码率ber_multipath=calculate_ber(binary_data,demodulated_data_multipath)print(f'BER in Multipath Channel:{ber_multipath}')# 绘制不同信噪比下的误码率plot_ber_vs_snr(binary_data,M,snr_range,channel='multipath',delays=delays,gains=gains)

5.4 信道均衡技术

为了提高 QAM 调制在复杂信道环境下的性能,可以引入信道均衡技术。信道均衡器可以通过估计信道特性来补偿多径效应和瑞利衰落,从而减少误码率。以下是一个简单的信道均衡器示例:

# 简单的信道均衡器defchannel_equalizer(received_signal,channel_response):""" 通过信道均衡器补偿信道效应 参数: received_signal (np.array): 接收到的信号 channel_response (np.array): 信道响应 返回: np.array: 经过信道均衡的信号 """# 计算信道响应的逆equalizer=1/channel_response# 应用均衡器equalized_signal=received_signal*equalizerreturnequalized_signal# 估计信道响应channel_response=np.array([1,0.5,0.3])# 通过信道均衡器补偿多径信道效应equalized_signal=channel_equalizer(received_signal_multipath,channel_response)print(equalized_signal)# 绘制经过信道均衡的信号星座图plt.scatter(np.real(equalized_signal),np.imag(equalized_signal))plt.title('Equalized 4-QAM Constellation in Multipath Channel')plt.xlabel('In-Phase Component')plt.ylabel('Quadrature Component')plt.grid(True)plt.show()# 解调经过信道均衡的信号demodulated_data_equalized=qam_demodulation(equalized_signal,M)print(demodulated_data_equalized)# 绘制解调后的二进制数据与原始数据的对比plt.figure(figsize=(12,6))plt.subplot(2,1,1)plt.plot(binary_data,label='Original Data')plt.title('Original Binary Data')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.subplot(2,1,2)plt.plot(demodulated_data_equalized,label='Demodulated Data after Equalization')plt.title('Demodulated Binary Data after Equalization')plt.xlabel('Bit Index')plt.ylabel('Bit Value')plt.grid(True)plt.tight_layout()plt.show()# 计算误码率ber_equalized=calculate_ber(binary_data,demodulated_data_equalized)print(f'BER after Equalization:{ber_equalized}')# 绘制不同信噪比下的误码率plot_ber_vs_snr(binary_data,M,snr_range,channel='multipath',delays=delays,gains=gains,equalizer=channel_equalizer,channel_response=channel_response)

通过这些实验拓展,学生可以更深入地了解 QAM 调制在不同信道环境下的性能,并学习如何通过信道均衡技术来改善通信系统的性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/28 19:26:17

使用STM32H743的CMAKE工程添加到vscode

1、打开系统HSE时钟2、配置一下GPIO3、配置freertos系统时钟源,此处使用1ms时钟源配置freertos时钟。4、配置freertos;5、配置时钟树,使用的是外部晶振,25mhz;6、生产cmake工程;7、vscode配置cmake环境,直接…

作者头像 李华
网站建设 2025/12/20 19:18:03

介观交通流仿真软件:Aimsun Next_(9).仿真结果分析与可视化

仿真结果分析与可视化 在交通流仿真过程中,仿真结果的分析与可视化是至关重要的步骤。通过对仿真结果的分析,我们可以验证模型的有效性,评估交通策略的效果,并提取有用的信息以支持决策。可视化则帮助我们将这些复杂的数据以直观的…

作者头像 李华
网站建设 2025/12/24 6:56:33

介观交通流仿真软件:DynusT_(4).交通网络建模

交通网络建模 在介观交通流仿真软件中,交通网络建模是基础且关键的步骤。交通网络模型的准确性直接影响到仿真结果的可靠性和实用性。本节将详细介绍交通网络建模的原理和内容,包括网络结构的定义、节点和路段的属性设置、以及如何导入和导出网络数据。 …

作者头像 李华
网站建设 2025/12/24 17:43:34

Visual Studio中的 var 和 dynamic

目录 一、var 1.基础介绍 2.语法模板 二、dynamic 1.基础介绍 2.语法模板 三、两者关键区别--示例 四、核心特点对比 五、注意事项 var的注意事项 dynamic的注意事项 六、选择情况 一、var 1.基础介绍 var:隐式类型局部变量 定义:编译时由…

作者头像 李华
网站建设 2025/12/17 2:19:28

ONLYOFFICE 协作空间 3.6.1 发布:安全补丁与多项优化

我们很高兴地宣布 ONLYOFFICE 协作空间 3.6.1 正式发布。本次更新重点聚焦于安全漏洞修复和功能优化,在提升系统安全性的同时,进一步增强了 AI 智能体的使用体验。 关于 ONLYOFFICE 协作空间 ONLYOFFICE 协作空间是一款以 “房间”为核心概念的在线文档…

作者头像 李华