SKM*_*SKM 6 matlab signal-processing quantization
问题:如何使用连续图 - Link1:伯努利移位图来模拟二进制序列?
概念:
Dyadic地图也称为伯努利移位地图,表示为x(k+1) = 2x(k) mod 1.在Link2:Symbolic Dynamics中,解释了伯努利图是一个连续的地图,并用作移位图.这将在下面进一步解释.
可以通过划分到适当的区域并用符号分配数字轨迹来表示数字轨迹.通过写下与其轨道上的点所访问的连续分区元素相对应的符号序列来获得符号轨道.人们可以通过研究它的符号轨道来了解系统的动力学.该链接还表示伯努利位移图用于表示符号动力学.
题 :
伯努利移位图如何用于生成二进制序列?我尝试过这样,但这不是Link2中的文档所解释的.所以,我采用了Map的数字输出,并通过以下方式通过阈值转换为符号:
x = rand();
y = mod(2* x,1) % generate the next value after one iteration
y =
0.3295
if y >= 0.5 then s = 1
else s = 0
Run Code Online (Sandbox Code Playgroud)
其中0.5是阈值,称为伯努利图的临界值.
我需要将实数表示为分数,如Link2第2页所述.
有人可以展示我如何应用伯努利移位图来生成符号轨迹(也称为时间序列)?
如果我的理解是错误的,请纠正我.
如何将实值数值时间序列转换为符号化,即如何使用伯努利映射模拟二进制轨道/时间序列?
你当然可以在实数空间中计算它,但是你有可能遇到精度问题(取决于起点).如果您对研究轨道感兴趣,您可能更愿意使用合理的分数表示法.有更有效的方法可以做到这一点,但下面的代码说明了一种计算从该映射派生的系列的方法.您将在链接2的第2页上看到period-n定义.您应该能够从这段代码中看到如何在实数空间中轻松地工作作为替代(在这种情况下,matlab函数rat将恢复理性从你的真实数字逼近).
[编辑]现在二进制序列明确!
% start at some point on period-n orbit
period = 6;
num = 3;
den = 2^period-1;
% compute for this many steps of the sequence
num_steps = 20;
% for each step
for n = 1:num_steps
% * 2
num = num * 2;
% mod 1
if num >= den
num = num - den;
end
% simplify rational fraction
g = gcd(num, den);
if g > 1
num = num / g;
den = den / g;
end
% recover 8-bit binary representation
bits = 8;
q = 2^bits;
x = num / den * q;
b = dec2bin(x, bits);
% display
fprintf('%4i / %4i == 0.%s\n', num, den, b);
end
Run Code Online (Sandbox Code Playgroud)
Ach ......为了完整性,这里是实值版本.纯数学家现在应该把目光移开.
% start at some point on period-n orbit
period = 6;
num = 3;
den = 2^period-1;
% use floating point approximation
x = num / den;
% compute for this many steps of the sequence
num_steps = 20;
% for each step
for n = 1:num_steps
% apply map
x = mod(x*2, 1);
% display
[num, den] = rat(x);
fprintf('%i / %i\n', num, den);
end
Run Code Online (Sandbox Code Playgroud)
并且,为了额外的信用,为什么这个实现快速但愚蠢?(提示:尝试将num_steps设置为50)...
% matlab vectorised version
period = 6;
num = 3;
den = 2^period-1;
x = zeros(1, num_steps);
x(1) = num / den;
y = filter(1, [1 -2], x);
[a, b] = rat(mod(y, 1));
disp([a' b']);
Run Code Online (Sandbox Code Playgroud)
好吧,这应该是一个答案,而不是一个问题,所以让我们回答我自己的问题......
它很快,因为它使用Matlab的内置(和高度优化)filter函数来处理迭代(也就是说,在实践中,迭代是在C而不是在M脚本中完成的).filter在Matlab中总是值得记住,我总是惊讶于它如何能够很好地用于那些看起来不像过滤问题的应用程序.filter然而,不能进行条件处理,并且不支持模运算,那么我们如何逃脱呢?仅仅因为此映射具有输入的整个句点映射到输出的整个句点的属性(因为映射操作乘以整数).
这很糟糕,因为它很快就会遇到上述精确问题.设置num_steps为50并观察它开始得到错误的答案.发生的事情是滤波器操作中的数字变得如此之大(阶数为10 ^ 14),我们实际关心的位(小数部分)在同一个双精度变量中不再可表示.
这最后一点是一种转移,它与计算有关而不是数学 - 如果你的兴趣在于符号序列,那么坚持第一种实现.
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |