版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hxxjxw/article/details/82629113
本文参照上记文章对抽样判决进行了一定的修改
注:相关解调时,如果与载波的相位不一致,容易导致解调不成功
clear;
clc;
A = 1.2;
VolOff = 1.7;
i=32;%基带信号码元数
N = 9.6*6/1.2;
j=i*N;
%t=linspace(0,0.002,j);%0-5之间产生5000个点行矢量,即将[0,5]分成5000份
N = 9.6*6/1.2;
d = 0.000833/N;
%d = 0.0025/N;
t=0:d:d*(j-1);
sss=d*(j-1);
f1=1300;%载波1频率
f2=2100;%载波2频率
fm=i/sss;%基带信号频率 码元数是10,而时域长度是5,也就是一个单位2个码元
%a=round(rand(1,i));%产生随机序列
%a=[1,0,1,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,0,0,1,0];
a = [1 1 1 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1];
%产生基带信号
%st1=t;
for n=1:32
if a(n)<1
for m=j/i*(n-1)+1:j/i*n %1984/32*2=1984/64
st1(m)=0;
end
else
for m=j/i*(n-1)+1:j/i*n
st1(m)=1;
end
end
end
figure(1);
subplot(411);
plot(t,st1);
title('基带信号st1');
%axis([0,5,-1,2]);
%基带信号求反
st2=t;
for n=1:j
if st1(n)==1
st2(n)=0;
else
st2(n)=1;
end
end
subplot(412);
plot(t,st2);
title('基带信号反码st2');
%axis([0,5,-1,2]);
%载波信号
s1=A*cos(2*pi*f1*t)+VolOff;
s2=A*cos(2*pi*f2*t)+VolOff;
subplot(413),plot(s1);
title('载波信号s1');
subplot(414),plot(s2);
title('载波信号s2');
%调制
F1=st1.*s1;%加入载波1
F2=st2.*s2;%加入载波2
figure(2);
subplot(411);
plot(t,F1);
title('F1=s1*st1');
subplot(412);
plot(t,F2);
title('F2=s2*st2');
e_fsk=F1+F2;
subplot(413);
plot(t,e_fsk);
title('2FSK信号');%键控法产生的信号在相邻码元之间相位不一定连续
%加噪
nosie=rand(1,j);
fsk=e_fsk+nosie;
%fsk=e_fsk;
subplot(414);
plot(t,fsk);
title('加噪声后信号')
%相干解调
st1=fsk.*s1; %与载波1相乘
%[f,sf1] = T2F(t,st1);%傅里叶变换
%[t,st1] = lpf(f,sf1,2*fm);%通过低通滤波器
figure(3);
subplot(311);
plot(t,st1);
title('加噪后的信号与s1相乘后波形');
st2=fsk.*s2;%与载波2相乘
%[f,sf2] = T2F(t,st2);%傅里叶变换
%[t,st2] = lpf(f,sf2,2*fm);
subplot(312);
plot(t,st2);
title('加噪后的信号与s2相乘后波形');
%抽样判决
sum1=0;
sum2=0;
for m=0:i-1
for j=m*N+1:(m+1)*N
sum1 = sum1+st1(j);
sum2 = sum2+st2(j);
end
if sum1>sum2
%at(m+1)=1;
for j=m*N+1:(m+1)*N
at(1,j)=1;
end
else
%at(m+1)=0;
for j=m*N+1:(m+1)*N
at(1,j)=0;
end
end
sum1=0;
sum2=0;
end
subplot(313);
plot(t,at);
%axis([0,5,-1,2]);
title('抽样判决后波形')
for i=1:32
if a(i) ~= at(i*N)
print_str = sprintf('a[%d]=%d,data[%d]=%d \r\n',i,a(i),i, at(i*N));
disp(print_str);
end
end
调试结果: