function [Y]=DSSS(X, mode)
% 完成DSSS调制解调功能
% mode=[1,2]. 1进行调制,2进行解调,未指定时自动完成调制和解调两个功能。
switch nargin
case 0
X='This is a test.';
Y=DSSS(X);
return
case 1
Y1=DSSS(X, 1);
Y2=DSSS(Y1, 2);
Y=Y2;
return;
case 2
if mode==1%调制
D=ones(1,7);
m_sequence=Msequence(D);
X_length=length(X);
ascii_value=abs(X);
ascii_binary=zeros(X_length,7);
%将数据转换为ASCII二进制码
for ii=1:X_length
ascii_binary(ii,:)=Binary(ascii_value(ii));
end
subplot(2,3,1);plot(reshape(ascii_binary,1,X_length*7));title('A:输入数据');
%扩频
Sp_expand=zeros(X_length,127*7);
for ii=1:X_length
for jj=1:7
Sp_expand(ii,127*jj-126:127*jj)=xor(m_sequence,ascii_binary(ii,jj));
end
end
subplot(2,3,2);plot(reshape(Sp_expand,1,X_length*127*7));title('B:数据扩展');
%将扩频码转换为BPSK(1,-1)序列
for ii=1:X_length
for jj=1:127*7
if~(Sp_expand(ii,jj))
Sp_expand(ii,jj)=-1;
end
end
end
Sp_expand_bpsk=reshape(Sp_expand,1,X_length*127*7);
subplot(2,3,3);plot(Sp_expand_bpsk);title('C:BPSK调制')
Y=Sp_expand_bpsk;
elseif mode==2%解调
D=ones(1,7);
m_sequence=Msequence(D);
%将BPSK双极性转换为单极性
l=length(X)/(127*7);
X_length=length(X);
for ii=1:X_length
if X(ii)==-1
X(ii)=0;
end
end
Sp_expand=reshape(X,l,127*7);
subplot(2,3,4);plot(X);title('D:数据传输');
ascii_binary=zeros(l,7);
Demodulate_binary=zeros(l,127*7);
%接收处解调
for ii=1:l
for jj=1:7
Demodulate(ii,127*jj-126:127*jj)=xor(m_sequence, Sp_expand(ii,127*jj-126:127*jj));
end
end
for ii=1:l
for jj=1:7
ascii_binary(ii,jj)=Demodulate(ii,127*jj-126);
end
end
subplot(2,3,6);plot(reshape(ascii_binary,1,l*7));title('E:数据输出');
%将ASCII二进制转换为输出数据
A=zeros(1,l);
for ii=1:l
A(ii)=Ascii(ascii_binary(ii,:));
end
Y=char(A);
else
mode=1;
end
return
end
%代码主体,执行中画出各点波形。
%ASCII数值二进制比特转换
function [YY]=Binary(Z1)
z=zeros(1,7);
z(1)=mod(Z1,2);
a=floor(Z1/2);
for ll=1:6
z(ll+1)=mod(a,2);
a=floor(a/2);
if a==0
break;
end
end
YY=z;
%二进制比特转换为ASCII数值
function [ZZ]=Ascii(Z2)
l=length(Z2);
A=0;
for ii=1:l
A=Z2(ii)*2^(ii-1)+A;
end
ZZ=A;
%生成m序列
function [Y]=Msequence(X)
switch nargin
case 0
Y=Msequence(X);
return
case 1
l=length(X);
mp_register=X;
out_sequence=zeros(1,2^l-1);
sum_xor=0;
for ii=1:2^l-1
out_sequence(ii)=mp_register(l);
sum_xor=xor(mp_register(l),mp_register(l-1));
for jj=1:l-1
mp_register(l-jj+1)=mp_register(l-jj);
end
mp_register(1)=sum_xor;
if mp_register==X
break;
end
end
Y=out_sequence;
return
end
评论0