Найти максимальное целое число со знаком в Python - PullRequest
5 голосов
/ 22 февраля 2010

Как получить максимальное подписанное короткое целое число в Python (т.е. SHRT_MAX в пределах C.h) ?

Я хочу нормализовать сэмплы из одного канала файла *.wav, поэтому вместо набора 16-разрядных целых чисел со знаком я хочу набор значений с плавающей запятой между 1 и -1. Вот что у меня есть (соответствующий код в функции 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

Ответы [ 4 ]

2 голосов
/ 22 февраля 2010

Грегс прав, это не верный способ решить проблему. Если ваши сэмплы известны как 8 или 16 бит, вы не хотите делить их на число, которое зависит от платформы.

Вы можете столкнуться с проблемами, потому что 16-разрядное целое число со знаком на самом деле колеблется от -32768 до 32767. Деление на 32767 даст вам <-1 в крайнем отрицательном случае. </p>

Попробуйте это:

доходность поплавка (образец + 2 ** 15) / 2 ** 15 - 1,0

1 голос
/ 22 февраля 2010

Я не могу представить себе обстоятельства на современном компьютере (то есть, на котором используются 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, поэтому просто разделите на 255 или 256, если это B, и на 32768, если это h

1 голос
/ 22 февраля 2010

Вот способ использования 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
1 голос
/ 22 февраля 2010

в модуле sys, sys.maxint. Хотя я не уверен, что это правильный способ решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...