clear
EbN0=10%
N0=10^(-EbN0/10);
noiseVar=N0/2; %噪声密度
noiseRoot=sqrt(noiseVar); %噪声的均方差
N=rand(1,7)>=0.5; %生成7个码元
w=100; %载波信号的频率
stept=0.0001;
t0=0:stept:2*pi/w; %码元持续时间
n=length(t0);%时间点个数
a1=ones(1,n);
a2=ones(1,n-1);
t1=zeros(1,7*n-6);
t=t1;%时间坐标
t(1:n)=t0; %第一周期段
t(n+1:2*n-1)=2*pi/w+stept:stept:2*2*pi/w; %第二周期段
%后五个周期段
for i=1:5
t((i+1)*n-(i-1):(i+2)*n-(i+1))=(2*(i+1)*pi/w+stept:stept:(i+2)*2*pi/w);
end
st=t1; %基带信号幅度
st(1:n)=a1*N(1); %第一周期内码基带幅度值
st(n+1:2*n-1)=a2*N(2); %第二周期内码基带幅度值
re=zeros(1,5);
retan=re;
retan=N(3:7);
figure(1) %画出基带信号
subplot(4,2,1);
%判断一个码元与其后的码元是否相等,若相等,直接输出这个码元周期内基带信号,否则输出本码元周期内基带信号后输出一个幅度为1的冲击信号
if N(1)==N(2)
plot(t(1:n),st(1:n)); %第一周期内基带信号
hold on;
plot(t(n+1:2*n-1),st(n+1:2*n-1)) ; %第二周期内基带信号
else
plot(t(1:n-1),st(1:n-1)); %第一周期内基带信号
hold on;
plot(t(n+1:2*n-1),st(n+1:2*n-1)); %第二周期内基带信号
hold on;
plot([2*pi/w,2*pi/w],[0,1]); %单位冲击信号
end
%剩下后五个周期内基带信号
for i=1:5
st((i+1)*n-(i-1):(i+2)*n-(i+1))=a2*retan(i);
if retan(i)==N(i+1)
hold on;
plot(t((i+1)*n-(i-1):(i+2)*n-(i+1)),st((i+1)*n-(i-1):(i+2)*n-(i+1)));
else
hold on;
plot(t((i+1)*n-(i-1):(i+2)*n-(i+2)),st((i+1)*n-(i-1):(i+2)*n-(i+2)));
hold on;
plot([(i+1)*2*pi/w,2*(i+1)*pi/w],[0,1]);
end
end
axis([0,2*7*pi/100+0.1,0,1.5]);
title('基带信号s(t)');
xlabel('时间t');
ylabel('幅度s(t)');
yt=cos(100*t); %载波信号
ut=t1; %未加噪声已调信号
ut(1:n)=N(1)*yt(1:n);
ut(n+1:2*n-1)=N(2)*yt(n+1:2*n-1);
subplot(4,2,2);
plot(t,yt);
title('载波信号');
subplot(4,2,3);
plot(t,ut);
title('未加噪声已调信号');
vois=noiseRoot*randn(1,7*n-6); %噪声信号
vut=ut+vois; %增加噪声后已调信号
subplot(4,2,4);
plot(t,vois);
title('噪声信号')
subplot(4,2,5);
plot(t,vut);
title('增加噪声后的已调信号');
ryt=vut.*cos(w*t); %相干解调后信号
subplot(4,2,6);
plot(t,ryt);
title('相干解调后信号');
ryt1=1/2*filtfilt(ones(1,10),7,ryt); %经低通滤波器
subplot(4,2,7);
plot(t,ryt1);
title('经低通滤波器后信号');
or=zeros(1,7);
oreage=or; %记录各个抽样值
roreage=re; %记录后五个抽样值
oreage(1)=ryt(n-314); %第一个码元中间点抽样
oreage(2)=ryt(n+314); %第二个码元中间点抽样
N1=or; %记录还原码元
retan1=re; %记录后五位还原码元
for i=1:5
roreage(i)=ryt(n+(2*i+1)*314); %剩余码元中间点抽样
end
oreage(3:7)=roreage(1:5);
yt1=t1; %抽样后的信号
if oreage(1)>=1/2 %判决第一个抽样结果
N1(1)=1; %记录第一个抽样后还原码元
yt1(1:n)=a1; %还原码元的基带信号
else
N1(1)=0; %记录第一个抽样后的还原码元
yt1(1:n)=0*a1(1:n); %还原第一个码元的基带信号
end
if oreage(2)>=1/2
N1(2)=1; %记录第二个抽样后还原码元
yt1(n+1:2*n-1)=a2; %还原第二个码元的基带信号
else
N1(2)=0; %记录第二个抽样后还原码元
yt1(n+1:2*n-1)=0*a2; %还原第二个码元的基带信号
end
for i=1:5 %还原剩下码元的基带信号
if roreage(i)>=1/2
yt1((i+1)*n-(i-1):(i+2)*n-(i+1))=a2;
retan1(i)=1; %记录剩下抽样后还原码元
else
retan1(i)=0; %记录剩下抽样后还原码元
yt1((i+1)*n-(i-1):(i+2)*n-(i+1))=a2*0;
end
end
N1(3:7)=retan1(1:5);
%画出解调后基带信号
subplot(4,2,8);
if N1(1)==N1(2)
plot(t(1:2*n-1),yt1(1:2*n-1)); %画出第一周期段基带信号
else
plot(t(1:n),yt1(1:n)); %画出第一周期段基带信号
hold on;
plot([2*pi/w,2*pi/w],[0,1]); %画单位冲击信号
hold on;
plot(t(n+1:2*n-1),yt1(n+1:2*n-1)) ;%画出第二周期段基带信号
end
%画出剩余五个周期中的基带信号
for i=1:5
if retan1(i)==N1(i+1)
hold on;
plot(t((i+1)*n-(i-1):(i+2)*n-(i+1)),yt1((i+1)*n-(i-1):(i+2)*n-(i+1)));
else
hold on;
plot(t((i+1)*n-(i-1):(i+2)*n-(i+1)),yt1((i+1)*n-(i-1):(i+2)*n-(i+1)));
hold on;
plot([(i+1)*2*pi/w,2*(i+1)*pi/w],[0,1]);
end
end
axis([0,2*7*pi/100+0.1,0,1.5]);
title('解调后的信号');
%不同信噪比下误码率仿真
rand('state',sum(100*clock));
rand('state',sum(100*clock));
close all;
%clear all;
minTestLength=100000; %测试个数最低抽样下限
maxTestLength=100000000; %测试个数的最大抽样下限
A=1; %已调信号最大幅度值
Eb=A*A; %2倍调制信号
index=1; %作为每个信噪比的下标
for EbN0=0:2:10%
N0=Eb*10^(-EbN0/10);
noiseVar=N0/2; % 噪声密度
noiseRoot=sqrt(noiseVar); %噪声的均方差
errorCount=0; %误码的符号个数
testCount=0; %测试次数
t=zeros(1,7*n-6);
while(1)
N=rand(1,7)>=0.5; %生成7个码元
retan=N(3:7);
yt=cos(100*t); %载波信号
ut=t1; %未加噪声已调信号
ut(1:n)=N(1)*yt(1:n);
ut(n+1:2*n-1)=N(2)*yt(n+1:2*n-1);
for i=1:5
ut((i+1)*n-(i-1):(i+2)*n-(i+1))=yt((i+1)*n-(i-1):(i+2)*n-(i+1))*retan(i);
end
vois=noiseRoot*randn(1,7*n-6); %噪声信号
vut=ut+vois; %增加噪声后已调信号
ryt=vut.*cos(w*t); %相干解调后信号
ryt1=1/2*filtfilt(ones(1,7),7,ryt); % 经低通滤波器
%抽样还原信号
or=zeros(1,7);
oreage=or;
roreage=re;
oreage(1)=ryt(n-314); %第一个码元中间点抽样
oreage(2)=ryt(n+314); %第二个码元中间点抽样
N1=or;
retan1=re;
for i=1:5
roreage(i)=ryt(n+(2*i+1)*314); %剩余码元中间点抽样
end
oreage(3:7)=roreage;
yt1=t1; %抽样后的信号
if oreage(1)>=1/2 %判决第一个抽样结果
N1(1)=1; %记录第一个抽样后还原码元
yt1(1:n)=a1; %还原码元的基带信号
else
N1(1)=0; %记录第一个抽样后的还原码元
yt1(1:n)=0*a1(1:n); %还原第一个码元的基带信号
end
if oreage(2)>=1/2
N1(2)=1; %记录第二个抽样后还原码元
yt1(n+1:2*n-1)=a2; %还原第二个码元的基带信号
else
N1(2)=0; %记录第二个抽样后还原码元
yt1(n+1:2*n-1)=0*a2 ;%还原第二个码元的基带信号
end
for i=1:5 %还原剩下码元的基带信号
if roreage(i)>=1/2
yt1((i+1)*n-(i-1):(i+2)*n-(i+1))=a2;
retan1(i)=1; %记录剩下抽样后还原码元
else
retan1(i)=0; %记录剩下抽样后还原码元
yt1((i+1)*n-(i-1):(i+2)*n-(i+1))=a2*0;
end
end
N1(3:7)=retan1(1:5);
e=xor(N1,N); %判断有没有误判,解调后的数据和发送端的数据做亦或运算,相同则为0,不同则为1
errorCount=errorCount+sum(e); %记录生成误码的个数
testCount=testCount+7;
评论0