简易北斗C/A码matlab仿真

简易北斗C/A码matlab仿真

1.C/A码产生原理
BD2B1 CA码产生原理框图如图所示,图中的方框可以通过移位寄存器来实现,模2加用异或来实现。从图下可见,码由两个线性序列G1 和G2 模二和产生平衡Gold 码后截短1 码片生成。G1 和G2 序列分别由两个11 级线性移位寄存器生成,其生成多项式为:
G1(X)=1+X+X7+X8+X9+X10+X11(系数为代码中的S1)
G2(X)=1+X+X2+X3+X4+X5 +X8+X9+X11(系数为代码中的S2)
G1 和G2 的初始相位为:01010101010
在这里插入图片描述
图1 C/A码原理框图

通过对产生 G2 序列的移位寄存器不同抽头的模二和可以实现 G2 序列相位的不同偏移(图中G2序列的两个抽头用虚线表示,证明这两个抽头是任意的,而不仅仅是图中的6和11),与 G1 序列模二和后可生成不同卫星的 CA 码。G2不同抽头对应的不同PRN码如下表:
在这里插入图片描述

图2 北斗2卫星的相位分配表

详细可参考“北斗卫星导航系统空间信号接口控制文件 2.0 版”规范。
2.设计思路
由图一我们可进行编程,先设置两个11位的寄存器reg1和reg2以及G1G2系列对应的多项式系数矩阵s1和s2,因为北斗的Gold码为2^11-1-1=2046位,故而在进行移位时for函数需要循环2046次。
G1的for循环,先是确定抽头为11,即g1(i)=reg1(11);然后是系数多项式s1和寄存器reg1进行模二和完事后,先将寄存器向右移位,即1位到10位的数给2位到11位,即reg1(1,2:11)=reg1(1,1:10);再之后是将模二和的值给寄存器reg1的第一位。共循环2046次。
G2因为有两个抽头所以,把其先分为G21和G22,他两的运行原理和G1是一样的,就是在抽头部分可以任意选择是哪一位置,如上图一表示选择6和11位。
G2等于G21和G22的模二和也就是异或(即相同为0,不同为1),所以我们先是对两序列相加,因为序列中只有0和1,故其结果只有0,1和2,由异或可知当数为1时,标准G21和G22的数是相异的,为0和2时标准其是相同的(0+0或1+1)。故当其输出值为1时为1,数值为0或2时,为0,所以用find函数找出是2的位再将其换成0。其仿真代码如下:

简易代码如下:

reg1=[0 1 0 1 0 1 0 1 0 1 0]; %寄存器1初始相位为01010101010
   s1=[1 0 0 0 0 0 1 1 1 1 1];%G1多项式系数矩阵
for i=1:2046       %循环2046g1(i)=reg1(11); %G1抽头为寄存器的第11位
    slave1=mod( sum(reg1.*s1),2 ) ;%多项式系数与寄存器模2reg1(1,2:11)=reg1(1,1:10);%寄存器移位幅值
    reg1(1)=slave1;%给寄存器第一位重新赋值
end
reg2=[0 1 0 1 0 1 0 1 0 1 0]; %寄存器2初始相位为01010101010
s2=[1 1 1 1 1 0 0 1 1 0 1];%G1多项式系数矩阵
for i=1:2046
    g21(i)=reg2(4);%G21抽头为寄存器的第4位(随机可改)
    slave2= mod( sum(reg2.*s2) , 2 );%多项式系数与寄存器模2reg2(1,2:11)=reg2(1,1:10);%寄存器移位
    reg2(1)=slave2;%给寄存器第一位重新赋值
end
for i=1:2046
    g22(i)=reg2(9);%G21抽头为寄存器的第9位(随机可改)
    slave3=mod( sum(reg2.*s2) , 2 ) ;
    reg2(1,2:11)=reg2(1,1:10);
    reg2(1)=slave3;
end
g2=g21+g22;
ind1=find(g2==2);%选出序列中为2的值
g2(ind1)=zeros(1,length(ind1));%2的值全替换为0

ca=g1+g2;
ind2=find(ca==2);
ca(ind2)=zeros(1,length(ind2));
temp=ca(1:200);%抽出1200的值
x(1)=0;show(1)=temp(1);p=2;
for i=2:length(temp)  %将其以方波形式显示出来
     if((temp(i)~=temp(i-1))) 
         x(p)=i;
         show(p)=temp(i-1);
         x(p+1)=i+0.01;
         show(p+1)=temp(i);
         p=p+2;
     else
         show(p)=temp(i);
         x(p)=i;
         p=p+1;
     end
end
plot(x,show);
axis([0 length(x)+5 0 1.5]);grid;
  • 14
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Verilog中实现北斗C/A扩频与解扩电路设计需要编写多个模块,下面是一个可能的编示例: ``` // 扩频模块 module prn_generator(clk, reset, prn); input clk, reset; output [10:0] prn; // 11位的伪随机 reg [10:0] shift_reg; always @(posedge clk) begin if (reset) begin shift_reg <= 11'b11111111111; // 初始状态为全1 end else begin shift_reg <= {shift_reg[9:0], shift_reg[10] ^ shift_reg[2] ^ shift_reg[1] ^ shift_reg[0]}; end end assign prn = shift_reg; endmodule // 扩频器模块 module prn_multiplier(clk, reset, prn, signal_in, signal_out); input clk, reset; input [10:0] prn; input [7:0] signal_in; output [7:0] signal_out; reg [7:0] product; always @(posedge clk) begin if (reset) begin product <= 8'b0; end else begin product <= prn[10] ? signal_in : ~signal_in; // 根据扩频的值进行相应的乘法运算 end end assign signal_out = product; endmodule // 解扩器模块 module prn_despreader(clk, reset, prn, signal_in, signal_out); input clk, reset; input [10:0] prn; input [7:0] signal_in; output [7:0] signal_out; reg [7:0] product; always @(posedge clk) begin if (reset) begin product <= 8'b0; end else begin product <= prn[10] ? signal_in : 8'b0; // 根据扩频的值进行相应的乘法运算 end end assign signal_out = product; endmodule // 信号发生器模块 module signal_generator(clk, reset, signal_out); input clk, reset; output [7:0] signal_out; reg [31:0] counter; always @(posedge clk) begin if (reset) begin counter <= 32'b0; end else begin counter <= counter + 32'h1; // 以固定的频率递增计数器 end end assign signal_out = {8{counter[22]}}; // 将计数器的第22位复制8次作为输出信号 endmodule // 接收器模块 module signal_receiver(clk, reset, received_signal, prn, signal_out); input clk, reset; input [7:0] received_signal; input [10:0] prn; output [7:0] signal_out; wire [7:0] despread_signal; prn_despreader despreader(clk, reset, prn, received_signal, despread_signal); assign signal_out = despread_signal; endmodule ``` 以上是一个简单的Verilog实现示例,仅供参考。实际应用中需要根据具体的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值