www.pudn.com > pnt.rar > pnt.m


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