在Python中将浮点转换为固定点

时间:2016-11-20 09:08:11

标签: python fixed-point

我想将浮点sin值转换为定点值。

import matplotlib.pyplot as plt

import numpy as np


Fs = 8000

f = 5

sample = 8000

x = np.arange(sample)

y = np.sin(2 * np.pi * f * x / Fs)

如何轻松地将此y浮点样本转换为定点样本?

每个元素应该是16位和1位整数部分,15位应该是小数部分,这样我就可以将这些样本传递给DAC芯片。

2 个答案:

答案 0 :(得分:0)

要将样本从float转换为Q1.15,请将样本乘以2 ** 15。但是,正如评论中所述,您无法在1.0中表示Q1.15,因为LSB代表了该符号。因此,您应该将值限制在[-1, MAX_Q1_15] MAX_Q1_15 = 1.0 - (2 ** -15)的范围内。这可以通过一些有用的numpy函数来完成。

y_clamped = np.clip(y, -1.0, float.fromhex("0x0.fffe"))
y_fixed = np.multiply(y_clamped, 32768).astype(np.int16)

虽然您可能担心此表示不能准确地表示1.0的值,但它足够接近于使用计算。例如,如果您要平方1.0

fmul_16x16 = lambda x, y: x * y >> 15
fmul_16x16(32767, 32767) # Result --> 32766

非常接近,有1位错误。

希望它有所帮助。

答案 1 :(得分:0)

您可以使用fxpmath将浮点值转换为小数定点。它支持Numpy数组作为输入,因此:

Column(
  crossAxisAlignment: CrossAxisAlignment.start,
  children: <Widget>[
    BuildHeaderPage(bgroundHeaderColor: bgroundHeaderColor),
    Expanded(child: ListView(...)) // right
  ],
)

eQ16.15

15位的小数位数会为您提供非常低的安培分辨率值,因此我以Q5.4作图以夸张的方式显示转换:

enter image description here