课程设计作业
BPSK调制解调
clear all;
close all;
%%
%系统参数设计
T_start=0;%开始时间
T_stop=10;%截止时间
T=T_stop-T_start;%仿真持续时间
rs=10;%传输速率
NumBits=rs*T;%传输bit数
fc=20;%载波频率
L=100;%码元长度
N_sample=NumBits*L;% 采样点数
T_sample=T/N_sample;%采样间隔
%载波
n=1:N_sample;
c=cos(2*pi*fc*n*T_sample);
%%
%BPSK信号的调制
%随机产生原始01信息比特
a=rand(1,NumBits)>0.5;
%将信息比特扩展成双极性不归零方波,得到原始基带信号
e=[];
for i=1:NumBits
if a(i)==0
A=-ones(1,L);
else
A=ones(1,L);
end
e=[e,A];
end
%基带信号与载波相乘
s=e.*c;%BPSK调制信号
%%
%瑞利信道
SNR=15;%输入信噪比
snr=10^(SNR/10);
N0=1/2/snr;%计算噪声功率
N0_dB=10*log10(N0);%将噪声功率转换为dBW
h=raylrnd(1/sqrt(2),1,N_sample);%产生瑞利信号
n_i=wgn(1,N_sample,N0_dB);%产生高斯噪声
y_n0=s+n_i;%BPSK调制信号通过高斯信道
y_n=s.*h+n_i;%BPSK调制信号通过瑞利信道
%%
%BPSK信号的解调
%通过带通滤波器,去除噪声
[b1,a1]=butter(4,[0.02,0.06]);%计算带通滤波器的H(z)系数
y=filtfilt(b1,a1,y_n);%对信号y_i进行滤波,得到信号y;使用filtfilt进行滤波几乎没有延时
%与恢复载波相乘
x1=c.*y;
%通过低通滤波器
[b2,a2]=butter(2,0.02,'low');%计算低通滤波器H(z)系数
x=filtfilt(b2,a2,x1);%对信号x1进行滤波,得到信号x2
%提取信息比特
d=fun_tiqu(x,L);
%%
%误码率计算
err=length(find(d~=a));%计算解调信号中错误码元个数
BER_test=err/NumBits;
%%
%图像
figure(1);
subplot(3,1,1);stem(a);title('原始信息比特序列a');axis([1,10,0,1]);
subplot(3,1,2);plot(c);title('BPSK载波信号c');axis([1,1000,-1,1]);
subplot(3,1,3);plot(e);hold on;plot(s);
legend('基带信号e','BPSK调制信号s');axis([0,1000,-1.5,1.5]);
figure(2);
subplot(3,1,1);plot(s);title('BPSK调制信号s');axis([0,1000,-1.5,1.5]);
subplot(3,1,2);plot(y_n);title('BPSK调制信号s通过瑞利信道后的信号y_n');
axis([0,1000,-1.5,1.5]);
subplot(3,1,3);plot(y_n0);title('BPSK调制信号s通过高斯信道后的信号y_n0');
axis([0,1000,-1.5,1.5]);
figure(3);
subplot(4,1,1);plot(y);title('y_n通过带通滤波器后的信号y');
axis([0,2000,-1.5,1.5]);
subplot(4,1,2);plot(x1);title('y与恢复载波相乘后的信号x1');
axis([0,2000,-1.5,1.5]);
subplot(4,1,3);plot(x);hold on;plot(e);
grid on;legend('x1通过低通滤波器后的信号x','原始基带信号e');
axis([0,2000,-1.5,1.5]);
subplot(4,1,4);stem(d);hold on;stem(a,'*');
legend('x经过信息比特提取后得到的信息序列d','原始信息序列a');
axis([0,20,0,1.5]);
子程序
function h=fun_tiqu(x,L)
%提取出信息比特
%x为输入信号,L为信号的码元长度
for i=1:length(x)/L;
C=x((i-1)*L+1:i*L);
t=sum(C);
if t>=0
h(i)=1;
else
h(i)=0;
end
end
BPSK误码率
clear all;
close all;
%误码率曲线的绘制
SNR=1:1:20;%信噪比变化范围
snr=10.^(SNR/10);%将信噪比转化成直角坐标
N=1000000;%仿真点数
M=2;%进制数
x=randi([0,1],1,N); %产生随机信号
y=pskmod(x,M);%调用matlab自带的psk调制函数
for i=1:length(SNR);
N0=1/2/snr(i);%计算噪声功率
N0_dB=10*log10(N0);%将噪声功率转换为dBW
ni=wgn(1,N,N0_dB);%产生高斯噪声
h=raylrnd(1/sqrt(2),1,N);%产生瑞利信号
yAn=y+ni;%通过高斯信道
yA=pskdemod(yAn,M);%调用matlab自带的psk解调函数
bit_A=length(find(x~=yA));%统计错误比特数
BPSK_s_AWGN(i)=bit_A/N;%计算误码率
yRn=y.*h+ni;%通过瑞利信道
yR=pskdemod(yRn,M);%调用matlab自带的psk解调函数
bit_R=length(find(x~=yR));%统计错误比特数
BPSK_s_Ray(i)=bit_R/N;%计算误码率
end
BPSK_t_AWGN=1/2*erfc(sqrt(snr));%AWGN信道下BPSK理论误码率
BPSK_t_Ray=1/2*(1-sqrt((snr)./(1+snr)));%Rayleigh信道下BPSK理论误码率
%绘制图形
figure;
semilogy(SNR,BPSK_s_AWGN,'-k*');hold on;
semilogy(SNR,BPSK_t_AWGN,'-go');hold on;
semilogy(SNR,BPSK_s_Ray,'-b*');hold on
semilogy(SNR,BPSK_t_Ray,'-ro');grid on;
axis([-1,20,10^-5,1]);
legend('AWGN仿真','AWGN理论','瑞利仿真','瑞利理论');
title('BPSK误码性能分析');
xlabel('信噪比(dB)');ylabel('BER');