⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bit_syn.m

📁 这是关于扩频通信中载波同步的程序,希望对大家能有用.
💻 M
字号:
clear;
Rb=5000000/31;%信息数据速率
lc=31;%一个信息数据扩频成31个码元。扩频增益13dB
Rc=Rb*lc;%码元速率

L=13;%每个码元里sin信号的周期个数
fc=Rc*L; %载波频率

Q=4;%每个码元中采样个数
fs=Rc*Q;%采样频率
ts=1/fs;%每个取样点的时间间隔

data_number=30;%信息数据的个数
sample_number=data_number*lc*Q;%采样得到的总的数据个数
t=0:ts:(sample_number-1)*ts;

%%取均匀分布的随机数据100个,即信息数据
temp=rand(1,data_number);
for i=1:data_number
    if (temp(i)<0.5)
        data1(i)=-1;
        data((i-1)*lc*Q+1:i*lc*Q)=-1;
    else
        data1(i)=1;
        data((i-1)*lc*Q+1:i*lc*Q)=1;
    end
end
a=1;%载波的幅度值
mod_sig=a*data.*cos(2*pi*fc*t);%调制,产生bpsk信号
%%位同步的初始值
[lowpass2_B,lowpass2_A1]=cheby2(3,10,0.1);%切比雪夫2型低通滤波器
lowpass2_A=lowpass2_A1(2:length(lowpass2_A1));%a0为1,所以乘的时候从a1开始乘即可
data_lowpass2_A=zeros(1,length(lowpass2_A));%经过低通滤波器后的数据
data_lowpass2_B=zeros(1,length(lowpass2_B));
output_lowpass2=0;

m=Q*lc/2;
N1=2;
N2=2; 
M1=3;

before_sum=0;
after_sum=0;
before_and_after_sum=0;
bit_before_division=0;
before_flag=0;
after_flag=0;

bit2_new=1;
bit2_old=0;
bit1_new=0;
bit1_old=1;

in_phase_integral=0;%同相积分值
middle_phase_integral=0;%中相积分值

in_phase_hold_new=0;
middle_phase_hold_new=0;

integral=0;
jjj=1;

pp=3;
e_q=mod_sig.*cos(2*pi*fc*t);%乘以相干载波
e_q=e_q(pp:length(e_q));%去掉前面2点
%画图
figure;
subplot(2,1,1);
plot(e_q);
subplot(2,1,2);
plot(filter(lowpass2_B,lowpass2_A1,e_q));
%%%%%%%%%%%%%%%%
for i=1:length(mod_sig)-11; %%位同步信号的恢复    
    
    %通过切比雪夫低通滤波器,滤除高频分量
    data_lowpass2_B(1:length(lowpass2_B)-1)=data_lowpass2_B(2:length(lowpass2_B));%去掉前面1点
    data_lowpass2_A(1:length(lowpass2_A)-1)=data_lowpass2_A(2:length(lowpass2_A));%去掉前面1点
    data_lowpass2_B(length(lowpass2_B))=e_q(i);
    data_lowpass2_A(length(lowpass2_A))=output_lowpass2;
    output_lowpass2=sum(data_lowpass2_B(length(lowpass2_B):-1:1).*lowpass2_B)-sum(data_lowpass2_A(length(lowpass2_A):-1:1).*lowpass2_A);%差分方程的实现

    shuchu(i)=output_lowpass2;
    %判决,得到0、1方波序列
    if output_lowpass2>0
        output_lowpass2_reshape=1;
    else
        output_lowpass2_reshape=0;
    end   
    
    bit_input(i)=output_lowpass2_reshape;

    in_phase_hold_old=in_phase_hold_new;
    if bit2_new-bit2_old==1
        if in_phase_integral>0
            in_phase_hold_new=1;
        else
            in_phase_hold_new=0;
        end
        in_phase_integral=0;
    end
        
    if bit1_new-bit1_old==1
        if middle_phase_integral>0
            middle_phase_hold_new=1;
        else
            middle_phase_hold_new=0;
        end
        middle_phase_integral=0;
    end
    
    shuchu1(i)=bit1_new;
    shuchu2(i)=bit2_new;   
    
    bit1_old=bit1_new;
    bit2_old=bit2_new;
    
    in_phase_integral=in_phase_integral+bit_input(i);
    middle_phase_integral=middle_phase_integral+bit_input(i);
    
    in_phase_hold_diff=in_phase_hold_new-in_phase_hold_old;
    middle_phase_hold_xor_in=xor(in_phase_hold_new,middle_phase_hold_new);
    
    before=in_phase_hold_diff*middle_phase_hold_xor_in;
    after=in_phase_hold_diff*not(middle_phase_hold_xor_in);
    
    if before==1
        before_sum=before_sum+1;
        before_and_after_sum=before_and_after_sum+1;
    end
    if after==1
        after_sum=after_sum+1;
        before_and_after_sum=before_and_after_sum+1;
    end
    if before_sum==N1
        before_sum=0;
        after_sum=0;
        before_and_after_sum=0;
        bit_before_division=bit_before_division-1;%调整长度
    end
    if after_sum==N1
        before_sum=0;
        after_sum=0;
        before_and_after_sum=0;
        bit_before_division=bit_before_division+1;%调整长度
    end
    if before_and_after_sum==M1
        before_sum=0;
        after_sum=0;
        before_and_after_sum=0;
    end
    
    bit_before_division=bit_before_division+1;
    jlz(i)=bit_before_division;
    
    if bit_before_division>=m %分频
        bit1_new=~bit1_old;
        bit2_new=~bit2_old;
        bit_before_division=rem(bit_before_division,m);
    else
        bit1_new=bit1_old;
        bit2_new=bit2_old;
    end
    bit_syn(i)=bit1_new-bit1_old;%找下跳边沿
    if bit_syn(i)==-1
        if integral>Q*lc/2
            output_data(jjj)=1;
        else
            output_data(jjj)=-1;
        end
        integral=0;
        jjj=jjj+1;
    end
    integral=integral+output_lowpass2_reshape;       
end
%画图
figure
subplot(2,1,1)
stem(data(pp:length(data)))
subplot(2,1,2)
stem(shuchu2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -