搜索
您的当前位置:首页正文

BPSK的matlab仿真原理加源代码

来源:意榕旅游网
BPSK的matlab仿真原理加源代码

BPSK误码率的Matlab仿真实验

作者:黄准

南京航空航天大学,江苏省 南京市 430062

摘要:对于刚刚从事通信领域研究性工作的研究生来说,很有必要通过Matlab强大的仿真功能来强化理解通信信号处理的过程。本文正是通过对BPSK的Matlab仿真来提供一个比较好的实例。

关键词:BPSK,高斯白噪声,带通滤波器,载波,抽样判决

1 BPSK的理论分析

1.1 基本原理

cos0t WGN s(t) A(t)

相乘器 加法器 BPF A(t) 抽样判决 LPF 相乘器 定时脉冲

图1.1 BPSK相干解调原理框图

cos0t

输入信号A(t)可表示为:

A(t)an*g(tNTb)N

(1.1-1)

式中g(tNTb)为矩形波,而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仿真原理加源代码

因篇幅问题不能全部显示,请点此查看更多更全内容

Top