Matlab:帮助实现编码以实现映射功能

SKM*_*SKM -4 matlab encoding matrix

一个例子:考虑单峰逻辑映射:x[n+1] = 4*x[n](1-x[n]).该映射可用于使用该技术生成+ 1/-1符号

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

Sle*_*Eye 6

要映射的连续范围(例如获得的伪随机数生成器的输出,或者可选地,逻辑映射),以一个小的组离散值,就需要在连续范围分割成多个区域,并指定一个输出值每个地区.这些区域的限制将决定要使用的相应阈值.

例如,在二进制的情况下,您从一系列连续的值开始,在[0,1]这两个值中您将分成两个区域:[0,0.5](0.5,1].这些区域中的每一个都开始分配输出符号,即-1+1.如您所知,区域边界设置为[0,1]输入范围的中点会为您提供0.5的阈值.这可以实现为:

if (x > 0.5)
  symbol = +1;
else
  symbol = -1;
end
Run Code Online (Sandbox Code Playgroud)

作为一个更紧凑的实现,该公式2*(x>0.5)-1利用了这样的事实:在Matlab中,真实条件(来自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],(6/8,7/8](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
Run Code Online (Sandbox Code Playgroud)

然后,这给出了以下符号映射实现:

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
Run Code Online (Sandbox Code Playgroud)

作为一个更紧凑的实现,您可以类似地使用该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
Run Code Online (Sandbox Code Playgroud)

现在,如果你想生成实部的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);
Run Code Online (Sandbox Code Playgroud)

解决之前修订的问题提出的一些问题:

需要注意的一点是,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
Run Code Online (Sandbox Code Playgroud)

为了得到最终的64-QAM符号,你会在正交组合两个8-PAM符号(即x64qam = xQ + sqrt(-1)*xI,在xQxI都被上述过程生成).

这就是说,如果目标是使用具有附加的混沌调制64-QAM符号来实现的数字通信系统,你会最终要考虑到输入数据的源来传送,而不是随机地产生两个混沌调制和源极一次性数据.即使为了性能评估,您最终也会随机生成源数据,因此独立于混沌调制生成它仍然是个好主意.

针对这些问题,本文基于增强光谱效率混沌的符号动态收发器设计提出了一种基于您提供的逆映射的不同方法,可以实现为:

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
Run Code Online (Sandbox Code Playgroud)

如你可能会注意到,该函数采用一个符号索引(3个比特,这你会从输入源数据得到)和调制输出(其可能与的收敛范围内的任何值种子的当前状态inverse_mapping),为两种独立的输入流.请注意,您可以inverse_mapping通过使用输入符号索引查找重复应用映射的限制来计算收敛范围的界限s=0,并s=7使用(例如使用种子x=0).这应该趋同于[-14/(1+p), 14/(1+p)].

然后可以用(设置控制参数作为示例)实现上述参考文献中描述的混沌调制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);
Run Code Online (Sandbox Code Playgroud)

应该产生相应的星座图:

64QAM具有混沌调制,p = 0.8

或者p=1(基本上没有调制):

64QAM p = 1.0

  • 好像你已经摆脱了我在这个答案中试图解决的原始问题的许多方面.如果它们仍然有效,我建议您回滚其中的一些编辑. (3认同)