2010-02-22 6 views
5

(즉, C의 limits.h에있는 SHRT_MAX) 의 부호있는 최대 정수는 어떻게 얻을 수 있습니까?Python에서 부호있는 최대 정수 찾기

*.wav 파일의 단일 채널에서 샘플을 정규화하려는 경우 16 비트 부호있는 정수 대신 여러 개의 부동 소수점을 1에서 -1 사이로 입력해야합니다. 모듈 SYS에

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 
+2

16 비트 샘플이면 가장 큰 일반 정수의 크기에 관계없이 32768로 나눕니다. 파이썬은 버전 3까지는 두 종류의 정수만 있고, "보통"제한된 크기의 int와 무제한 binint가 있습니다. 짧은 int 형식이 없습니다. –

답변

1

, sys.maxint를을 : 여기합니다 (관련 코드가 normalized_samples() 기능에)있어거야. 그게 당신의 문제를 해결하는 올바른 방법인지 모르겠지만.

+0

당신은 sys.maxint로 나누겠습니까? –

2

GregS가 맞습니다. 문제를 해결하는 올바른 방법이 아닙니다. 샘플이 8 비트 또는 16 비트라고 알려진 경우 플랫폼에 따라 다른 숫자로 나누고 싶지는 않습니다.

부호있는 16 비트 int의 범위는 실제로 -32768에서 32767까지이므로 문제가 될 수 있습니다. 32767로 나눠서 < -1을 극단적 인 음수로 지정하려고합니다.

이 시도 :

수율 플로트 (샘플 + 2 ** 15)/2 ** 15 - 여기서는 1.0

1

이 방법은 사용 사이 썬을

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

현대 컴퓨터에서는 상황을 상상할 수 없습니다.

assert -32768 <= signed_16_bit_integer <= 32767 

은 당신이 질문을 정확하게하려면 :이 실패 2의 보수 정수를 사용 하나)

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입니다.

관련 문제