BPSK误码率的Matlab仿真实验
作者:黄准
南京航空航天大学,江苏省 南京市 430062
摘要:对于刚刚从事通信领域研究性工作的研究生来说,很有必要通过Matlab强大的仿真功能来强化理解通信信号处理的过程。本文正是通过对BPSK的Matlab仿真来提供一个比较好的实例。
关键词:BPSK,高斯白噪声,带通滤波器,载波,抽样判决
1 BPSK的理论分析
1.1 基本原理
cos0t WGN s(t) A(t)
相乘器 加法器 BPF A(t) 抽样判决 LPF 相乘器 定时脉冲
图1.1 BPSK相干解调原理框图
cos0t
输入信号A(t)可表示为:
A(t)an*g(tNTb)N
(1.1-1)
式中g(tNTb)为矩形波,而an表达式如下:
BPSK的matlab仿真原理加源代码
对A(t)进行傅里叶变换,得到A(t)的功率谱密度ps(f)(式中Ts为码元时间长度):
得到A(t)的频谱图如1.2所示(图中Tb为码元时间长度)
图1.2 矩形基带信号频谱
A(t)与载波相乘:
s(t)A(t)*coswct
其频谱图如图1.3所示:
图1.3
图中fc为载波频率,fs=1/Tb=Rb(码速率),故带通滤波器的中心频率为fc,带宽至少为2fs。 经过带通滤波器的高斯白噪声变成了窄带高斯信号,可以表示为:
经过带通滤波器后的信号为y(t)
y(t)=s(t)+n(t)
与载波相乘后再经过低通滤波器滤除高频分量得到x(t)
BPSK的matlab仿真原理加源代码
由x(t)的功率谱密度图(图1.4所示)可知,最佳判决门限为0;误码率Pe=0.5*erfc(sqrt(r));式中信噪比r=A^2/2*σ^2,σ^2为窄带高斯信号的方差,由于其均值为0,故噪声功率就是其方差。
图1.4
附录: clear all clc
num = 5000; %码元数
Rb = 1000; %码速率2*Rb<=fs
tnum = 500; %没一个码元用tnum个点代替 fs = Rb*tnum; %采样频率fs>2*(fp+Rb) fp = 100000; %载波频率
t = 0:1/fs:num/Rb-1/fs; %时间t的长度与间隙。 panjue1 = zeros(1,num); %基带传输的判决输出 panjue2 = zeros(1,num); %频带传输的判决输出 pe1 = zeros(1,15); %基带传输的误码率矩阵 pe2 = zeros(1,15); %频带传输的误码率矩阵
a = 2*(fp-2*Rb)/fs; %带通滤波器的第一截止频率 b = 2*(fp+2*Rb)/fs; %带通滤波器的第二截止频率 s = 1; %循环累加数 %
[a1,b1] = butter(2,[a,b]); %采用butter滤波器,得到butter滤波器的H(z)的分子分母参数
noise = randn(1,num*tnum); %产生正态分布参数 nwgnnoise = filter(a1,b1,noise); %对WGN进行带通滤波 stdnwgn = std(nwgnnoise); %为了减少运算量。 [a2,b2] = butter(2,b); %低通滤波
[h1 w1] = freqz(a1,b1); %带通滤波器频谱 [h2 w2] = freqz(a2,b2); %低通滤波器频谱
%以上一段代码是为了防止加重计算机的计算量而从循环中提出来的。
BPSK的matlab仿真原理加源代码
%
for SNR_db = -5:10; in = randint(1,num); in1 = 2*in-1; g = ones(1,tnum);
inn = upsample(in,tnum); inn = filter(g,1,inn);
in2 = inn*2-1; %以上一段代码产生基带信号 inn = in2.*sin(2*pi*fp*t); noise = randn(1,num*tnum); snr = 10^(SNR_db/10); sigma = sqrt(1/(2*snr)); s2 = in2+noise*sigma; s1 = inn+noise*sigma;
%带通滤波器
v = filter(a1,b1,inn); nwgnnoise = filter(a1,b1,noise); 高斯信号的功率进行处理
nwgnnoise = nwgnnoise/stdnwgn; nwgnnoise = nwgnnoise*sigma; v = v+nwgnnoise; v2 = v.*sin(2*pi*fp*t);
v = filter(a2,b2,v2);
i = 1; while i <= num
if s2(i*tnum-tnum/2) > 0 panjue1(i) = 1; else
panjue1(i) = -1; end
if v(i*tnum-tnum/2) > 0 panjue2(i) = 1; else
panjue2(i) = -1; end i = i+1; end
%产生频带信号
%产生标准正态分布的高斯白噪声信号 %信噪比换算
%求出高斯白噪声标准差 %基带传输
%频带传输,暂未用上 %对载波信号进行带通滤波
%对WGN进行带通滤波,此处分开滤波是为了对窄带 %使得滤波后的窄带高斯噪声任然为正态分布 %改变噪声功率使其符合预设的信噪比。 %经过带通滤波器后的信号 %与载波相乘 %进行低通滤波 %进行抽样判决 %基带抽样判决 %频带抽样判决 BPSK的matlab仿真原理加源代码
pe1(s) = length(find(panjue1~=in1))/num; %基带误码率 pe2(s) = length(find(panjue2~=in1))/num; %频带误码率 s = s+1; end
figure(1);
subplot(3,2,1);
pwelch(in2,[],[],[],fs); title('基带信号频谱');
figure(1);
subplot(3,2,2);
pwelch(inn,[],[],[],fs); title('频带信号');
figure(1);
subplot(3,2,4); plot(w1,h1);
title('带通信号频谱');
figure(1);
subplot(3,2,3); plot(w2,h2);
title('低通信号频谱');
figure(1);
subplot(3,2,5);
pwelch(noise,[],[],[],fs);
title('高斯白噪声信号频谱');
figure(1);
subplot(3,2,6);
pwelch(nwgnnoise,[],[],[],fs); title('窄带高斯信号频谱');
figure(3);
SNR_db = -5:10;
pelilun = 0.5*erfc(sqrt(10.^((SNR_db)./10))); semilogy(SNR_db,pe1,'-or');hold on; semilogy(SNR_db,pe2,'-ob');hold on; semilogy(SNR_db,pelilun,'-og');
legend('基带误码率曲线','频带误码率曲线','理论误码率曲线');grid on;hold on; xlabel('SNR_db'); ylabel('pe');
BPSK的matlab仿真原理加源代码
因篇幅问题不能全部显示,请点此查看更多更全内容