【问题标题】:Matlab : Help in implementing an encoding for realizing a mapping functionMatlab : 帮助实现一个映射函数的编码
【发布时间】:2015-11-12 05:18:07
【问题描述】:

一个例子:考虑单峰logistic mapx[n+1] = 4*x[n](1-x[n])。该地图可用于使用该技术生成 +1/-1 符号

我想使用地图f(x) 将上述概念扩展为 3 个级别,每个级别对应一个符号,但我不确定如何做到这一点。

【问题讨论】:

  • 对我来说不是很清楚你想做什么。
  • 尚不清楚sj 是什么。由于没有足够的上下文,术语级别也不清楚。
  • 您可能希望将您的问题回滚到较早的编辑。目前还不清楚你在问什么,例如f(x) 是什么?你没有在任何地方定义它
  • 我已将其回滚到较早的编辑 - 这是 OP 提出的第五个此类问题,几个月后进行了似乎不合理的大型编辑。

标签: matlab matrix encoding


【解决方案1】:

要将连续范围(例如作为伪随机数生成器的输出或逻辑图)映射到一小组离散值,您需要将连续范围拆分为多个区域,并分配每个区域的输出值。这些区域的限制将决定要使用的相应阈值。

例如,在二进制情况下,您从[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 &gt; 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,其中xQxI 均已通过上述过程生成)。

也就是说,如果目标是使用 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=0s=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(基本上是未调制的):

【讨论】:

  • 似乎您摆脱了我试图在此答案中解决的原始问题的许多方面。如果它们仍然有效,我建议您回滚其中的一些编辑。
  • 是的,您可以使用 Tent 或逻辑图作为(不是很好)伪随机数生成器,提供 [0,1] 范围内的值,供后续用作所提供阈值函数的输入。跨度>
  • 您可以将其视为两个独立的块。第一个将生成xs(每次迭代一个x 值,每次迭代使用例如逻辑映射来基于前一个生成x 的下一个值)。然后第二个块将采用每个xs 并应用分段线性变换(我在我的帖子中称之为threshold)以获得最终输出(这个最终输出不会反馈到第一个块)。
猜你喜欢
  • 2019-02-12
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多