我用这种方式创造了一个声音:
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 :(得分: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。