无法编辑我的np.fromstring

时间:2017-04-26 13:49:54

标签: arrays python-3.x numpy wav pyaudio

我用这种方式创造了一个声音:

import numpy as np
from scipy.io.wavfile import write   
data=np.random.uniform(-1,-1,44100)
scaled=np.int8(data/np.max(np.abs(data))*127)
write('test8.wav',44100,scaled)

我希望使用np.fromstring转换幅度:

def tableau_ampli(filename) :
    Monson = wave.open(filename,'r')
    n = Monson.getnframes()   
    if Monson.getsampwidth() == 1 : 
        freq = np.fromstring(Monson.readframes(n),dtype=np.uint8)
        print(freq)
        for k in range(n):
            if freq[k] > int(127) :
                freq[k]=freq[k]-249
        print(freq)
    else : 
       freq = np.fromstring(Monson.readframes(n),dtype=np.uint16)
       for k in range(len(freq)):
           if freq[k]>32767 :   # 32767 = [(2**16)/2]-1
                freq[k]-=65536    # 65536 = 2**16
    return(freq)

但是当我执行tableau_ampli('test8.wav')时它不起作用。 我认为问题是因为

 np.fromstring(Monson.readframes(n),dtype=np.uint8)

返回:[129 129 129 ..., 129 129 129]而不是数组或字符串。 我可以得到一些帮助吗?

1 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为freq中的元素是uint8,它给出了一个从(0到255)的无符号整数。见here。 因此,当你从中减去某些东西时,让我们说x,它会通过执行256 - x强制它进入0到255的范围。由于256 - 249 = 136,这就是你得到的。

您可以将freq = np.fromstring(Monson.readframes(n),dtype=np.uint8)更改为freq = np.fromstring(Monson.readframes(n),dtype=np.uint8).astype(int),将其转换为int数据类型,然后获取-120。