C是否具有量化功能?

时间:2009-12-27 19:11:11

标签: c quantization

我有一个带有许多正16位值的缓冲区(存储为双精度数),我想将其量化为8位(0-255个值)。

根据Wikipedia,过程将是:

  • 规范化16位值。即找到最大的并与此分开。
  • 使用Q(x)公式,M = 8。

所以我想知道,如果C有一个可以进行量化的函数,或者有人知道我可以使用的C实现吗?

很多爱, 路易丝

3 个答案:

答案 0 :(得分:3)

假设值d位于[0.0, max]区间:

unsigned char quantize(double d, double max)
{
    return (unsigned char)((d / max) * 255.0);
}

我不确定你的意思是“16位值;”在使用IEEE-754的任何系统上,双精度值均为64位。但是,如果您有其他数字类型的值,则该过程实际上是相同的。

答案 1 :(得分:3)

这听起来像波形音频处理,输入为16 PCM数据,输出为8位PCM数据,并且您使用双精度作为中间值。

然而,8位PCM波数据不仅仅是量化的,表示是超过128符号的无符号值。 (就像指数以浮点数存储的方式)

首先找到最大值不仅会进行量化,还会进行缩放。所以在伪代码中

double dMax = max_of_all_values(); // 
...
foreach (dValue in array_of_doubles)
{
   signed char bValue = (signed char)((dValue / dMax)*127.0);
}

如果你想要更高的准确度,你可以进行舍入而不是截断,但在音频处理中,通常最好将截断顺序随机化,甚至通过基本上运行过滤算法来形成它,作为从双精度到有符号变量的截断的一部分。 / p>

注意:如果输出是8位PCM数据,那签名字符不正确,但由于问题没有特别要求,我把它留了出来。

编辑:如果要将其用作像素数据,则需要无符号值。当输入无符号时,我看到James已经为无符号值给出了正确的答案(实际上,归一化数据的dB值应该都是负数)

答案 2 :(得分:1)

从您的问题中不清楚编码是什么,因为“正16位值(存储为双精度)”没有任何意义;它们要么是16位,要么是双倍的,它们不能同时存在。

然而,假设这是16位无符号数据归一化为1.0(因此值范围从0.0 <= s <= 1.0),那么您需要做的就是将它们扩展到8位整数值是将每个样本乘以255。

unsigned char s8 = s * 255 ;

如果范围不是0.0&lt; = s &lt; = 1.0,但是0.0&lt; = s&lt; = max 那么:

unsigned char s8 = s / max * 255 ;

无论哪种方式,除了你自己写的一个之外,没有“量化”功能;但是,必要的变换无疑将是一个简单的算术表达式(尽管如果数据可能被压缩也不是那么简单 - 例如,μ-lay或A-law编码)。

相关问题