m序列
m序列的产生
- m序列是最大长度线性移位寄存器序列的简称,是由多级移位寄存器或其他延迟元件通过线性反馈产生的最长的码序列。若r为级数,所能产生的最大长度的码序列为 n = 2 r − 1 n=2^r-1 n=2r−1位。
- m序列的生成是由反馈电路以及初始状态决定,且由反馈逻辑电路决定的特征多项式必须是r级的本原多项式,初始状态不能全是0,此时初始状态将决定m序列的初始相位,本原多项式决定m序列的形状。
- 若r级线性移位寄存器的初始状态为:
a
−
r
,
a
−
r
+
1
,
⋯
,
a
−
1
,
a
−
r
,
a
−
r
+
1
,
⋯
,
a
−
1
a_{−r},a_{−r+1},⋯,a_{−1},a_{−r},a_{−r+1},⋯,a_{−1}
a−r,a−r+1,⋯,a−1,a−r,a−r+1,⋯,a−1,且满足线性反馈逻辑如下:
a n = ∑ i = 1 r c i a n − i = c 1 a n − 1 ⊕ c 2 a n − 2 ⊕ . . . ⊕ c r a n − r {{{a}}_n} = \sum \limits_{i = 1}^r {c_i}{a_{n - i}} = {c_1}{a_{n - 1}} \oplus {c_2}{a_{n - 2}} \oplus ... \oplus {c_r}{a_{n - r}} an=i=1∑rcian−i=c1an−1⊕c2an−2⊕...⊕cran−r
进一步有: a n = m o d ( ∣ ∣ F ( 1 : r ) . ∗ A ∣ ∣ 2 , 2 ) {a_n} = \bmod (||F(1:r).*A|{|_2},2) an=mod(∣∣F(1:r).∗A∣∣2,2),此可得特定本原多项式以及非全零初始状态下,移位寄存器生成的m序列。
m序列的相关特性
m序列的自相关函数是双值函数,归一化自相关函数满足:
r
(
τ
)
=
1
,
τ
=
0
,
r(\tau ) = {1,\tau = 0} ,
r(τ)=1,τ=0,
r
(
τ
)
=
−
1
,
τ
≠
0
.
r(\tau ) = { -1,\tau \ne 0} .
r(τ)=−1,τ=0.
m序列虽然有良好的自相关性以及互相关性,但m序列可供选择的地址码数量少,为解决这一问题,需要引入组合码,而Gold序列就是组合码中重要的一类。
部分m序列反馈系数表
参考资料
Gold序列
m序列优选对
两个m序列,例如a和b是同级但不同的本原多项式所产生的m序列对,则构成优选对的条件是,其互相关函数值满足下式:
∣
R
a
b
(
τ
)
∣
≤
2
r
+
1
2
+
1
,
m
o
d
(
r
,
2
)
=
=
1
|{R_{ab}}(\tau )| \le {{2^{{{r + 1} \over 2}}} + 1,\bmod (r,2) = = 1}
∣Rab(τ)∣≤22r+1+1,mod(r,2)==1
∣
R
a
b
(
τ
)
∣
≤
2
r
+
2
2
+
1
,
m
o
d
(
r
,
2
)
=
=
0
|{R_{ab}}(\tau )| \le{{2^{{{r + 2} \over 2}}} + 1,\bmod (r,2) = = 0}
∣Rab(τ)∣≤22r+2+1,mod(r,2)==0
下面是几种不同级数的m序列优选对允许的最大相关函数值
部分m序列优选对
- m序列优选对是指在m序列集中,其互相关函数绝对值的最大值(峰值互相关函数)最接近或达到互相关值下限(最小值)的一对m序列。
以8进制反馈系数来表示:
L=5: (75,45)
L=6: (147,103)
L=7: (217,211), (213,203), (277,217)
L=9: (1131,1021), (1423,1131)
L=10: (3323,3771), (2327,2443), (3323,2773)
L=11: (4445,4005)
Gold序列的产生
Gold码序列是由m序列优选对模2相加构成的,并且每改变一个m序列的相对位移,就可以得到一个新的Gold序列。这样每组m序列优选对可以产生 2 r + 1 2^r+1 2r+1个Gold序列。
Gold序列的相关特性
Gold码组的互相关函数值不会超过原两m序列间的最大互相关函数值,若c,d为m序列优选对a,b构成的Gold序列,则:
∣
R
c
d
m
a
x
(
τ
)
∣
<
∣
R
a
b
m
a
x
(
τ
)
∣
|{R_{cdmax}}(\tau )| < |{R_{abmax}}(\tau )|
∣Rcdmax(τ)∣<∣Rabmax(τ)∣
m序列和Gold序列性能比较
参考资料
Gold序列-CSDN博客
gold码所用的优选m序列是如何产生的? - CoolComm.ai的回答 - 知乎
https://www.zhihu.com/question/21957911/answer/3165472926
Kasami序列
Kasami序列是1966年在评估线性循环码的权重过程中发现的,分为大集合序列和小集合序列,都是在m序列的基础上产生的。由于Ksami小集合序列的相关性性能优于大集合序列,因此实际应用中多使用Kasami小集合序列。
Kasami小集合生成方式
- 对于周期 N = 2 n − 1 N=2^n-1 N=2n−1的m序列(N为偶数),可以将其周期分成两个相邻奇数的乘积,即 N = 2 n − 1 = ( 2 n / 2 + 1 ) ( 2 n / 2 − 1 ) N=2^n-1=(2^{n/2}+1)(2^{n/2}-1) N=2n−1=(2n/2+1)(2n/2−1)
- 对周期为 N N N的m序列每隔 2 n / 2 + 1 2^{n/2}+1 2n/2+1抽样,产生长度为 2 n / 2 − 1 2^{n/2}-1 2n/2−1的序列,将新产生的序列重复 2 n / 2 + 1 2^{n/2}+1 2n/2+1次,得到与m序列长度相等的新序列
- 将新序列与m序列逐位模2加(循环移位模2加)就可以得到Kasami小集合序列
参考资料
[1]马旭辉,荆文芳.一种新扩频码的性能分析[J].时间频率学报,2019,42(04):345-356.DOI:10.13875/j.issn.1674-0637.2019-04-0345-012.
Gold序列仿真代码
以7阶m序列优选对(217,211)为例,生成m序列、Gold序列、以及测试Gold序列相关性的仿真代码如下所示
- 主程序
% test_gold.m 用于测试gold序列生成
% 24-05-09 by Peng
clear; clc; close all;
%% 生成m序列
pn_m(1,:) = m_generate(217);
pn_m(2,:) = m_generate(211);
%% 生成gold序列
% 码长为2^7-1=127的两个m序列优选对(217,211),共可以生成2^7+1=129个gold序列(包括两个m序列)
pn_gold(1,:) = pn_m(1,:);
pn_gold(2,:) = pn_m(2,:);
gold_num = 2^log2(length(pn_m(1,:))+1)+1;
for gold_i = 1: 2^log2(length(pn_m(1,:))+1)-1
pn_m_shift = circshift(pn_m(1,:),gold_i-1); % 对m序列进行循环移位
pn_gold(gold_i+2,:) = gold_generate(pn_m_shift,pn_m(2,:)); % m序列模2相加得到gold序列
end
% 测试gold序列的自相关性
for i = 1:gold_num
gold_xcorr_self(i,:) = xcorr(2*pn_gold(i,:)-1,2*pn_gold(i,:)-1);
outstring = ['自相关性测试中...', num2str(i),'/',num2str(gold_num)];
disp(outstring)
end
figure
mesh(gold_xcorr_self)
xlim([1,length(gold_xcorr_self(1,:))]); ylim([1,gold_num])
colorbar
xlabel('Points'); ylabel('Gold\_i'); zlabel('xcorr(Gold\_i,Gold\_i)')
% 测试gold序列的互相关性
outstring = [];
for i = 1:gold_num
for j = 1:gold_num
gold_xcorr_max(i,j) = max(xcorr(2*pn_gold(i,:)-1,2*pn_gold(j,:)-1));
gold_xcorr_mean(i,j) = mean(xcorr(2*pn_gold(i,:)-1,2*pn_gold(j,:)-1));
end
outstring = ['互相关性测试中...', num2str(i),'/',num2str(gold_num)];
disp(outstring)
end
figure
mesh(gold_xcorr_max)
xlim([1,gold_num]); ylim([1,gold_num])
colorbar
xlabel('Gold\_i'); ylabel('Gold\_j'); zlabel('max(xcorr(Gold\_i,Gold\_j))')
figure
mesh(gold_xcorr_mean)
xlim([1,gold_num]); ylim([1,gold_num])
colorbar
xlabel('Gold\_i'); ylabel('Gold\_j'); zlabel('mean(xcorr(Gold\_i,Gold\_j))')
- m序列生成函数
function [pn] = m_generate(prim_poly)
% m_generate.m m序列生成函数
% 24-05-09 by Peng
% 输入f为m序列反馈系数(8进制)
f_tmp = de2bi(oct2dec(prim_poly));
f = f_tmp(end-1:-1:1); % 反馈电路(二进制反馈系数)
n = length(f); % 移位寄存器长度
N = 2^n-1; % 伪随机码周期
register = [zeros(1,n-1) 1]; % 初始相位,[0 0 ... 1]
for i = 1:N
newregister(1) = mod(sum(f.*register),2);
for j = 2:n
newregister(j) = register(j-1);
end
register = newregister;
pn(i) = register(n);
end
- Gold序列生成函数
function [gold] = gold_generate(ma,mb)
% gold_generate.m gold序列生成函数
% 24-05-09 by Peng
% 输入ma,mb为同级m序列优选对生成的m序列;输出gold为两m序列模2加得到的gold序列
n = 0;
k = 0;
for i = 1:length(ma)
gold(i) = ma(i)+mb(i);
gold(i) = mod(gold(i),2);
if gold(i) == 1
n=n+1;
else
k=k+1;
end
end
图1 7阶Gold序列自相关
图2 7阶Gold序列互相关极大值
图3 7阶Gold序列互相关均值
Kasami序列仿真代码
以8阶m序列(435)为例,生成m序列、Kasami小集合序列、以及测试Kasami序列相关性的仿真代码如下所示
- 主程序
% test_kasami.m 用于测试kasami序列生成
% 24-05-09 by Peng
clear; clc; close all;
%% 生成m序列
pn_m = m_generate(435);
%% 生成kasami序列
[pn_kasami] = kasami_generate(pn_m);
kasami_num = size(pn_kasami,1);
% 测试kasami序列的自相关性
for i = 1:kasami_num
kasami_xcorr_self(i,:) = xcorr(2*pn_kasami(i,:)-1,2*pn_kasami(i,:)-1);
outstring = ['自相关性测试中...', num2str(i),'/',num2str(kasami_num)];
disp(outstring)
end
figure
mesh(kasami_xcorr_self)
xlim([1,length(kasami_xcorr_self(1,:))]); ylim([1,kasami_num])
colorbar
xlabel('Points'); ylabel('Kasami\_i'); zlabel('xcorr(Kasami\_i,Kasami\_i)')
% 测试gold序列的互相关性
outstring = [];
for i = 1:kasami_num
for j = 1:kasami_num
kasami_xcorr_max(i,j) = max(xcorr(2*pn_kasami(i,:)-1,2*pn_kasami(j,:)-1));
kasami_xcorr_mean(i,j) = mean(xcorr(2*pn_kasami(i,:)-1,2*pn_kasami(j,:)-1));
end
outstring = ['互相关性测试中...', num2str(i),'/',num2str(kasami_num)];
disp(outstring)
end
figure
mesh(kasami_xcorr_max)
xlim([1,kasami_num]); ylim([1,kasami_num])
colorbar
xlabel('Kasami\_i'); ylabel('Kasami\_j'); zlabel('max(xcorr(Kasami\_i,Kasami\_j))')
figure
mesh(kasami_xcorr_mean)
xlim([1,kasami_num]); ylim([1,kasami_num])
colorbar
xlabel('Kasami\_i'); ylabel('Kasami\_j'); zlabel('mean(xcorr(Kasami\_i,Kasami\_j))')
- m序列生成函数
function [pn] = m_generate(prim_poly)
% m_generate.m m序列生成函数
% 24-05-09 by Peng
% 输入f为m序列反馈系数(8进制)
f_tmp = de2bi(oct2dec(prim_poly));
f = f_tmp(end-1:-1:1); % 反馈电路(二进制反馈系数)
n = length(f); % 移位寄存器长度
N = 2^n-1; % 伪随机码周期
register = [zeros(1,n-1) 1]; % 初始相位,[0 0 ... 1]
for i = 1:N
newregister(1) = mod(sum(f.*register),2);
for j = 2:n
newregister(j) = register(j-1);
end
register = newregister;
pn(i) = register(n);
end
- Kasami序列生成函数
function [kasami] = kasami_generate(ma)
% kasami_generate.m gold序列生成函数
% 24-05-09 by Peng
% 输入ma为阶数n为偶数的任一m序列,输出kasami为由该m序列生成的kasami小集序列
n = log2(length(ma)+1); % m序列阶数
N = 2^n-1; % m序列、kasami序列长度
mm = 2^(n/2)+1; % kasami序列抽样间隔
Nv = 2^(n/2)-1; % kasami序列抽样长度 N=mm*Nv
total = 2^(n/2); % kasami小集序列个数
% (1)对周期为N的m序列每隔2^(n/2)+1抽样,产生长度为2^(n/2)-1的序列
% (2)将新产生的序列重复2^(n/2)+1次,得到与m序列长度相等的新序列
u1 = ma;
for i1 = 1:N
temp1 = mod((i1-1)*mm,N)+1;
v1(i1) = u1(temp1);
end
% (3)将新序列循环移位并与选择的m序列模2加得到kasami小集序列
ka1(1,:) = u1; % 第1条kasami序列为m序列
for ii1 = 1:Nv % 第2~Nv+1条kasami序列
ka1(ii1+1,:) = xor(u1,circshift(v1,[0 ii1-1]));
end
kasami = ka1;
end
图4 8阶Kasami序列自相关
图5 8阶Kasami序列互相关极大值
图6 8阶Kasami序列互相关均值