无法编辑我的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]
,而不是一个数组或一个字符串。 我可以得到一些帮助吗?
答
这是因为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。
'[129 129 129 ...,129 129 129]'是'uint8'的数组,正如你指定的那样。 – hpaulj
但为什么我不能编辑它?当我在范围执行 对于k(N): 如果频率[K]> INT(127): 频率[K] =频率[K] -249 打印(频率) 然而,当我执行它上: array([129,129,129,129,129,129])它的工作:/ –
'tableau_ampli()'的第一行是什么'wave'?当我尝试运行这段代码时,它给了我一个错误。 – Antimony