首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在保留IEEE754表示的同时将Float32Array转换为Uint8Array

在保留IEEE754表示的同时将Float32Array转换为Uint8Array
EN

Stack Overflow用户
提问于 2018-03-18 14:05:01
回答 2查看 3.2K关注 0票数 3

我有一个来自decodeAudioData方法的decodeAudioData,我想把它转换成Uint8Array,而保存float32 IEEE754音频数据

到目前为止我试过了,

代码语言:javascript
运行
复制
var length = float32Array.length;

var emptyBuffer = new ArrayBuffer(length * 4);
var view = new DataView(emptyBuffer);

for (var i = 0; i < length; i++) {
  view.setFloat32(i * 4, float32Array[i], true);
}

var outputArray = new Uint8Array(length);

for (var j = 0; j < length; j++) {
  outputArray[j] = view.getUint8(j * 4);
}

return outputArray;

编辑:

我只需要保持二进制表示,就像在这个回答。中一样

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-19 23:35:50

代码语言:javascript
运行
复制
var output = new Uint8Array(float32Array.length);

for (var i = 0; i < float32Array.length; i++) {
  var tmp = Math.max(-1, Math.min(1, float32Array[i]));
  tmp = tmp < 0 ? (tmp * 0x8000) : (tmp * 0x7FFF);
  tmp = tmp / 256;
  output[i] = tmp + 128;
}

return output;

任何有疑问的人都可以很容易地用胆量的进口原始数据特性来测试这个问题。

  1. 下载样本原始数据,我使用Web的decodeAudioData方法从视频文件中解码。
  2. 通过使用上面的方法(或者使用您自己的方法,例如,使用Float32Array来听到损坏的声音)将原始数据被填充的Uint8Array转换为Uint8Array,并下载uint8 pcm文件。 forceDownload(new Blob([output], { type: 'application/octet-binary' }));
  3. 使用文件->导入->原始数据对下载的数据进行加密.编码应设置为无符号8位PCM和采样率应为16000赫兹,因为原始解码音频文件在16000赫兹。
票数 3
EN

Stack Overflow用户

发布于 2018-03-18 18:05:07

不太清楚你在问什么,或者更确切地说,你要求的似乎是一件毫无意义的事情。

Float32Array实例是“原始”字节值缓冲区上的视图,与所有类型化数组一样。数组的每个元素表示其中的4个原始字节。通过简单的数组查找提取值:

代码语言:javascript
运行
复制
var n = float32array[1];

隐式地将这4个字节解释为IEEE 32位浮点值,然后将该值转换为标准JavaScript数字。JavaScript数字总是64位IEEE浮点值.

类似地,Uint8Array是缓冲区上的视图,每个元素都提供一个字节的无符号整数值。那是,

代码语言:javascript
运行
复制
var n = uint8array[1];

访问该元素,将其解释为一个无符号的单字节整数,并将其转换为JavaScript数字。

因此:如果要检查32位浮点值的列表作为每个字节的原始整数值,则可以创建与Float32Array“共享”相同缓冲区的Float32Array

代码语言:javascript
运行
复制
var uintShared = new Uint8Array(float32array.buffer);

从查看Uint8Array值中看到的数字值似乎与查看Float32Array元素所获得的数字值没有任何关系,这是预期的。

另一方面,如果您想要创建一个新的Uint8Array来保存来自Float32Array的表观值,您只需创建一个长度相同的新数组并复制每个值:

代码语言:javascript
运行
复制
var uintCopy = new Uint8Array(float32array.length);
for (let i = 0; i < float32array.length; ++i)
  uintCopy[i] = float32array[i]; // deeply problematic; see below

通常情况下,这将不能很好地工作,因为Float32Array中的数值范围远远大于Uint8Array中值的数值范围。首先,32位浮点值可以是负值.更重要的是,即使你知道浮点值都是0到255之间的整数,你肯定不会在Uint8Array中得到相同的位模式,原因很简单,一个32位浮点数和一个8位无符号整数不一样。“保留IEEE-754表示”是没有意义的。

这就是现实情况。如果你要解释为什么你想以某种方式把32位IEEE浮点数的所有32位塞进一个8位的无符号整数中,那就有可能提供一个更直接的有帮助的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49348743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档