QAM调制原理

QAM是正交幅度调制

随着现代通信技术的发展,特别是移动通信技术高速发展,新的需求层出不穷,促使新的业务不断产生,因而导致频率资源越来越紧张。在有限的带宽里要传输大量的多媒体数据,频谱利用率成为当前至关重要的课题,由于具有高频谱利用率、高功率谱密度等优势,16QAM技术被广泛应用于高速数据传输系统.在很多宽带应用领域,比如数字电视广播,Internet宽带接入,QAM系统都得到了广泛的应用。QAM也可用于数字调制。数字QAM有4QAM、8QAM、16QAM、32QAM等调制方式。其中,16QAM和32QAM广泛用于数字有线电视系统。当今国际市场上出现了采用16QAM调制技术的卫通调制解调器,如美国COMTECH EF DATA公司新推出的CDM-600。该卫通调制解调器支持速率高达20Mbps[1]。

无线通信技术的迅猛发展对数据传输速率、传输效率和频带利用率提出了更高的要求。选择高效可行调制解调手段,对提高信号的有效性和可靠性起着至关重要的作用。由于QAM已经成为宽带无线接入和无线视频通信的重要技术方案。关于调制解调技术的仿真研究对于QAM理论研究和相关产品开发具有重要意义。

它是把2ASK和2PSK两种调制结合起来的调制技术,使得带宽得到双倍扩展。QAM调制技术用两路独立的基带信号对频率相同、相位正交的两个载波进行抑制载波双边带调幅,并将已调信号加在一起进行传输。nQAM代表n个状态的正交调幅,一般有二进制(4QAM)、四进制(16QAM)、八进制(64QAM)。

我们需要得到多进制的QAM信号,需将二进制信号转换为m电平的多进制信号,然后进行正交调制,最后相加输出。

QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

                                                   QAM信号产生的框图

QAM信号用正交相干解调方法进行解调,通过解调器将QAM信号进行正交相干解调后,用低通滤波器LPF滤除乘法器产生的高频分量,输出抽样判决后可恢复出的两路独立电平信号,最后将多电平码元与二进制码元间的关系进行转换,将电平信号转换为二进制信号,经并/串变换后恢复出原二进制基带信号。

                                  (2)16QAM

16QAM产生的原理图

QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

  实验步骤:

(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.

 QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

  2.

QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

 3

QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

 4

QAM调制解调的原理 - 大鹏展翅 - 892648414的博客

 对程序进行的分析:

                                                                                             (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

向量→矩阵

其他地方看自己编写的程序

猜你喜欢

转载自blog.csdn.net/hudada19/article/details/86617496
今日推荐