天天看點

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('信号序列','幅頻鍵控')
           

仿真結果圖:

MATLAB通信系統仿真(二)——數字調制數字調制前言

相移鍵控

示例中 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
           

仿真結果圖:

MATLAB通信系統仿真(二)——數字調制數字調制前言

頻移鍵控

%% 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('信号序列','頻移鍵控')
           

仿真結果圖:

MATLAB通信系統仿真(二)——數字調制數字調制前言

正交幅度調制

示例代碼:

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
           

仿真結果圖

MATLAB通信系統仿真(二)——數字調制數字調制前言

這裡有一定的問題,和參考資料[2]中畫的圖有很大差別,當信噪比較大時,實際值和理論值不符。可能的原因是,誤碼率函數僅在一定的區間内适用,因為定義式進行了近似。在信噪比較小時,理論值與實際值吻合程度較好。

子程式中利用均勻分布生成正态分布的随機數原理

可利用CDF求逆法生成符合指定分布的随機數(數學原理見如下連結)https://blog.csdn.net/haolexiao/article/details/60511164

但是對于正态分布則存在一定特殊性,

MATLAB通信系統仿真(二)——數字調制數字調制前言

故可使用子程式中的方法生成正太分布随機數[3]

參考資料

[1] ttps://blog.csdn.net/u014630987/article/details/70156489

[2] 《MATLAB通信系統模組化與仿真(第2版)》 鄧奮發 編著

[3]https://wenku.baidu.com/view/7ac43010a55177232f60ddccda38376bae1fe039.html

繼續閱讀