要将连续范围(例如作为伪随机数生成器的输出或逻辑图)映射到一小组离散值,您需要将连续范围拆分为多个区域,并分配每个区域的输出值。这些区域的限制将决定要使用的相应阈值。
例如,在二进制情况下,您从[0,1] 中的连续值范围开始,您将其分成两个区域:[0,0.5] 和(0.5,1]。这些区域中的每一个都开始分配一个输出符号,即-1 和+1。正如您所指出的,将区域边界设置为[0,1] 输入范围的中点会为您提供 0.5 的阈值。这可以实现为:
if (x > 0.5)
symbol = +1;
else
symbol = -1;
end
作为更紧凑的实现,公式2*(x>0.5)-1 利用了这样一个事实,即在 Matlab 中 true 条件(来自 x>0.5 表达式)的值为 1,而 false 的值为 0。
对于 3 个离散输出值,您同样可以将 [0,1] 输入范围分成 3 个区域:[0,1/3]、(1/3,2/3] 和 (2/3,1]。因此相应的阈值是 1/3 和 2/3。
最后,对于 8 个离散输出值,您可以类似地将 [0,1] 输入范围分成 8 个区域:[0,1/8]、(1/8,2/8]、(2/8,3/8]、(3/8,4/8]、(4/8,5/8]、(5/8,6/8]、@987654347 @ 和 (7/8,1]。因此对应的阈值为 1/8、2/8、3/8、4/8、5/8、6/8 和 7/8,如下图所示:
thresholding function input: |-----|-----|-----|-----|-----|-----|-----|-----|
0 | | | | | | | 1
thresholds: 1/8 2/8 3/8 4/8 5/8 6/8 7/8
| | | | | | | |
v v v v v v v v
generated symbol: -7 -5 -3 -1 +1 +3 +5 +7
然后给出以下符号映射实现:
if (x < 1/8)
symbol = -7;
elseif (x < 2/8)
symbol = -5;
elseif (x < 3/8)
symbol = -3;
elseif (x < 4/8)
symbol = -1;
elseif (x < 5/8)
symbol = +1;
elseif (x < 6/8)
symbol = +3;
elseif (x < 7/8)
symbol = +5;
else
symbol = +7;
end
作为更紧凑的实现,您可以类似地使用floor 函数来获取离散级别:
% x : some value in the [0,1] range
% s : a symbol in the {-7,-5,-3,-1,+1,+3,+5,+7} set
function s = threshold(x)
% Note on implementation:
% 8*x turns the input range from [0,1] to [0,8]
% floor(8*x) then turns that into values {0,1,2,3,4,5,6,7}
% then a linear transform (2*() - 7) is applied to map
% 0 -> -7, 1 -> -5, 2 -> -3, ..., 7 -> 7
% min/max finally applied just as a safety to make sure we don't overflow due
% to roundoff errors (if any).
s = min(7, max(-7, 2*floor(8*x) - 7));
end
现在,如果您想生成实部为 8 级,虚部为 8 级的复杂符号,您只需将它们组合起来,就像在二进制情况下一样。主要是你会生成一个给你实部的第一个值,然后是虚部的第二个值:
x_real = rand(); % random input 0 <= x_real <= 1
x_imag = rand(); % another one
s = threshold(x_real) + sqrt(-1)*threshold(x_imag);
解决先前版本的问题提出的一些观点:
需要注意的是x[n+1] = 4*x[n](1-x[n]) 将[0,1] 中的值映射到相同的值范围。这使得可以迭代地应用映射以获得附加值,并相应地使用阈值应用生成二进制序列 (x > 0.5)。另一方面,您提供的函数f(x)(在问题的早期编辑中)将具有不连续性的范围内的值(大致覆盖[-7.5,7.5],取决于p)映射到[0,1]。换句话说,您需要修改f(x) 或以其他方式将其输出映射回f(x) 的输入域。考虑将[-8,+8] 范围内的通用统一伪随机数生成器作为阈值函数的输入可能更容易:
% x : some value in the [-8,8] range
% s : a symbol in the {-7,-5,-3,-1,+1,+3,+5,+7} set
function s = threshold_8PAM(x)
s = min(7, max(-7, 2*round(x/2 + 0.5) - 1));
end
要获得最终的 64-QAM 符号,您可以将两个 8-PAM 符号正交组合(即x64qam = xQ + sqrt(-1)*xI,其中xQ 和xI 均已通过上述过程生成)。
也就是说,如果目标是使用 64-QAM 符号和附加混沌调制来实现数字通信系统,那么您最终需要考虑要传输的输入数据源,而不是随机生成混沌调制和源数据在一个镜头。也就是说,即使对于性能评估,您最终会随机生成源数据,但独立于混沌调制生成它仍然是一个好主意。
针对这些问题,An Enhanced Spectral Efficiency Chaos-Based Symbolic Dynamics Transceiver Design 论文提出了一种基于您提供的逆映射的不同方法,可以实现为:
function x = inverse_mapping(x,SymbIndex,p)
if (SymbIndex==0)
x = ((1-p)*x-14)/2;
elseif (SymbIndex==1)
x = ((1-p)*x-10)/2;
elseif (SymbIndex==2)
x = ((1-p)*x-6)/2;
elseif (SymbIndex==3)
x = ((1-p)*x-2)/2;
elseif (SymbIndex==4)
x = ((1-p)*x+2)/2;
elseif (SymbIndex==5)
x = ((1-p)*x+6)/2;
elseif (SymbIndex==6)
x = ((1-p)*x+10)/2;
elseif (SymbIndex==7)
x = ((1-p)*x+14)/2;
end
end
您可能会注意到,该函数采用符号索引(3 位,您可以从输入源数据中获取)和调制输出的当前状态(您可以使用收敛范围内的任何值作为种子) inverse_mapping) 作为两个独立的输入流。请注意,您可以通过使用输入符号索引s=0 和s=7(例如使用x=0 的种子)查找重复应用映射的限制来计算inverse_mapping 的收敛范围的界限。这应该收敛到[-14/(1+p), 14/(1+p)]。
the above referenced paper中描述的混沌调制可以通过(以设置控制参数p=0.8为例):
% Simulation parameters
Nsymb = 10000;
p = 0.8;
M = 64;
% Source data generation
SymbolIndexQ = randi([0 sqrt(M)-1],Nsymb,1);
SymbolIndexI = randi([0 sqrt(M)-1],Nsymb,1);
% Modulation
xmax = 14/(1+p); % found by iterative application of inverse_mapping
xQ = xmax*(2*rand(1)-1); % seed initial state
xI = xmax*(2*rand(1)-1); % seed initial state
x = zeros(Nsymb,1);
for i=1:Nsymb
xQ = inverse_mapping(xQ, SymbolIndexQ(i), p);
xI = inverse_mapping(xI, SymbolIndexI(i), p);
x(i) = xQ + sqrt(-1)*xI;
end
% x holds the modulated symbols
plot(real(x), imag(x), '.');
% if you also need the unmodulated symbols you can get them from
% SymbolIndexQ and SymbolIndexI
s = (2*SymbolIndexQ-7) + sqrt(-1)*(2*SymbolIndexI-7);
with应该产生对应的星座图:
或p=1(基本上是未调制的):