Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C有量子化函数吗?_C_Quantization - Fatal编程技术网

C有量子化函数吗?

C有量子化函数吗?,c,quantization,C,Quantization,我有一个包含许多正16位值(以双精度存储)的缓冲区,我想将其量化为8位(0-255个值) 根据这一进程,将是: 标准化16位值。也就是说,找到最大的,用这个除法 使用M=8的Q(x)公式 所以我想知道,如果C有一个函数可以做这个量化,或者有人知道我可以使用的C实现吗 很多爱, Louise假设值d在区间[0.0,最大值]: unsigned char quantize(double d, double max) { return (unsigned char)((d / max) *

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

根据这一进程,将是:

  • 标准化16位值。也就是说,找到最大的,用这个除法
  • 使用M=8的Q(x)公式
所以我想知道,如果C有一个函数可以做这个量化,或者有人知道我可以使用的C实现吗

很多爱,
Louise

假设值
d
在区间
[0.0,最大值]

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

我不确定你所说的“16位值”是什么意思;在任何使用IEEE-754的系统上,双精度值都是64位的。但是,如果您有另一个数字类型的值,则处理过程实际上是相同的。

这听起来像是波形音频处理,输入是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);
}
如果您想要更高的精度,您可以舍入而不是截断,但是在音频处理中,通常最好将截断顺序随机化,甚至通过基本上运行一个过滤算法来对其进行整形,作为从双精度到有符号字符截断的一部分

注意:如果输出是8位PCM数据,则有符号字符是不正确的,但由于问题没有明确要求,因此我将其忽略


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

您的问题不清楚编码是什么,因为“正16位值(存储为双精度值)”没有实际意义;它们要么是16位的,要么是双位的,不能两者都是


但是,假设这是标准化为1.0的16位无符号数据(因此,在我的计算机上,值的范围是0.0,double实际上是64位。
double
是64位。
float
是32位。@Assaf Lavie:这取决于平台。(在普通计算机上,实际上是64位。)我想她的意思是,输入数据是16位的,但最简单的算法将涉及浮点,因此它们已在准备时转换为双精度。我打赌答案很简单,就像
x>>8
一样,双精度一词是错误地放在那里的。您需要转换为“unsigned char”如果你想变得便携。或者更好,完全放下石膏。哇。这是一个很棒的解决方案!你是如何从维基百科的Q(x)公式发展到这个优雅的函数的?非常令人印象深刻,你可以看到我在做什么=)我把16位的输入转换成了dB,因为我想把它画成一个光谱图。但遗憾的是,GIMP还不支持每个颜色通道16位,所以我必须量化8位。我在灰色工作。GIMP确实有一些GEGL支持,每个颜色通道32位,但插件API还不支持,从我所能告诉你的。
unsigned char s8 = s * 255 ;
unsigned char s8 = s / max * 255 ;