加载中...

捕获和积累学习及仿真

MATLAB仿真

目录

捕获算法

代码实现

  • 高信噪比

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    %-----------------------------------------------------------------%
    %Title: bpsk_dsss_capture
    %Data: 2022/11/23 21:24:35
    %Author: Potter
    %Function: 伪码同步----捕获相关
    %Version: Matlab 2022b
    %Tags: 高信噪比
    %----------------------------------------------------------------%
    clc; clear; close all;
    %----------------------参数设定-----------------------------------%
    symbol_rate = 10000; %符号速率
    sps = 8; %每个符号4个采样点-----samples per symbol
    fs = sps * symbol_rate; % 采样率
    span = 6;
    fc = fs / 4; % 载波频率
    alfs = 0.35; % 滚降系数
    N = 10; %数据长度
    is_plot = 1; %是否打印输出

    %%------------------------发送端-----------------------------------%%

    %----------------------发送序列------------------------------------%
    %data = repmat([0,1], 1,N/2);
    data = randi([0 1], 1, N); %生成0,1序列

    %------------------------映射--------------------------------------%
    s = (data - 1/2) * 2; %映射,0变-1

    %-----------------------生成扩频序列(m序列)--------------------------%
    n = 7; %阶次
    p = 2^n - 1; %循环周期
    ms = idinput(p, 'prbs');
    % mg = repmat(ms',1,N); %重复m序列
    % s = rectpulse(s,p);
    % y = s.*mg; %信号与扩频码相乘
    m_1 = ms .* s;
    y_send = reshape(m_1, [1, p * N]);

    %-----------------------根升余弦滤波成型----------------------------%
    y_up = upsample(y_send, sps); % 上采样
    fir_rcos = rcosdesign(alfs, 6, sps, 'sqrt');
    data_bx = conv(y_up, fir_rcos, 'same'); %根升余弦滤波

    %---------------------------上变频---------------------------------%
    t = 0:length(data_bx) - 1;
    carrier = cos(2 * pi * fc / fs * t); %载波
    s_up = carrier .* data_bx; %上变频(乘以载波)

    %----------------------------接收端-----------------------------------%

    r_n = awgn(s_up, 10, 'measured'); %添加噪声
    N = 100; %填0的个数
    r_n_add_0 = [zeros(1, N), r_n];

    %-----------------------------正交下变频-----------------------------%
    delta_f = 0; %载波频偏数值
    t1 = 0:length(r_n_add_0) - 1;
    carrier_cos = cos(2 * pi * (fc +delta_f) / fs * t1);
    carrier_sin = sin(2 * pi * (fc +delta_f) / fs * t1);
    sig_I = r_n_add_0 .* carrier_cos;
    sig_Q = r_n_add_0 .* carrier_sin;

    sig_complex = complex(sig_I, sig_Q);

    %-----------------------------截位-----------------------------------%
    l = length(ms)*sps;
    sig_complex_1 = sig_complex(1:1:l);
    sig_fft_complex_1 = fft(sig_complex_1, l);

    %-----------------------------捕获-----------------------------------%

    mg_up = upsample(ms.', sps);
    mg_up_fft = fft(mg_up);
    mg_up_fft_conj = conj(mg_up_fft);
    Y = zeros(l,l);
    y = zeros(l,l);
    for i = 1:80
    % y(i,:) = circshift(sig_fft_complex_1,i-1) .* mg_up_fft_conj;
    u = circshift(mg_up_fft_conj,i-40);
    Y(i,:) = u.*sig_fft_complex_1;
    y(i,:) = ifft(Y(i,:));
    end

    figure;
    mesh(abs(y));
    set(gca,'YLim',[0 80]);
    set(gca,'XLim',[0 200]);

  • 低信噪比

    不进行积累运算

    代码与上面一致,只修改下面一行r_n = awgn(s_up, -20, 'measured'); %添加噪声此时输出如下图
    此时发现相关峰值已经很不明显,甚至找不到,信号几乎完全淹没在噪声中
    故而运用积累算法,修改代码如下

    进行积累

    核心代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    %截位
    l = length(ms) * sps;
    sig_complex_1 = sig_complex(1:1:l);
    sig_fft_complex_1 = fft(sig_complex_1, l);

    k_num = 40; %截取数据的段数
    sig_complex_cut = zeros(k_num, l);
    sig_complex_cut_fft = zeros(k_num, l);
    Y = zeros(l, l);
    y = zeros(l, l);
    z = zeros(l, l); %积累后的数据

    for k = 1:k_num
    sig_complex_cut(k, :) = sig_complex(1 + (k - 1) * l:1:k * l);
    sig_complex_cut_fft(k, :) = fft(sig_complex_cut(k, :));

    for i = 1:80
    Y(i, :) = circshift(sig_complex_cut_fft(k, :), i - 40) .* mg_up_fft_conj;
    y(i, :) = ifft(Y(i, :));
    end

    z = abs(z) + abs(y);
    end


    • 完整代码
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      %-----------------------------------------------------------------%
      %Title: bpsk_dsss_capture
      %Data: 2022/11/23 21:24:35
      %Author: Potter
      %Function: 伪码同步----捕获相关
      %Version: Matlab 2022b
      %Tags: 低信噪比
      %----------------------------------------------------------------%
      clc; clear; close all;
      %----------------------参数设定-----------------------------------%
      symbol_rate = 10000; %符号速率
      sps = 8; %每个符号4个采样点-----samples per symbol
      fs = sps * symbol_rate; % 采样率
      span = 6;
      fc = fs / 4; % 载波频率
      alfs = 0.35; % 滚降系数
      N = 1000; %数据长度
      is_plot = 1; %是否打印输出

      %%------------------------发送端-----------------------------------%%

      %----------------------发送序列------------------------------------%
      %data = repmat([0,1], 1,N/2);
      data = randi([0 1], 1, N); %生成0,1序列

      %------------------------映射--------------------------------------%
      s = (data - 1/2) * 2; %映射,0变-1

      %-----------------------生成扩频序列(m序列)--------------------------%
      n = 7; %阶次
      p = 2^n - 1; %循环周期
      ms = idinput(p, 'prbs');
      % mg = repmat(ms',1,N); %重复m序列
      % s = rectpulse(s,p);
      % y = s.*mg; %信号与扩频码相乘
      m_1 = ms .* s;
      y_send = reshape(m_1, [1, p * N]);

      %-----------------------根升余弦滤波成型----------------------------%
      y_up = upsample(y_send, sps); % 上采样
      fir_rcos = rcosdesign(alfs, 6, sps, 'sqrt');
      data_bx = conv(y_up, fir_rcos, 'same'); %根升余弦滤波

      %---------------------------上变频---------------------------------%
      t = 0:length(data_bx) - 1;
      carrier = cos(2 * pi * fc / fs * t); %载波
      s_up = carrier .* data_bx; %上变频(乘以载波)

      %----------------------------接收端-----------------------------------%

      r_n = awgn(s_up, -20, 'measured'); %添加噪声
      N = 100; %填0的个数
      r_n_add_0 = [zeros(1, N), r_n];

      %-----------------------------正交下变频-----------------------------%
      delta_f = 0; %载波频偏数值
      t1 = 0:length(r_n_add_0) - 1;
      carrier_cos = cos(2 * pi * (fc +delta_f) / fs * t1);
      carrier_sin = sin(2 * pi * (fc +delta_f) / fs * t1);
      sig_I = r_n_add_0 .* carrier_cos;
      sig_Q = r_n_add_0 .* carrier_sin;

      sig_complex = complex(sig_I, sig_Q);

      %----------------------------本地码处理-------------------------------%
      mg_up = upsample(ms.', sps);
      mg_up_fft = fft(mg_up);
      mg_up_fft_conj = conj(mg_up_fft);

      %----------------------------截位+捕获-------------------------------%
      l = length(ms) * sps;
      sig_complex_1 = sig_complex(1:1:l);
      sig_fft_complex_1 = fft(sig_complex_1, l);

      k_num = 40; %截取数据的段数
      sig_complex_cut = zeros(k_num, l);
      sig_complex_cut_fft = zeros(k_num, l);
      Y = zeros(l, l);
      y = zeros(l, l);
      z = zeros(l, l); %积累后的数据

      for k = 1:k_num
      sig_complex_cut(k, :) = sig_complex(1 + (k - 1) * l:1:k * l);
      sig_complex_cut_fft(k, :) = fft(sig_complex_cut(k, :));

      for i = 1:80
      Y(i, :) = circshift(sig_complex_cut_fft(k, :), i - 40) .* mg_up_fft_conj;
      y(i, :) = ifft(Y(i, :));
      end

      z = abs(z) + abs(y);
      end

      figure;
      mesh(z);
      set(gca, 'YLim', [0 80]);
      % set(gca, 'XLim', [0 200]);
      figure;
      plot(abs(z(40, :)));