2020年1月31日金曜日

ObsPyでWINフォーマットを読み込むときのバグ

ObsPyでは、WINフォーマットをreadコマンドでStreamとして読み込むことができる。

ただ、たまに波形が変になったり、結合(merge)でエラーが出たりするので、コードを見てみた。
https://docs.obspy.org/_modules/obspy/io/win/core.html#_read_win


データサイズが3Byteの時のデータ読み込みの部分が以下のようになっていた。
elif datawide == 3:
    for i in range((xlen // datawide)):
        idata2 = output[chanum][-1] +\
        from_buffer(sdata[3 * i:3 * (i + 1)] + b' ',
            native_str('>i'))[0] >> 8


ここで、3Byteのデータに1Byte足して、4Byteを整数(int64)に変換し、それをビットシフトで後ろの1Byte(8bit)を取り除いてから、1つ前の時間のデータに足し合わせている。

ここで、ビットシフト演算子(>>)は、足し算よりも優先度が低いため、前のデータに足し合わせた後でビットシフトしてしまっている。
つまり、

elif datawide == 3:
    for i in range((xlen // datawide)):
        idata2 = output[chanum][-1] + (from_buffer(sdata[3 * i:3 * (i + 1)] + b' ', native_str('>i'))[0] >> 8)

のように、足し合わせる部分を括弧で括ればOK。