2017-05-09 6 views
1

に32ビットの浮動小数点に変換します。これは、-1と1の間の32ビット浮動小数点数の配列Float32Arrayを生成します。私はwebsocketを使用してサーバにデータをストリームします。は、私はjavascriptのHTML5ウェブオーディオAPIによって生成されたいくつかのデータを持っている16ビットのPCM範囲

Iは-32768から+32767の間に16ビットのPCMの範囲(16ビットの符号付き整数)に32ビットの浮動小数点に変換する必要があります。これにより、データをwavファイルとして使用することができます。

私はトラブルの変換を抱えています。答えは、構造体モジュールを使用すると思われるが、私は正しい書式を取得できません。

+1

'struct'モジュールは、これらの型を直接変換することはできません。 32ビット浮動小数点値をPython floatにアンパックするだけで、Python intを16ビット整数にパックすることができます。また、必要な範囲変換も行いません。 –

答えて

3

ここ生32ビット浮動小数点オーディオサンプルを含むファイルを読み取り、それらのサンプルを含むWAVファイルを作成し、サンプルのPython 2.7プログラムは、16ビット符号付き整数サンプルを変換しています:

import sys 
import array 
import struct 
import wave 

def convert(fin, fout, chunk_size = 1024 * 1024): 
    chunk_size *= 4 # convert from samples to bytes 

    waveout = wave.open(fout, "wb") 
    waveout.setparams((1, 2, 44100, 0, "NONE", "")) 

    while True: 
     raw_floats = fin.read(chunk_size) 
     if raw_floats == "": 
      return 
     floats = array.array('f', raw_floats) 
     samples = [sample * 32767 
        for sample in floats] 
     raw_ints = struct.pack("<%dh" % len(samples), *samples) 
     waveout.writeframes(raw_ints) 

convert(open(sys.argv[1], "rb"), open(sys.argv[2], "wb")) 

コードはarray.arrayを使用しますstruct.unpackよりも少し速くなければならないため、32ビット浮動小数点サンプルをPython浮動小数点数に変換する必要があります。 Float32Arrayのように、ネイティブマシンのバイトオーダーも使用します。ネイティブマシンのオーダーに関係なくリトルエンディアンのバイトオーダーを使用する必要があるため、array.arrayを使用して16ビット整数サンプルを作成することはできません。範囲の変換は単純なPythonコードで処理されます。

+0

助けてくれてありがとう。私はこれまでコード簡体ました:https://gist.github.com/richtier/6b05b2bb3ceff20f3d9557227b8789c6を、私はバイトを使用する場合、ここで定義されている:https://pastebin.com/raw/yCQ8Bg5w私は彼がエラーを取得 '構造体.ERROR:必要な引数は、この時点でinteger'ではありません '' '[505.00430237688124、487.5382216461003、471.0005183443427、440.09429602883756]、例えば次のようになりsamples'、' samples'はどのバージョン – rikAtee

+0

@rikAteeまだfloatのリストであるため、理にかなっていますあなたはPythonを使っていますか?別のノートに –

+0

3.5.2 私は以下を追加したときに、私はそれが自分自身を行動を開始すると思う: 'サンプルは= [INT(サンプル* 32767)サンプル用フロートに]' – rikAtee

関連する問題