2017-04-26 47 views
0

我創建了一個聲音這樣說:無法編輯我的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

回答

0

這是因爲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

當然,完成! –