数字调制
文章目录
- 数字调制
- 前言
-
- 幅度键控
- 相移键控
- 频移键控
- 正交幅度调制
- 参考资料
前言
主要内容来自参考资料[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