【问题标题】:Convert floating point to fixed point将浮点数转换为定点数
【发布时间】:2016-11-20 09:08:11
【问题描述】:

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

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 芯片。

【问题讨论】:

  • 将每个 y 项乘以 2**15 以转换为 Q15。使用请求的表示,您不能表示值 1。
  • 是的,你是 rite,可能是最高的 +ve 值是 0.999.... dac 输入除了 Q1.15 的 2 的补码值......
  • 正如 omegatre 所述,您不能用请求的定点格式表示值 1。所以我建议将每个 y 乘以 (2**15 - 1) 以避免可能的溢出。

标签: python fixed-point


【解决方案1】:

要将样本从float 转换为Q1.15,请将样本乘以2 ** 15。但是,正如 cmets 中所述,您不能在 Q1.15 中表示 1.0,因为 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 位错误。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

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

    from fxpmath import Fxp
    
    # your example code here
    
    y_fxp = Fxp(y, signed=True, n_word=16, n_frac=15)
    
    # plotting code here
    

    小数的 15 位给你一个非常低的幅度分辨率值,所以我绘制 Q5.4 以夸张的方式显示转换:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 2019-01-06
      • 2014-09-25
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      相关资源
      最近更新 更多