将浮点数组转换为16位浮点数组缓冲区JavaScript

将浮点数组转换为16位浮点数组缓冲区JavaScript,javascript,audio,floating-point,16-bit,Javascript,Audio,Floating Point,16 Bit,我正在采集浮点阵列中的PCM音频样本。但是我的应用程序只能支持16位长度的数据,所以我需要转换 我不知道该怎么做,因为Float16Array没有类型化数组,而且我从未在位级别处理过数据。有人能解释或展示一下如何做到这一点吗?首先,JavaScript是动态类型的,没有类型长度/大小的概念 这是一个运行时的问题,在本机平台上可以在内部使用什么类型大小,但这并不一定限制可能的值,即JavaScript运行时环境中的模拟类型长度(如果愿意) 此外,可能需要16位int才能将其传递到音频设备。会更有意

我正在采集浮点阵列中的PCM音频样本。但是我的应用程序只能支持16位长度的数据,所以我需要转换


我不知道该怎么做,因为Float16Array没有类型化数组,而且我从未在位级别处理过数据。有人能解释或展示一下如何做到这一点吗?

首先,JavaScript是动态类型的,没有类型长度/大小的概念

这是一个运行时的问题,在本机平台上可以在内部使用什么类型大小,但这并不一定限制可能的值,即JavaScript运行时环境中的模拟类型长度(如果愿意)

此外,可能需要16位int才能将其传递到音频设备。会更有意义。

所以,我想把你的问题缩小到:如何在JavaScript中将float转换为int,答案如下:

但是如果你真的想转换你的值的精度:你可以做的是乘以X,然后四舍五入(“转换为int”,见上面的链接),然后再除以X。但这与将一个大小的浮点值转换为另一个大小不同,因为您没有考虑实际内存中浮点值的尾数/指数表示形式。我的解决方案只降低了一些精度(如果你愿意的话,量化)


无论如何,JavaScript不是一个处理类型的内存表示的平台;它已经足够混乱,无法处理float和int之间的差异;)

看,您确定要16位浮点值吗?16位浮点格式当然是可能的,但它非常不寻常。我迭代了float32array,乘以0xFFFF,并将值存储在新的int16array中。最后工作得很有魅力。谢谢