2017-09-12 8 views
1

私はオーディオファイルからバイト配列を持っており、オーディオ信号をフィルタリングするために処理できるデータに変換したいと思います。 私はこのような配列を持っています: [239,246,96,247 .....];各要素はuint8バイトですint16配列を浮動小数点に変換する

各2バイト(16ビット)はサンプルを表すため、この配列をint16要素配列に変換しました。

この配列を[-1,1]の範囲の値を持つ信号に変換するにはどうすればよいですか?

答えて

0

ます:

次のforeachのx、あなたは(x - maxUInt16/2)/maxUInt16/2

をしなければならないので、=>y = (x - (2^15 - 1))/(2^15 - 1)

maxUint16は、あなたが可能オーバーフローに

コードを処理する必要がありそう損なうですあなたの署名int16のを持っているので、サインにそれぞれminとmaxのint16の値で除算する必要があります。

let buffer = new Int16Array([0x0001, 0x7fff, 0x000, 0xffff, 0x8000]); 
// [1, 32767, 0, -1, -32768] 
let result = new Float32Array(buffer.length); 
for(let i=0; i<buffer.length; i++) result[i] = buffer[i]/(buffer[i] >= 0 ? 32767 : 32768); 
console.log(result[0], result[1], result[2], result[3], result[4]); 
// 0.000030518509447574615 1 0 -0.000030517578125 -1 
+0

逆の機能は可能ですか? float値の配列から_uint8_配列を取得しますか? – user7597554

+0

@ user7597554 - Float32からInt16にmin/ax int16の値を掛けてみると、ビットシフトとマスキングによってint16からuint8に移動します。 * u8buffer [0] =バッファ[0] & 0xff; u8buffer [1] =(バッファ[0] >> 8)& 0xff; * –

0

xは私の配列の要素です。 xはuint16で、int16ではありません。すでに

let init = new Uint8Array(22); 

for (let i = 0; i < 16; i++) { 
    init[i] = Math.trunc(Math.random() * 255) % 255; 
} 
/* Interested test case */ 
init[16] = 0; 
init[17] = 0; // Should return -1 
init[18] = 255; 
init[19] = 255; // Should return 1 
init[20] = 127; 
init[21] = 255; // Should return 0 

let sample = new Uint16Array(11); 

for (let i = 0; i < 11; i++) { 
    sample[i] = (init[i*2] << 8) | init[i*2+1]; 
} 

let ranged = []; 

for (let i = 0; i < 11; i++) { 
    ranged.push(Math.min((Number(sample[i]) - 32767)/32767 , 1)); 
} 

console.log(init); 
console.log(sample); 
console.log(ranged); 
関連する問題