加载中...

码环学习及仿真

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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
% bpsk-dsss 相关仿真-----------码环纠正
clc; clear; close all;
warning off;
%-----------------------参数设置--------------------------%

fs = 16000; % 采样率
fc = 4000; % 载波频率
alfs = 0.35; % 滚降系数
data_len = 10; %数据长度
symbol_rate = 4000; %符号速率
%-----------------------发送端--------------------------%

%--------------------发送序列+映射-----------------------%

data = randi([0 1], 1, data_len); %生成0/1序列
data_bio = (data - 1/2) * 2; %映射,0变-1

%----------------------生成m序列------------------------%

n = 7; %阶次
p = 2^n - 1; %循环周期
ms = idinput(p, 'prbs'); %ms列向量

m_1 = ms .* data_bio;
Y_send = reshape(m_1, [1, p * data_len]); %扩频完之后的数据

sps = 8; % 8倍上采样
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'); %添加噪声
r_n = s_up;
N = 500; %填0的个数
recv_sig_add_0 = [zeros(1, N), r_n]; %对序列进行延时操作,前面补0

%-----------------------正交下变频--------------------------%

t1 = 0:length(recv_sig_add_0) - 1;
carrier_cos = cos(2 * pi * fc / fs * t1);
carrier_sin = sin(2 * pi * fc / fs * t1);

recv_sig_I = recv_sig_add_0 .* carrier_cos;
recv_sig_Q = recv_sig_add_0 .* carrier_sin;

% recv_sig_complex = complex(recv_sig_I, recv_sig_Q);

%-----------------------匹配滤波--------------------------%

