QAM调制解调的原理
2017-11-09 10:41
267 查看
QAM是正交幅度调制
随着现代通信技术的发展,特别是移动通信技术高速发展,新的需求层出不穷,促使新的业务不断产生,因而导致频率资源越来越紧张。在有限的带宽里要传输大量的多媒体数据,频谱利用率成为当前至关重要的课题,由于具有高频谱利用率、高功率谱密度等优势,16QAM技术被广泛应用于高速数据传输系统.在很多宽带应用领域,比如数字电视广播,Internet宽带接入,QAM系统都得到了广泛的应用。QAM也可用于数字调制。数字QAM有4QAM、8QAM、16QAM、32QAM等调制方式。其中,16QAM和32QAM广泛用于数字有线电视系统。当今国际市场上出现了采用16QAM调制技术的卫通调制解调器,如美国COMTECHEF DATA公司新推出的CDM-600。该卫通调制解调器支持速率高达20Mbps[1]。
无线通信技术的迅猛发展对数据传输速率、传输效率和频带利用率提出了更高的要求。选择高效可行调制解调手段,对提高信号的有效性和可靠性起着至关重要的作用。由于QAM已经成为宽带无线接入和无线视频通信的重要技术方案。关于调制解调技术的仿真研究对于QAM理论研究和相关产品开发具有重要意义。
它是把2ASK和2PSK两种调制结合起来的调制技术,使得带宽得到双倍扩展。QAM调制技术用两路独立的基带信号对频率相同、相位正交的两个载波进行抑制载波双边带调幅,并将已调信号加在一起进行传输。nQAM代表n个状态的正交调幅,一般有二进制(4QAM)、四进制(16QAM)、八进制(64QAM)。
我们需要得到多进制的QAM信号,需将二进制信号转换为m电平的多进制信号,然后进行正交调制,最后相加输出。
QAM信号产生的框图
QAM信号用正交相干解调方法进行解调,通过解调器将QAM信号进行正交相干解调后,用低通滤波器LPF滤除乘法器产生的高频分量,输出抽样判决后可恢复出的两路独立电平信号,最后将多电平码元与二进制码元间的关系进行转换,将电平信号转换为二进制信号,经并/串变换后恢复出原二进制基带信号。
(2)16QAM
16QAM产生的原理图
实验步骤:
(1)首先生成一个随机且长度为10000的二进制比特流,并画出了前50个比特的信号图(如图17所示)。
(2)在MATLAB中16QAM调制器要求输入的信号为0-15这16个值,所以需要用函数reshape和bi2de将二进制的比特流转换为对应的十六进制信号。
(3)利用MATLAB中的modem.qammod函数生成16QAM调制器,再通过其对信号进行调制并画出信号的星座图。
(4)通过awgn 信道在16QAM信号中加入高斯白噪声(假设Eb/No=15db)。
(5)利用MATLAB中的scatterplot函数画出通过信道后接受到的信号的星座图。
(6)利用MATLAB中的eyediagram函数生成经过信道后的眼图。
(7)利用MATLAB中的demodulate和modem.qamdemod函数生成解调器对16QAM信号的解调,并将十六进制信号转化成二进制比特流信息。
(8)用得到比特流信息除以原始发送的比特流信息来计算误码率。
M=16;
k=log2(M);
n=100000; %比特序列长度
samp=1; %过采样率
x=randint(n,1); %生成随机二进制比特流
stem(x(1:50),'filled'); %画出相应的二进制比特流信号
title('二进制随机比特流');
xlabel('比特序列');ylabel('信号幅度');
x4=reshape(x,k,length(x)/k); %将原始的二进制比特序列每四个一组分组,并排列成k行length(x)/k列的矩阵
xsym=bi2de(x4.','left-msb'); %将矩阵转化为相应的16进制信号序列
figure;
stem(xsym(1:50)); %画出相应的16进制信号序列
title('16进制随机信号');
xlabel('信号序列');ylabel('信号幅度');
y=modulate(modem.qammod(M),xsym); %用16QAM调制器对信号进行调制
scatterplot(y); %画出16QAM信号的星座图
text(real(y)+0.1,imag(y),dec2bin(xsym));
axis([-5 5 -5 5]);
EbNo=15;
snr=EbNo+10*log10(k)-10*log10(samp); %信噪比
yn=awgn(y,snr,'measured'); %加入高斯白噪声
h=scatterplot(yn,samp,0,'b.'); %经过信道后接收到的含白噪声的信号星座图
hold on;
scatterplot(y,1,0,'k+',h); %加入不含白噪声的信号星座图
title('接收信号星座图');
legend('含噪声接收信号','不含噪声信号');
axis([-5 5 -5 5]);
hold on;
eyediagram(yn,2); %眼图
yd=demodulate(modem.qamdemod(M),yn); %此时解调出来的是16进制信号
z=de2bi(yd,'left-msb'); %转化为对应的二进制比特流
z=reshape(z.',numel(z),1');
[number_of_errors,bit_error_rate]=biterr(x,z)
运行结果:
number_of_errors =0
bit_error_rate =0
实验图:
1.
2.
3
4
对程序进行的分析:
(2)调制
所谓的不管是QAM调制,还是QPSK调制的本质就是就是将位元(bit)转化成对应的信号(symbol),对于16QAM调制,一个QAM信号就需要4个bit,一个QPSk信号调制需要2个bit的二进制。
>> M=16
M =
16
>> k=log2(M)
k =
4
>> n=20
n =
20
>> x=randint(20,1)
x =
0
0
1
1
1
1
1
1
1
0
0
1
0
1
1
0
1
1
0
1
%%%reshape就是串并变化
>> x4=reshape(x,k,length(x)/k)
x4 =
0 1 1 0 1
0 1 0 1 1
1 1 0 1 0
1 1 1 0 1
进行16QAM调制 ,就是将4个二进制变成对应的QAM信号。
>> xsym=bi2de(x4.','left-msb')
xsym =
3
15
9
6
13
3就是对应第一列0011转化成十进制的数值,15对应的是第二列1111的值
>> y=modulate(modem.qammod(M),xsym)
%%%
y =
-3.000000000000000 - 3.000000000000000i
3.000000000000000 - 3.000000000000000i
1.000000000000000 + 1.000000000000000i
-1.000000000000000 - 1.000000000000000i
3.000000000000000 + 1.000000000000000i
进行map映射,依据上图3,可以看出3映射对应的点就是 -3.000000000000000 - 3.000000000000000i,15对应的就是 3.000000000000000 - 3.000000000000000i,不同的函数具有不同的映射方式,这里qammod是matlab对应的函数,它对应的映射表就是上图3
这里的y就是将二进制符号经过QAM调制后对应的QAM的信号。
(3)QAM解调的部分
>> yd=demodulate(modem.qamdemod(M),y)
yd =
3
15
9
6
13
>> z=de2bi(yd,'left-msb')
z =
0 0 1 1
1 1 1 1
1 0 0 1
0 1 1 0
1 1 0 1
>> z=reshape(z.',numel(z),1')
z =
0
0
1
1
1
1
1
1
1
0
0
1
0
1
1
0
1
1
0
1
2 rand randn randint的区别
matlab中rand函数是产生0到1的随机分布
matlab中randn函数是产生标准正态分布,就是均值为0,方差为1的正态分布
randint是产生整数随机数,默认为0和1
3 16QAM的调制
这里调制直接是调用matlab库文件里面的 modem.qammod对象实现M-QAM调制器,对信号进行调制,本示例中M为16。其输入参数是从0到15的整数而不是4bits二进制数据。因此,在利用此对象的modulate方法之前需要对二进制数据序列x进行预处理。特别地, 先采用MATLAB中的reshape函数将x沿着矩阵的行方向重新整理成每行4bit数据,然后应用bi2de函数将4bit数据转换成相应的整数。
这里y=modulate(modem.qammod(M),xsym); %用16QAM调制器对信号进行调制 ,这句话也可以写成qammod(xsym,16)效果是一样的
如果进行8QAM调制,就直接写成qammod(xsym,8)
如果进行16psk调制,就直接调用库函数pskmod(16,xsym)就可以了。
上面程序函数的使用
函数或方法
产生随机二进制数据序列
randint
16QAM调制
modem.qammod 对象中的modulate方法
AWGN信道
awgn
绘制散点图
scatterplot
16QAM解调
modem.qamdemod 对象中的demodulate方法(原文档有误)
计算系统误码率
biterr计算误比特数和误比特律
matlab通信工具箱
信号源 | randerr | 产生随机无码图样 |
randint | 产生均匀分布的随机整数 | |
randsrc | 用预定义的字母表产生随机矩阵 | |
wgn | 产生高斯噪声 | |
信号分析函数 | biterr | 计算误比特数和误比特率 |
eyediagram | 产生眼图 | |
scatterplot | 产生散列图 | |
symerr | 计算误码数和误码率 | |
信源编码 | arithdeco | 算术解码码 |
arithenco | 对一符号序列进行算术编码 | |
compand | μ律或A律压扩编码 | |
dpcmdeco | 差分脉冲调制解码 | |
dpcmenco | 差分脉冲调制编码 | |
dpcmopt | 使用训练序列对差分脉冲调制参数进行优化 | |
lloyds | 使用训练序列结合lloyd算法优化标量量化 | |
quantiz | 产生量化序号和量化值 | |
差错控制编码 | bchpoly | 产生BCH码的参数或生成多项式 |
convenc | 卷积编码 | |
cyclgen | 产生循环码的生成矩阵和校验矩阵 | |
cyclpoly | 产生循环码的生成多项式 | |
decode | 纠错码解码 | |
encode | 纠错码编码 | |
gen2pa | 生成矩阵和校验矩阵的转换 | |
gfweight | 计算线性分组码的最小距离 | |
hammgen | 产生汉明码的生成矩阵和校验矩阵 | |
rsdec | RS解码器 | |
rsenc | RS编码器 | |
rsdecof | 将RS编码的ASCII文件解码 | |
rsencof | 对一个ASCII文件进行RS编码 | |
rsgenpoly | 产生RS码的生成多项式 | |
syndtable | 产生故障解码器 | |
vitdec | 使用Viterbi算法卷积解码 | |
差错控制编码 的低级函数 | bchdeco | BCH解码器 |
bchenco | BCH编码器 | |
调制与解调 | ademod | 模拟带通信号解调 |
ademodce | 模拟基带信号解调 | |
amod | 模拟带通信号调制 | |
amodce | 模拟基带信号调制 | |
apkconst | 绘制ASK-PSK信号星座图 | |
ddemod | 数字带通信号解调 | |
ddemodce | 数字基带信号解调 | |
demodmap | 模拟信号→数字信号 | |
dmod | 数字带通信号调制 | |
dmodce | 数字基带信号调制 | |
modmap | 数字信号→模拟信号 | |
qaskdeco | 矩形QASK星座图中的信号→数字信号 | |
qaskenco | 数字信号→矩形QASK星座图中的信号 | |
特殊滤波器 | hank2sys | 将Hankel矩阵转换为线性系统模型 |
hilbiir | IIR滤波器设计中的Hilbert变换 | |
rcosflt | 使用升余弦滤波器对输入信号进行滤波 | |
rcosine | 设计升余弦滤波器 | |
特殊滤波器 的低级函数 | rcosfir | 设计升余弦FIR滤波器 |
rcosiir | 设计升余弦IIR滤波器 | |
信道函数 | awgn | 将高斯噪声叠加到信号上 |
有限域计算 | gf | 生成一个有限域数组 |
gfhelp | 生成适于有限域数组的操作表 | |
convmtx | 有限域向量的卷积矩阵 | |
cosets | 有限域陪集计算 | |
dftmtx | 有限域中的离散傅里叶变换矩阵 | |
gftable | 创建一个文件以便加快有限域计算 | |
isprimitive | 检测有限域中的本原多项式 | |
minpily | 寻找有限域的最小多项式 | |
primpoly | 找出有限域中的本原多项式 | |
具有奇特性的 有限域计算 | gfadd | 有限域的多项式加法 |
gfconv | 有限域的多项式乘法 | |
gfcosets | 有限域陪集计算 | |
gfdeconv | 有限域的多项式除法 | |
gfdiv | 有限域中除一个元素 | |
gffilter | 有限域滤波计算 | |
gflineq | 有限域中解方程ax=b | |
gfminpol | 寻找有限域的最小多项式 | |
gfmul | 有限域乘法 | |
gfpretty | 按传统方式显示多项式 | |
gfprimck | 检测多项式在有限域中是否为本原多项式 | |
gfprimdf | 产生有限域的本原多项式 | |
gfprimfd | 找出有限域中的本原多项式 | |
gfrank | 在有限域中计算一个矩阵的秩 | |
gfrepcov | 改变有限域中多项式的表示方法 | |
gfroots | 在有限域中计算多项式的根 | |
gfsub | 有限域除法 | |
gftrunc | 将多项式的表示方式化为最简 | |
gftuple | 简化或转换有限域中的元素表示方法 | |
实用工具 | bi2de | 二进制向量→十进制 |
de2bi | 十进制向量→二进制 | |
erf | 误差函数 | |
erfc | 余误差函数 | |
istrellis | 检测输入是否为有效的格形结构 | |
marcump | 产生Marcum Q函数 | |
mask2shift | 将向量转换为移位寄存器形式 | |
oct2dec | 八进制→十进制 | |
poly2trellis | 多项式→格形表示 | |
shift2mask | 移位寄存器→向量 | |
vec2mat | 向量→矩阵 |
其他地方看自己编写的程序
相关文章推荐
- QPSK调制与解调原理
- QAM调制原理
- [模拟电路] 1、模拟调制、解调电路原理
- QPSK调制与解调原理
- 通信原理中2fsk与2psk调制解调系统仿真
- LoRa学习:LoRa通信调制解调的实现原理与性能
- QPSK调制与解调原理
- DVB-C系统中QAM调制与解调仿真
- QPSK调制与解调原理
- 通信原理实验(一):调制与解调
- DVB-C系统中QAM调制与解调仿真
- DVB信道编解码与调制解调
- <转载>调制与解调电路详解
- 基带以及信道编解码,调制解调的关系
- 对应于所写QPSK调制的解调 1.0
- 通信系统中为什么要进行调制和解调?调制的分类方法有哪些?
- 通信系统中为什么要进行调制和解调?调制的分类方法有哪些?
- 7-2通信系统中为什么进行调制和解调?调制分类的方法有哪些?
- 7-2通信系统中为什么要进行调制和解调?调制的分类有哪些?
- 通信系统仿真速成第3天:16QAM调制与解调(实验)