在python中查找最大有符号短整数

时间:2010-02-22 01:12:08

标签: python struct

如何获取Python中的最大签名短整数(即C的limits.h中的SHRT_MAX)

我想从*.wav文件的单个通道中标准化样本,因此我需要一堆介于1和-1之间的浮点数,而不是一堆16位有符号整数。这就是我所拥有的(相关代码在normalized_samples()函数中):

def samples(clip, chan_no = 0):
    # *.wav files generally come in 8-bit unsigned ints or 16-bit signed ints
    # python's wave module gives sample width in bytes, so STRUCT_FMT
    # basically converts the wave.samplewidth into a struct fmt string
    STRUCT_FMT = {  1 : 'B',
                    2 : 'h' }

    for i in range(clip.getnframes()):
        yield struct.unpack(STRUCT_FMT[clip.getsampwidth()] * clip.getnchannels(), 
                clip.readframes(1))[chan_no]

def normalized_samples(clip, chan_no = 0):
    for sample in samples(clip, chan_no):
        yield float(sample) / float(32767) ### THIS IS WHERE I NEED HELP

5 个答案:

答案 0 :(得分:2)

GregS是对的,这不是解决问题的正确方法。如果您的样本已知为8位或16位,则您不希望将它们除以不同平台的数字。

你可能遇到麻烦,因为签名的16位int实际上在-32768到32767之间。除以32767将会给你< -1在极端负面的情况下。

试试这个:

产量浮点数(样本+ 2 ** 15)/ 2 ** 15 - 1.0

答案 1 :(得分:1)

在模块sys,sys.maxint中。虽然我不确定这是解决问题的正确方法。

答案 2 :(得分:1)

这是一种使用 cython

的方法

<强> getlimit.py

import pyximport; pyximport.install()
import limits

print limits.shrt_max

<强> limits.pyx

import cython
cdef extern from "limits.h":
    cdef int SHRT_MAX

shrt_max = SHRT_MAX

答案 3 :(得分:1)

我无法想象现代计算机上的情况(即使用2的补码整数的情况)会失败:

assert -32768 <= signed_16_bit_integer <= 32767

完全按照你的要求行事:

if signed_16_bit_integer >= 0:
    afloat = signed_16_bit_integer / 32767.0
else:
    afloat = signed_16_bit_integer / -32768.0

更仔细地阅读你的代码:你有sample_width_in_bytes所以只要它是B除以255或256,如果它是h

则除以32768

答案 4 :(得分:0)

#!/usr/bin/env python2

# maximums.py

####################################333#########################

B16_MAX = (1 << 16) - 1
B15_MAX = (1 << 15) - 1
B08_MAX = (1 <<  8) - 1
B07_MAX = (1 <<  7) - 1

print
print "hex(B16_MAX) =",hex(B16_MAX) # 0xffff
print "hex(B15_MAX) =",hex(B15_MAX) # 0x7fff
print "hex(B08_MAX) =",hex(B08_MAX) #   0xff
print "hex(B07_MAX) =",hex(B07_MAX) #   0x7f
print

####################################333#########################

UBYTE2_MAX = B16_MAX
SBYTE2_MAX = B15_MAX
UBYTE1_MAX = B08_MAX
SBYTE1_MAX = B07_MAX

print
print "UBYTE2_MAX =",UBYTE2_MAX # 65535
print "SBYTE2_MAX =",SBYTE2_MAX # 32767
print "UBYTE1_MAX =",UBYTE1_MAX #   255
print "SBYTE1_MAX =",SBYTE1_MAX #   127
print

####################################333#########################

USHRT_MAX = UBYTE2_MAX
SHRT_MAX  = SBYTE2_MAX
CHAR_MAX  = UBYTE1_MAX
BYTE_MAX  = SBYTE1_MAX

print
print "USHRT_MAX =",USHRT_MAX # 65535
print " SHRT_MAX =", SHRT_MAX # 32767
print " CHAR_MAX =", CHAR_MAX #   255
print " BYTE_MAX =", BYTE_MAX #   127
print

####################################333#########################