2010-02-22 15 views
5

Come ottengo il massimo intero con segno firmato in Python (vale a dire SHRT_MAX in C limiti.h) ?Trova il numero intero massimo con segno firmato in python

voglio normalizzare i campioni provenienti da un singolo canale di un file *.wav, così invece di un gruppo di interi con segno a 16 bit, voglio un po 'di carri allegorici tra 1 e -1. Ecco quello che ho (il codice pertinente è nella funzione 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 
+2

Se sono campioni a 16 bit, li dividi per 32768, indipendentemente dalle dimensioni del più grande intero normale. python ha solo due tipi di interi fino alla versione 3, un "normale" int limitato e un binint illimitato. Non esiste un tipo int breve. –

risposta

1

in SYS modulo, sys.maxint. Anche se non sono sicuro che sia il modo corretto di risolvere il tuo problema.

+0

Divideresti per sys.maxint ???? –

2

GregS ha ragione, questo non è il modo giusto per risolvere il problema. Se i tuoi campioni sono conosciuti 8 o 16 bit, non vuoi dividerli per un numero che varia in base alla piattaforma.

È possibile che si verifichino problemi poiché un int con 16 bit con segno varia effettivamente da -32768 a 32767. La divisione di 32767 ti darà < -1 nel caso estremo negativo.

Prova questo:

galleggiante resa (campione + 2 ** 15)/2 ** 15 - 1.0

1

Ecco un modo utilizzando 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

Non riesco a immaginare le circostanze su un computer moderno (ad es. uno che utilizza 2 di numeri interi complemento), dove questo fallirebbe:

assert -32768 <= signed_16_bit_integer <= 32767 

di fare esattamente quello che hai chiesto:

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

Dopo aver letto il codice di un po 'più da vicino: avete sample_width_in_bytes quindi basta dividere per 255 o 256 se è B e 32768 se è h

Problemi correlati