无法编辑我的np.fromstring

问题描述:

我创建了一个声音这样说:无法编辑我的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) 

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

+0

'[129 129 129 ...,129 129 129]'是'uint8'的数组,正如你指定的那样。 – hpaulj

+0

但为什么我不能编辑它?当我在范围执行 对于k(N): 如果频率[K]> INT(127): 频率[K] =频率[K] -249 打印(频率) 然而,当我执行它上: array([129,129,129,129,129,129])它的工作:/ –

+0

'tableau_ampli()'的第一行是什么'wave'?当我尝试运行这段代码时,它给了我一个错误。 – Antimony

这是因为freq中的元素为uint8,它给了我们一个从(0到255)的无符号整数。见here。 所以,当你从它中减去一些东西时,比如说x,它会通过执行256 - x将它强制到0到25​​5的范围内。由于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。

+0

它的工作原理,非常感谢! –

+0

太棒了!那么你能接受答案吗? :) – Antimony

+0

当然,完成! –