无法编辑我的 np.fromstring

Can't edit my np.fromstring

我是这样创建声音的:

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)

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

这是因为 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。