Matlab : How to represent a real number as binary

标签 matlab signal-processing quantization

问题:如何使用连续 map - Link1: Bernoulli Shift Map为二进制序列建模?

概念: Dyadic 映射也称为 Bernoulli Shift 映射,表示为 x(k+1) = 2x(k) mod 1。在 Link2: Symbolic Dynamics , 解释了伯努利图是一个连续的图,并被用作 Shift 图。这将在下面进一步解释。

可以通过划分为适当的区域并为其分配符号来对数字轨迹进行符号化。通过记下与轨道中的点访问的连续分区元素相对应的符号序列来获得符号轨道。人们可以通过研究系统的符号轨道来了解系统的动力学。 This link还说伯努利位移图用于表示符号动力学。

问题:

Bernoulli Shift Map 如何用于生成二进制序列?我这样试过,但这不是 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

其中0.5是阈值,称为伯努利图的临界值。

我需要将实数表示为分数,如 Link2 第 2 页所述。

有人可以展示我如何应用伯努利位移图来生成符号化轨迹(也称为时间序列)吗?

如果我的理解有误,请指正。

如何将实数值时间序列转换为符号化时间序列,即如何使用伯努利图为双星轨道/时间序列建模?

最佳答案

您当然可以在实数空间中计算它,但您可能会遇到精度问题(取决于起点)。如果您对研究轨道感兴趣,您可能更愿意使用有理分数表示法。有更有效的方法可以做到这一点,但以下代码说明了一种计算从该 map 派生的系列的方法。您将在链接 2 的第 2 页看到周期 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

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

另外,为什么这个实现速度很快但很愚蠢? (提示:尝试将 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']);

好吧,这应该是一个答案,而不是一个问题,所以让我们回答我自己的问题......

速度很快,因为它使用 Matlab 的内置(和高度优化的)filter 函数来处理迭代(也就是说,在实践中,迭代是在 C 中而不是在 M 脚本中完成的) .始终值得记住 Matlab 中的 filter,我一直惊讶于如何将它很好地用于看起来不像过滤问题的应用程序。但是,filter 不能进行条件处理,也不支持模运算,那么我们如何摆脱它呢?仅仅是因为这个映射具有输入的整个周期映射到输出的整个周期的属性(因为映射操作是乘以一个整数)。

这很愚蠢,因为它很快就解决了上述精度问题。将 num_steps 设置为 50 并观察它开始得到错误的答案。发生的事情是过滤操作中的数字变得如此之大(10^14 阶)以至于我们真正关心的位(小数部分)不再可以用相同的 double 变量表示。

这最后一点是一种转移,它更多地与计算而不是数学有关 - 如果您对符号序列感兴趣,请坚持第一个实现。

关于Matlab : How to represent a real number as binary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30136991/

相关文章:

opencv - 如何使用 kmeans2 估计用于颜色量化的簇数

matlab - 在编辑器中自定义数据提示

python - 如何将图像放大到特定点 + 缩放后跟踪特定点

algorithm - 过滤和平滑算法

python - 使用 Python 从 MP3 音乐中提取节拍

c - JPEG源代码及量化模式改变-C语言

matlab - 使用隐马尔可夫模型的手势识别

python - Python数据导入错误

.net - 有没有办法在 F# 中使用 Matlab 图像处理工具箱?

algorithm - 如何同步信号接收器时钟?