捕获和积累学习及仿真
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, :)));
- 完整代码







