數字調制
文章目錄
- 數字調制
- 前言
-
- 幅度鍵控
- 相移鍵控
- 頻移鍵控
- 正交幅度調制
- 參考資料
前言
主要内容來自參考資料[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