分享

利用matlab实现16QAM调制

 快乐一箩筐 2010-05-21

一、随机信号的调制

第一个示例描述以下问题: 下表描述了解决此问题的关键任务和相应的通信工具箱函数,其中选择基带16QAM作为调制制式以及加性高斯白噪声(AWGN)作为信道模型。

问题解决方案:

1.产生随机二进制数据序列。

        MATLAB中表示信号的常规格式是向量或者矩阵。本示例中利用randint 函数来产生一个表示二进制数据序列连续值的列向量。其中二进制数据序列的长度(即为列向量中的行数)设置为30,000

        下面的代码同时还绘制了数据序列的杆图(stem plot),用来显示数据的01值。你所产生的图可能与次示例中的图有一点不一样,这是因为本示例中应用了随机数。

%% Setup

% Define parameters.

M = 16; % Size of signal constellation

k = log2(M); % Number of bits per symbol

n = 3e4; % Number of bits to process

nsamp = 1; % Oversampling rate

%% Signal Source

% Create a binary data stream as a column vector.

x = randint(n,1); % Random binary data stream

% Plot first 40 bits in a stem plot.

stem(x(1:40),'filled');

title('Random Bits');

xlabel('Bit Index'); ylabel('Binary Value');

2、准备调制

        modem.qammod对象实现M-QAM调制器,本示例中M16。其输入参数是从015的整数而不是4bits二进制数据。因此,在利用此对象的modulate方法之前需要对二进制数据序列x进行预处理。特别地, 先采用MATLAB中的reshape函数将x沿着矩阵的行方向重新整理成每行4bit数据,然后应用bi2de函数将4bit数据转换成相应的整数。

%% Bit-to-Symbol Mapping

% Convert the bits in x into k-bit symbols.

xsym = bi2de(reshape(x,k,length(x)/k).','left-msb');

%% Stem Plot of Symbols

% Plot first 10 symbols in a stem plot.

figure; % Create new figure window.

stem(xsym(1:10));

title('Random Symbols');

xlabel('Symbol Index'); ylabel('Integer Value');

 

问题 利用一个由基带调制器、信道和解调器组成的通信系统处理二进制数据流。计算系统的误码率(BER)并显示发射和接收信号的散点图(Scatter Plot)。

 

任务

函数或方法

产生随机二进制数据序列

randint

16QAM调制

modem.qammod 对象中的modulate方法

AWGN信道

awgn

绘制散点图

scatterplot

16QAM解调

modem.qamdemod 对象中的demodulate方法(原文档有误)

计算系统误码率

biterr

316-QAM调制.

    对于已定义的包含从015的整数的列向量xsym,就可以利用modem.qammod对象的modulate方法来调制它。其中M值为16,亦即为码字表的大小。  

%% Modulation

y = modulate(modem.qammod(M),xsym); % Modulate using 16-QAM.

    调制的结果是复数列向量,其取值为16QAM信号星座图。本示例中的随后步骤中将会展示星座图是什么样子的。想要了解更多关于调制函数的信息,可参见第8章“调制”。另外,注意到modem.qammod对象的modulate方法没有进行任何的脉冲成形处理。

4、加性高斯白噪声.

    对已调制信号可采用awgn函数添加加性高斯噪声。其中比特能量与噪声功率谱密度的比值,Eb/N0,设置为10dB

    将上述Eb/N0值转换为相应的信噪比(SNR),需要考虑每一符号包含的比特数k16-QAM中为4)以及过采样率因子nsamp(本示例中为1)。其中因子k是用来将Eb/N0转换为等价的Es/N0(符号能量与噪声功率谱密度的比值)。因子nsamp是用来将符号速率带宽内的Es/N0转换为采样带宽内的SNR

说明 ytxyrx的定义以及snr定义中nsamp项到目前为止在本示例中显现得并不是很重要, 但是这将使得其更容易扩展到之后的成形滤波示例。

 

 

%% Transmitted Signal

ytx = y;

%% Channel

% Send signal over an AWGN channel.

EbNo = 10; % In dB

snr = EbNo + 10*log10(k) - 10*log10(nsamp);

ynoisy = awgn(ytx,snr,'measured');

%% Received Signal

yrx = ynoisy;

5、绘制散点图。

    对发射和接收信号利用scatterplot函数可显示信号星座图的样子及噪声对信号造成的失真程度。在该图中,横轴代表了信号的同相分量而纵轴代表了正交分量。下面的代码还利用了MATLAB中的titlelegend以及axis函数来绘制特定的图像。

%% Scatter Plot

% Create scatter plot of noisy signal and transmitted

% signal on the same axes.

h = scatterplot(yrx(1:nsamp*5e3),nsamp,0,'g.');

hold on;

scatterplot(ytx(1:5e3),1,0,'k*',h);

title('Received Signal');

legend('Received Signal','Signal Constellation');

axis([-5 5 -5 5]); % Set axis ranges.

hold off;

6、16-QAM解调。

对接收信号利用modem.deqammod对象的demodulate方法进行解调。解调结果为包含015之间整数的列向量。

%% Demodulation

% Demodulate signal using 16-QAM.

zsym = demodulate(modem.qamdemod(M),yrx);

7、整数信号转换至二进制比特信号.

%% Symbol-to-Bit Mapping

% Undo the bit-to-symbol mapping performed earlier.

z = de2bi(zsym,'left-msb'); % Convert integers to bits.

% Convert z from a matrix to a vector.

z = reshape(z.',prod(size(z)),1);

8、计算系统误码率.

对原始二进制向量和上述步骤解调得到二进制向量利用biterr函数即可得到误比特数和误码率。

%% BER Computation

% Compare x and z to obtain the number of errors and

% the bit error rate.

[number_of_errors,bit_error_rate] = biterr(x,z)

>>

number_of_errors =

71

bit_error_rate =

0.0024  

 

上一步产生的信号为一整数列向量zsym。要得到相应的二进制比特信号,只需要利用de2bi函数将每一个整数转化为相应的4位二进制信号。然后利用reshape函数将一个4列的矩阵整理为一个单独列向量

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多