MATLAB通信系统仿真(二)——数字调制

数字调制



前言

主要内容来自参考资料[2],在学习记录的同时勘正了书中代码的部分错误。


幅度键控

示例代码:

%% OOK
clear all;close all
t = 0.01:0.01:8;
y = sin(2*pi*t);%载波
z = zeros(1,100);o = ones(1,100);%二进制数
x = [o,z,o,o,z,z,o,z];
ook = x.*y;
plot(t,x,'.',t,ook)
legend('信号序列','幅频键控')

仿真结果图:
在这里插入图片描述

相移键控

示例中 M = 8 M=8 M=8,生成常数包络PSK信号波形,将信号幅度归一化为1,取载波频率为 6 / T 6/T 6/T

示例代码:

%% PSK
%生成8PSK信号
clear all;close all;
T = 1;M = 8;
N = 120;delta_T = T/(N-1);
t = 0:delta_T:T;
Es = T/2;%单个符号的能量这么设是为了使调制信号幅度为1
fc = 6/T;
u = zeros(8,length(t));
for i = 1:8
    u(i,:) = sqrt(2/T*Es)*cos(2*pi*fc*t+(i-1)*2*pi/M);
end
%画图
for i = 1:8
    subplot(8,1,i)
    plot(t,u(i,:))
end

仿真结果图:
在这里插入图片描述

频移键控

%% FSK
clear all;close all
t = 0.01:0.01:8;
fc0 = 2;
y = sin(2*pi*t);%载波
z = zeros(1,100);o = ones(1,100);%二进制数
x = [o,z,o,o,z,z,o,z];
fc = fc0*(x+1);
fsk = sin(2*pi*fc.*t);%调制信号
plot(t,x,'.',t,fsk)
legend('信号序列','频移键控')

仿真结果图:在这里插入图片描述

正交幅度调制

示例代码:
1.主程序代码

%% 正交幅度调制
% 理论:theory;实际:practice
clear all;close all;
SNR_dB_p = 0:15;%选取部分点进行仿真
SNR_dB_t = 0:15;%选择较多的点进行理论计算
SNR_t = 10.^(SNR_dB_t/10);%dB→线性
M = 16;%16QAM
k = log2(M);%位数?
for i = 1:length(SNR_dB_p)
    err_p(i) = QAM_16(SNR_dB_p(i));
end
for i = 1:length(SNR_dB_t)
    x = sqrt(3*k*SNR_t(i)/(M-1));
    err_t(i) = 4*(1/2)*erfc(x/(sqrt(2)));
end
semilogy(SNR_dB_t,err_t);hold on
semilogy(SNR_dB_p,err_p,'rp');
legend('实际值','理论值')
title('信噪比-误比特率曲线')

所用到的子程序代码
2.子程序一

function err_rate = QAM_16(s_in_dB)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
N = 10000;d = 1;
Eav = 10*d^2;%平均符号能量?
snr = 10^(s_in_dB/10);%线性信噪比
sigma = sqrt(Eav/(8*snr));%方差
M = 16;
for i = 1:N     %N点蒙特卡罗模拟
    temp = rand;
    source_d(i) = 1+floor(M*temp);   %数字信号序列,分布在[1,16]内的整数
end
map = [ -3*d  3*d;-d    3*d;
        d     3*d;3*d   3*d;
        -3*d    d;-d      d;
        d       d; 3*d    d; 
        -3*d   -d;-d     -d;
        d      -d; 3*d   -d; 
        -3*d -3*d;-d   -3*d;
        d     3*d; 3*d -3*d;];%16QAM星座图
for i = 1:N
    source_map(i,:) = map(source_d(i),:);%生成N个点,随机分布在星座图各点
end
for i = 1:N
    n = Gauss(sigma);%输入方差,生成高斯分布的N个点
    receive(i,:) = source_map(i,:)+n;%叠加噪声
end
err_num = 0;%误比特个数
for i = 1:N     %N轮仿真
    for j = 1:M %每轮仿真计算M(16)个距离
       dist(j) =  (receive(i,1)-map(j,1))^2+(receive(i,2)-map(j,2))^2;
    end
    [dist_min,index] = min(dist);
    if(index ~= source_d(i)) %表明噪声太大,将产生误码
        err_num = err_num+1;
    end
end
err_rate = err_num/N;%实际误比特率

3.子程序二

function [g1,g2] = Gauss(miu,sgma)
%UNTITLED4 此处显示有关此函数的摘要
%   参数判断
if(nargin == 0)
    miu = 0;sgma = 1;
elseif nargin == 1
    sgma = miu;miu = 0;
end
u = rand;%符合均匀分布的随机数
z = sgma*(sqrt(2*log(1/(1-u))));%符合瑞利分布的随机数
u1 = rand;
g1 = miu+z*cos(2*pi*u1);%生成两个统计独立的正态分布的随机数
g2 = miu+z*sin(2*pi*u1);
end

仿真结果图
在这里插入图片描述
这里有一定的问题,和参考资料[2]中画的图有很大区别,当信噪比较大时,实际值和理论值不符。可能的原因是,误码率函数仅在一定的区间内适用,因为定义式进行了近似。在信噪比较小时,理论值与实际值吻合程度较好。


子程序中利用均匀分布生成正态分布的随机数原理

可利用CDF求逆法生成符合指定分布的随机数(数学原理见如下链接)https://blog.csdn.net/haolexiao/article/details/60511164

但是对于正态分布则存在一定特殊性,在这里插入图片描述
故可使用子程序中的方法生成正太分布随机数[3]

参考资料

[1] ttps://blog.csdn.net/u014630987/article/details/70156489
[2] 《MATLAB通信系统建模与仿真(第2版)》 邓奋发 编著
[3]https://wenku.baidu.com/view/7ac43010a55177232f60ddccda38376bae1fe039.html

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值