% mg_up_flip = upsample(fliplr(ms'), sps); %反转序列后上采样
% fir_m = conv(mg_up_flip, fir_rcos); %本地广义成形
% mg_up_xcorr = conv(mg_up_flip, fir_rcos, 'same'); %对m序列进行相关

r_bx_I = conv(recv_sig_I, fir_rcos, 'same'); %接收匹配滤波器
r_bx_Q = conv(recv_sig_Q, fir_rcos, 'same'); %接收匹配滤波器

r_complex = complex(r_bx_I, r_bx_Q);
%-----------------------E P L码--------------------------%
% mg_up = upsample(ms.', sps);
% l = length(mg_up);
% % l = length(mg_up_xcorr);
% mg_up_e = circshift(mg_up, -l / 2 - 1); %左移,超前
% mg_up_p = mg_up;
% mg_up_l = circshift(mg_up, l / 2 + 1); %右移,滞后


%第二种途径
mg_e = circshift(ms.',-(p+1)/2);
mg_l = circshift(ms.', (p+1)/2);

mg_up_e = upsample(mg_e,sps);
mg_up_l = upsample(mg_l,sps);
mg_up_p = upsample(ms.',sps);
l = length(mg_up_p);
%-----------------------码环--------------------------%
ec = zeros(1, l);

%环路滤波器参数设置
BL = 100; %环路带宽
w_nf = BL * 0.53;
K_d = 1;
K_1 = 1;
T = 1 / symbol_rate;
K_f = 1;
w_mid = zeros(1, l); % 环路滤波器中间变量
w = zeros(1, l);
E = zeros(1, l);
L = zeros(1, l);

delta_P = zeros(1, l);
P = 0;
for k = 1:l - 1

%%相关运算
mg_up_p = fliplr(circshift(mg_up_p, P));
sig_xcorr_I_P = conv(r_bx_I, mg_up_p,"same");
sig_xcorr_Q_P = conv(r_bx_Q, mg_up_p,"same");

mg_up_e = circshift(mg_up_p, -l / 2 - 1);
mg_up_l = circshift(mg_up_p, l / 2 + 1);

sig_xcorr_I_E = conv(r_bx_I, mg_up_e, "same");
sig_xcorr_Q_E = conv(r_bx_Q, mg_up_e, "same");
sig_xcorr_I_L = conv(r_bx_I, mg_up_l, "same");
sig_xcorr_Q_L = conv(r_bx_Q, mg_up_l, "same");


E(k) = sqrt(sig_xcorr_I_E(k)^2 + sig_xcorr_Q_E(k)^2);
L(k) = sqrt(sig_xcorr_I_L(k)^2 + sig_xcorr_Q_L(k)^2);

ec(k) = 0.5*(E(k)^2 - L(k)^2) / (E(k)^2 + L(k)^2); %超前减滞后功率鉴相法
%ec(k) = (E - L) / (E + L);%超前减滞后幅值法
%delta_cp(k) = 1/2 * (E - L) / (E + L); %超前减滞后幅值法
%点积功率鉴相器
%ec(k) = (sig_xcorr_I_E(k) - sig_xcorr_I_L(k)) * sig_xcorr_I_L(k) + (sig_xcorr_Q_E(k) - sig_xcorr_Q_L(k)) * sig_xcorr_Q_L(k);
%ec(k) = ec(k) / (sig_xcorr_I_P(k)^2 + sig_xcorr_Q_P(k)^2);
%环路滤波器
w_mid(k + 1) = w_mid(k) + (w_nf^2 * T) * (ec(k) * K_d * K_1);
w(k + 1) = w(k) + T * w_mid(k + 1) + (sqrt(2) * w_nf * T) * (ec(k) * K_d * K_1);

delta_P(k + 1) = K_f * (w_mid(k + 1) + sqrt(2) * w_nf * T * ec(k)) / (2 * pi);
P = round(delta_P);
end

plot(sig_xcorr_I_P);

y_decision = sig_xcorr_I_P(1008:p*sps:end)>0;
error_bit = biterr(y_decision, data);
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
% bpsk-dsss 相关仿真-----------码环纠正
clc; clear; close all;
warning off;
%-----------------------参数设置--------------------------%

fs = 16000; % 采样率
fc = 4000; % 载波频率
alfs = 0.35; % 滚降系数
data_len = 10; %数据长度
symbol_rate = 4000; %符号速率
%-----------------------发送端--------------------------%

%--------------------发送序列+映射-----------------------%

data = randi([0 1], 1, data_len); %生成0/1序列
data_bio = (data - 1/2) * 2; %映射,0变-1

%----------------------生成m序列------------------------%

n = 7; %阶次
p = 2^n - 1; %循环周期
ms = idinput(p, 'prbs'); %ms列向量

m_1 = ms .* data_bio;
Y_send = reshape(m_1, [1, p * data_len]); %扩频完之后的数据

sps = 8; % 8倍上采样
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'); %添加噪声
r_n = s_up;
N = 500; %填0的个数
recv_sig_add_0 = [zeros(1, N), r_n]; %对序列进行延时操作,前面补0

%-----------------------正交下变频--------------------------%

t1 = 0:length(recv_sig_add_0) - 1;
carrier_cos = cos(2 * pi * fc / fs * t1);
carrier_sin = sin(2 * pi * fc / fs * t1);

recv_sig_I = recv_sig_add_0 .* carrier_cos;
recv_sig_Q = recv_sig_add_0 .* carrier_sin;

% recv_sig_complex = complex(recv_sig_I, recv_sig_Q);

%-----------------------匹配滤波--------------------------%

% mg_up_flip = upsample(fliplr(ms'), sps); %反转序列后上采样
% fir_m = conv(mg_up_flip, fir_rcos); %本地广义成形
% mg_up_xcorr = conv(mg_up_flip, fir_rcos, 'same'); %对m序列进行相关

r_bx_I = conv(recv_sig_I, fir_rcos, 'same'); %接收匹配滤波器
r_bx_Q = conv(recv_sig_Q, fir_rcos, 'same'); %接收匹配滤波器

r_complex = complex(r_bx_I, r_bx_Q);
%-----------------------E P L码--------------------------%
% mg_up = upsample(ms.', sps);
% l = length(mg_up);
% % l = length(mg_up_xcorr);
% mg_up_e = circshift(mg_up, -l / 2 - 1); %左移,超前
% mg_up_p = mg_up;
% mg_up_l = circshift(mg_up, l / 2 + 1); %右移,滞后

%第二种途径
mg_e = circshift(ms.', - (p + 1) / 2);
mg_l = circshift(ms.', (p + 1) / 2);

mg_up_e = upsample(mg_e, sps);
mg_up_l = upsample(mg_l, sps);
mg_up_p = upsample(ms.', sps);
l = length(mg_up_p);
%-----------------------码环--------------------------%
ec = zeros(1, l);

%环路滤波器参数设置
BL = 100; %环路带宽
w_nf = BL * 0.53;
K_d = 1;
K_1 = 1;
T = 1 / symbol_rate;
K_f = 1;
w_mid = zeros(1, l); % 环路滤波器中间变量
w = zeros(1, l);
E = zeros(1, l);
L = zeros(1, l);

delta_P = zeros(1, l);
P = 0;

for k = 1:l - 1

%%相关运算
mg_up_p = fliplr(circshift(mg_up_p, P));
sig_xcorr_I_P = conv(r_bx_I, mg_up_p, "same");
sig_xcorr_Q_P = conv(r_bx_Q, mg_up_p, "same");

mg_up_e = circshift(mg_up_p, -l / 2);
mg_up_l = circshift(mg_up_p, l / 2);

sig_xcorr_I_E = conv(r_bx_I, mg_up_e, "same");
sig_xcorr_Q_E = conv(r_bx_Q, mg_up_e, "same");
sig_xcorr_I_L = conv(r_bx_I, mg_up_l, "same");
sig_xcorr_Q_L = conv(r_bx_Q, mg_up_l, "same");

E(k) = sqrt(sig_xcorr_I_E(k)^2 + sig_xcorr_Q_E(k)^2);
L(k) = sqrt(sig_xcorr_I_L(k)^2 + sig_xcorr_Q_L(k)^2);

%ec(k) = 0.5*(E(k)^2 - L(k)^2) / (E(k)^2 + L(k)^2); %超前减滞后功率鉴相法
ec(k) = 0.5 * (E - L) / (E + L); %超前减滞后幅值法
%delta_cp(k) = 1/2 * (E - L) / (E + L); %超前减滞后幅值法
%点积功率鉴相器
%ec(k) = (sig_xcorr_I_E(k) - sig_xcorr_I_L(k)) * sig_xcorr_I_L(k) + (sig_xcorr_Q_E(k) - sig_xcorr_Q_L(k)) * sig_xcorr_Q_L(k);
%ec(k) = ec(k) / (sig_xcorr_I_P(k)^2 + sig_xcorr_Q_P(k)^2);
%环路滤波器
w_mid(k + 1) = w_mid(k) + (w_nf^2 * T) * (ec(k) * K_d * K_1);
w(k + 1) = w(k) + T * w_mid(k + 1) + (sqrt(2) * w_nf * T) * (ec(k) * K_d * K_1);

delta_P(k + 1) = K_f * (w_mid(k + 1) + sqrt(2) * w_nf * T * ec(k)) / (2 * pi);
P = round(delta_P);
end

plot(sig_xcorr_I_P);

% y_decision = sig_xcorr_I_P(1008:p * sps:end) > 0;
y_decision = sig_xcorr_I_P(p*sps-sps:p * sps:end) > 0;
error_bit = biterr(y_decision, data);

没有上下变频

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
% bpsk-dsss 相关仿真-----------码环纠正
clc; clear; close all;
warning off;
%-----------------------参数设置--------------------------%

fs = 16000; % 采样率
fc = 4000; % 载波频率
alfs = 0.35; % 滚降系数
data_len = 10000; %数据长度
symbol_rate = 4000; %符号速率
%-----------------------发送端--------------------------%

%--------------------发送序列+映射-----------------------%

data = randi([0 1], 1, data_len); %生成0/1序列
data_bio = (data - 1/2) * 2; %映射,0变-1

%----------------------生成m序列------------------------%

n = 7; %阶次
p = 2^n - 1; %循环周期
ms = idinput(p, 'prbs'); %ms列向量

m_1 = ms .* data_bio;
Y_send = reshape(m_1, [1, p * data_len]); %扩频完之后的数据

sps = 8; % 8倍上采样
y_up = upsample(Y_send, sps); % 上采样

%-------------------根升余弦滤波成型---------------------%

fir_rcos = rcosdesign(alfs, 6, sps, 'sqrt');
data_bx = conv(y_up, fir_rcos, "same"); %根升余弦滤波

%-----------------------上变频--------------------------%

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

%---------------------接收端-----------------------------%
%r_n = awgn(s_up, -20, 'measured'); %添加噪声
r_n = data_bx;
N = 3; %填0的个数
recv_sig_add_0 = [zeros(1, N), r_n]; %对序列进行延时操作,前面补0

%-----------------------正交下变频--------------------------%

% t1 = 1:length(recv_sig_add_0);
% carrier_cos = cos(2 * pi * fc / fs * t1);
% carrier_sin = sin(2 * pi * fc / fs * t1);

% recv_sig_I = recv_sig_add_0 .* carrier_cos;
% recv_sig_Q = recv_sig_add_0 .* carrier_sin;

% recv_sig_complex = complex(recv_sig_I, recv_sig_Q);

recv_sig_I = recv_sig_add_0;
recv_sig_Q = recv_sig_add_0 * 0;

%-----------------------匹配滤波--------------------------%

% mg_up_flip = upsample(fliplr(ms'), sps); %反转序列后上采样
% fir_m = conv(mg_up_flip, fir_rcos); %本地广义成形
% mg_up_xcorr = conv(mg_up_flip, fir_rcos, 'same'); %对m序列进行相关

r_bx_I = conv(recv_sig_I, fir_rcos, 'same'); %接收匹配滤波器
r_bx_Q = conv(recv_sig_Q, fir_rcos, 'same'); %接收匹配滤波器

%-----------------------E P L码--------------------------%
%第二种途径
mg_up_p = upsample(ms.', sps);
l = length(mg_up_p);
mg_up_l = zeros(1, l);
mg_up_e = zeros(1, l);

%-----------------------码环--------------------------%
ec = zeros(1, l);

%环路滤波器参数设置
BL = 20; %环路带宽
% w_nf = BL * 0.53;
w_nf = BL * 2;
K_d = 1;
K_1 = 1;
% T = 1 / symbol_rate;
T = 1/1000;
K_f = 1;
w_mid = zeros(1, l); % 环路滤波器中间变量
w = zeros(1, l);
E = zeros(1, l);
L = zeros(1, l);

delta_P = zeros(1, l);
P = 0;
sig_xcorr_I_P = zeros(1, l);
sig_xcorr_Q_P = zeros(1, l);
sig_xcorr_I_E = zeros(1, l);
sig_xcorr_Q_E = zeros(1, l);
sig_xcorr_I_L = zeros(1, l);
sig_xcorr_Q_L = zeros(1, l);

for i = 1:data_len + 1
%%截位
if (i * l < length(r_bx_I))
r_bx_sym_I = r_bx_I((i - 1) * l + 1:1:i * l);
r_bx_sym_Q = r_bx_Q((i - 1) * l + 1:1:i * l);
else
b = zeros(1, i * l - length(r_bx_I));
r_bx_sym_I = [r_bx_I((i - 1) * l + 1:1:end), b];
r_bx_sym_Q = [r_bx_Q((i - 1) * l + 1:1:end), b];
end

mg_up_p = circshift(mg_up_p, -P);
mg_up_e = circshift(mg_up_p, -sps / 2);
mg_up_l = circshift(mg_up_p, sps / 2);

sig_xcorr_I_P(i) = sum(mg_up_p .* r_bx_sym_I);
sig_xcorr_Q_P(i) = sum(mg_up_p .* r_bx_sym_Q);
sig_xcorr_I_E(i) = sum(mg_up_e .* r_bx_sym_I);
sig_xcorr_Q_E(i) = sum(mg_up_e .* r_bx_sym_Q);
sig_xcorr_I_L(i) = sum(mg_up_l .* r_bx_sym_I);
sig_xcorr_Q_L(i) = sum(mg_up_l .* r_bx_sym_Q);

E(i) = sqrt(sig_xcorr_I_E(i)^2 + sig_xcorr_Q_E(i)^2);
L(i) = sqrt(sig_xcorr_I_L(i)^2 + sig_xcorr_Q_L(i)^2);
%ec(i) = 0.5*(E(i)^2 - L(i)^2) / (E(i)^2 + L(i)^2); %超前减滞后功率鉴相法
ec(i) = 0.5 * (E(i) - L(i)) / (E(i) + L(i)); %超前减滞后幅值法
%delta_cp(k) = 1/2 * (E - L) / (E + L); %超前减滞后幅值法
%点积功率鉴相器
%ec(k) = (sig_xcorr_I_E(k) - sig_xcorr_I_L(k)) * sig_xcorr_I_L(k) + (sig_xcorr_Q_E(k) - sig_xcorr_Q_L(k)) * sig_xcorr_Q_L(k);
%ec(k) = ec(k) / (sig_xcorr_I_P(k)^2 + sig_xcorr_Q_P(k)^2);
%环路滤波器
w_mid(i + 1) = w_mid(i) + (w_nf^2 * T) * (ec(i) * K_d * K_1);
w(i + 1) = w(i) + T * w_mid(i + 1) + (sqrt(2) * w_nf * T) * (ec(i) * K_d * K_1);

delta_P(i + 1) = K_f * (w_mid(i + 1) + sqrt(2) * w_nf * T * ec(i)) / (2 * pi);
P = round(delta_P(i + 1));
% PII(i) = round(delta_P(i + 1)*4/pi);
end

% plot(PII);
% y_decision = sig_xcorr_I_P(1008:p * sps:end) > 0;
y_decision = sig_xcorr_I_P(1:1:data_len) > 0;
error_bit = biterr(y_decision, data);

低信噪比进行积累

核心代码:
r_n = awgn(data_bx, -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
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
% bpsk-dsss 相关仿真-----------码环纠正
clc; clear; close all;
warning off;
%-----------------------参数设置--------------------------%

fs = 16000; % 采样率
fc = 4000; % 载波频率
alfs = 0.35; % 滚降系数
data_len = 1e5; %数据长5
symbol_rate = 1000; %符号速率
%-----------------------发送端--------------------------%

%--------------------发送序列+映射-----------------------%

data = randi([0 1], 1, data_len); %生成0/1序列
%data = ones(1,data_len);
data_bio = (data - 1/2) * 2; %映射,0变-1

%----------------------生成m序列------------------------%

n = 7; %阶次
p = 2^n - 1; %循环周期
ms = idinput(p, 'prbs'); %ms列向量

m_1 = ms .* data_bio;
Y_send = reshape(m_1, [1, p * data_len]); %扩频完之后的数据

sps = 8; % 8倍上采样
y_up = upsample(Y_send, sps); % 上采样

%-------------------根升余弦滤波成型---------------------%

fir_rcos = rcosdesign(alfs, 6, sps, 'sqrt');
data_bx = conv(y_up, fir_rcos, "same"); %根升余弦滤波

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

r_n = awgn(data_bx, -20, 'measured'); %添加噪声
%r_n = s_up;
N = 2; %填0的个数
recv_sig_add_0 = [zeros(1, N), r_n]; %对序列进行延时操作,前面补0

recv_sig_I = recv_sig_add_0;
recv_sig_Q = recv_sig_add_0 * 0;

%-----------------------匹配滤波--------------------------%
r_bx_I = conv(recv_sig_I, fir_rcos, 'same'); %接收匹配滤波器
r_bx_Q = conv(recv_sig_Q, fir_rcos, 'same'); %接收匹配滤波器

%-----------------------E P L码--------------------------%

mg_up_p = upsample(ms.', sps);
len = length(mg_up_p);
mg_up_l = zeros(1, length(mg_up_p));
mg_up_e = zeros(1, length(mg_up_p));

%-----------------------码环--------------------------%
ec = zeros(1, data_len);

%环路滤波器参数设置
BL = 200; %环路带宽
w_nf = BL * 0.53;
% w_nf = BL * 2;
K_d = 1;
K_1 = 1;
% T = 1 / symbol_rate;
T = 1/1000;
K_f = 1;
w_mid = zeros(1, len); % 环路滤波器中间变量
w = zeros(1, len);
E = zeros(1, len);
L = zeros(1, len);

delta_P = zeros(1, len);
P = 0;
sig_xcorr_I_P = zeros(1, len);
sig_xcorr_Q_P = zeros(1, len);
sig_xcorr_I_E = zeros(1, len);
sig_xcorr_Q_E = zeros(1, len);
sig_xcorr_I_L = zeros(1, len);
sig_xcorr_Q_L = zeros(1, len);

ec_sum = zeros(1, data_len);

for i = 1:data_len
%%截位
if (i * len < length(r_bx_I))
r_bx_sym_I = r_bx_I((i - 1) * len + 1:1:i * len);
r_bx_sym_Q = r_bx_Q((i - 1) * len + 1:1:i * len);
end

mg_up_p = circshift(mg_up_p, -P);
mg_up_e = circshift(mg_up_p, -sps / 2);
mg_up_l = circshift(mg_up_p, sps / 2);

sig_xcorr_I_P(i) = sum(mg_up_p .* r_bx_sym_I);
sig_xcorr_Q_P(i) = sum(mg_up_p .* r_bx_sym_Q);
sig_xcorr_I_E(i) = sum(mg_up_e .* r_bx_sym_I);
sig_xcorr_Q_E(i) = sum(mg_up_e .* r_bx_sym_Q);
sig_xcorr_I_L(i) = sum(mg_up_l .* r_bx_sym_I);
sig_xcorr_Q_L(i) = sum(mg_up_l .* r_bx_sym_Q);

E(i) = sqrt(sig_xcorr_I_E(i)^2 + sig_xcorr_Q_E(i)^2);
L(i) = sqrt(sig_xcorr_I_L(i)^2 + sig_xcorr_Q_L(i)^2);
% E(i) = sig_xcorr_I_E(i) + sig_xcorr_Q_E(i);
% L(i) = sig_xcorr_I_L(i) + sig_xcorr_Q_L(i);
%ec(i) = 0.5*(E(i)^2 - L(i)^2) / (E(i)^2 + L(i)^2); %超前减滞后功率鉴相法
ec(i) = 0.5 * (E(i) - L(i)) / (E(i) + L(i)); %超前减滞后幅值法

if (i > 1)
ec_sum(i) = ec_sum(i - 1) + ec(i);
else
ec_sum(i) = ec_sum(i) + ec(i);
end

%delta_cp(k) = 1/2 * (E - L) / (E + L); %超前减滞后幅值法
%点积功率鉴相器
%ec(k) = (sig_xcorr_I_E(k) - sig_xcorr_I_L(k)) * sig_xcorr_I_L(k) + (sig_xcorr_Q_E(k) - sig_xcorr_Q_L(k)) * sig_xcorr_Q_L(k);
%ec(k) = ec(k) / (sig_xcorr_I_P(k)^2 + sig_xcorr_Q_P(k)^2);
%环路滤波器
% w_mid(i + 1) = w_mid(i) + (w_nf^2 * T) * (ec(i) * K_d * K_1);
% w(i + 1) = w(i) + T * w_mid(i + 1) + (sqrt(2) * w_nf * T) * (ec(i) * K_d * K_1);
%
% delta_P(i + 1) = K_f * (w_mid(i + 1) + sqrt(2) * w_nf * T * ec(i)) / (2 * pi);
% z(i + 1) = round(delta_P(i + 1));
w(i + 1) = (1 - 0.05) * w(i) + 0.05 * ec(i);
delta_P(i + 1) = w(i + 1);
P = round(delta_P(i + 1) * sps);
end

y_decision = sig_xcorr_I_P(1:1:data_len) > 0;
error_bit = biterr(y_decision, data);

积累

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
% bpsk-dsss 相关仿真-----------码环纠正
clc; clear; close all;
warning off;
%-----------------------参数设置--------------------------%

fs = 16000; % 采样率
fc = 4000; % 载波频率
alfs = 0.35; % 滚降系数
data_len = 10000; %数据长度
symbol_rate = 1000; %符号速率
%-----------------------发送端--------------------------%

%--------------------发送序列+映射-----------------------%

data = randi([0 1], 1, data_len); %生成0/1序列
%data = ones(1,data_len);
data_bio = (data -1/2) * 2; %映射,0变-1

%----------------------生成m序列------------------------%

n = 7; %阶次
p = 2 ^ n - 1; %循环周期
ms = idinput(p, 'prbs'); %ms列向量

m_1 = ms .* data_bio;
Y_send = reshape(m_1, [1, p * data_len]); %扩频完之后的数据

sps = 8; % 8倍上采样
y_up = upsample(Y_send, sps); % 上采样

%-------------------根升余弦滤波成型---------------------%

fir_rcos = rcosdesign(alfs, 6, sps, 'sqrt');
data_bx = conv(y_up, fir_rcos, "same"); %根升余弦滤波

%---------------------接收端-----------------------------%
snr = zeros(1, 10);
errbit = zeros(1, 10);

% errbit_average = zeros(1, 10);

k = 1;

for ebn0 = 1:10
snr(k) = ebn0 + 10 * log10(2) - 10 * log10(sps) -10 * log10(p);
r_n = awgn(data_bx, snr(k), 'measured'); %添加噪声
%r_n = s_up;
N = 1; %填0的个数
recv_sig_add_0 = [zeros(1, N), r_n]; %对序列进行延时操作,前面补0

recv_sig_I = recv_sig_add_0;
recv_sig_Q = recv_sig_add_0 * 0;

%-----------------------匹配滤波--------------------------%
r_bx_I = conv(recv_sig_I, fir_rcos, 'same'); %接收匹配滤波器
r_bx_Q = conv(recv_sig_Q, fir_rcos, 'same'); %接收匹配滤波器

%-----------------------E P L码--------------------------%

mg_up_p = upsample(ms.', sps);
len = length(mg_up_p);
mg_up_l = zeros(1, length(mg_up_p));
mg_up_e = zeros(1, length(mg_up_p));

%-----------------------码环--------------------------%
ec = zeros(1, data_len);

%环路滤波器参数设置
% BL = 300; %环路带宽
% w_nf = BL * 0.53;
BL = 1.3;
w_nf = BL * 2;
% w_nf = BL * 2;
K_d = 1;
K_1 = 1;
% T = 1 / symbol_rate;
T = 1/1000;
K_f = 1;
w_mid = zeros(1, data_len); % 环路滤波器中间变量
w = zeros(1, data_len);
E = zeros(1, data_len);
L = zeros(1, data_len);

delta_P = zeros(1, len);
P = 0;
sig_xcorr_I_P = zeros(1, len);
sig_xcorr_Q_P = zeros(1, len);
sig_xcorr_I_E = zeros(1, len);
sig_xcorr_Q_E = zeros(1, len);
sig_xcorr_I_L = zeros(1, len);
sig_xcorr_Q_L = zeros(1, len);

%-----------------------积累变量
sig_xcorr_I_E_sum = zeros(1, len);
sig_xcorr_Q_E_sum = zeros(1, len);
sig_xcorr_I_L_sum = zeros(1, len);
sig_xcorr_Q_L_sum = zeros(1, len);

E_sum = zeros(1, data_len);
L_sum = zeros(1, data_len);

i_sum = 4; %积累的次数

for i = 1:data_len
%%截位
if (i * len < length(r_bx_I))
r_bx_sym_I = r_bx_I((i - 1) * len + 1:1:i * len);
r_bx_sym_Q = r_bx_Q((i - 1) * len + 1:1:i * len);
end

mg_up_p = circshift(mg_up_p, -P);
mg_up_e = circshift(mg_up_p, -sps / 2);
mg_up_l = circshift(mg_up_p, sps / 2);

sig_xcorr_I_P(i) = sum(mg_up_p .* r_bx_sym_I);
sig_xcorr_Q_P(i) = sum(mg_up_p .* r_bx_sym_Q);
sig_xcorr_I_E(i) = sum(mg_up_e .* r_bx_sym_I);
sig_xcorr_Q_E(i) = sum(mg_up_e .* r_bx_sym_Q);
sig_xcorr_I_L(i) = sum(mg_up_l .* r_bx_sym_I);
sig_xcorr_Q_L(i) = sum(mg_up_l .* r_bx_sym_Q);

if (i == 1 || mod(i, i_sum) == 0)
sig_xcorr_I_E_sum(i) = sig_xcorr_I_E(i);
sig_xcorr_Q_E_sum(i) = sig_xcorr_Q_E(i);
sig_xcorr_I_L_sum(i) = sig_xcorr_I_L(i);
sig_xcorr_Q_L_sum(i) = sig_xcorr_Q_L(i);
else
sig_xcorr_I_E_sum(i) = sig_xcorr_I_E(i) + sig_xcorr_I_E_sum(i - 1);
sig_xcorr_Q_E_sum(i) = sig_xcorr_Q_E(i) + sig_xcorr_Q_E_sum(i - 1);
sig_xcorr_I_L_sum(i) = sig_xcorr_I_L(i) + sig_xcorr_I_L_sum(i - 1);
sig_xcorr_Q_L_sum(i) = sig_xcorr_Q_L(i) + sig_xcorr_Q_L_sum(i - 1);
end

if (i > 1 && mod(i, i_sum) == 0)
E(i) = sqrt(sig_xcorr_I_E(i) ^ 2 + sig_xcorr_Q_E(i) ^ 2);
L(i) = sqrt(sig_xcorr_I_L(i) ^ 2 + sig_xcorr_Q_L(i) ^ 2);

ec(i) = (E(i) - L(i)) / (E(i) + L(i)); %超前减滞后幅值法

% w(i + 1) = (1 - 0.25) * w(i) + 0.25 * ec(i);
% delta_P(i + 1) = w(i + 1);
% P = round(delta_P(i + 1) * sps);
w_mid(i + 1) = w_mid(i) + (w_nf ^ 2 * T) * (ec(i) * K_d * K_1);
w(i + 1) = w(i) + T * w_mid(i + 1) + (sqrt(2) * w_nf * T) * (ec(i) * K_d * K_1);
delta_P(i + 1) = K_f * (w_mid(i + 1) + sqrt(2) * w_nf * T * ec(i)) / (2 * pi);
P = round(delta_P(i + 1));
end

end

y_decision = sig_xcorr_I_P(1:1:data_len) > 0;
errbit(k) = (biterr(y_decision, data)) / data_len;
k = k + 1;
end

ebn0 = 1:10;
ber_theory = 0.5 * erfc(sqrt(power(10, ebn0 / 10))); %理论误码率
figure
semilogy(ebn0, ber_theory, '-or');
grid on; hold on;

semilogy(ebn0, errbit, '-sb');
grid on; hold on;
xlabel('EbN0(dB)'); ylabel('BER')
title('BPSK-DSSS误码率曲线图');
legend('理论误码率曲线', 'bpsk-dsss仿真误码率');