2017-04-26 6 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

하지만 왜 편집 할 수 없습니까? I는 (N)의 범위에서 k에 대한 실행할 때 경우 주파수 [K]> INT (127) 주파수 [K] = 주파수 [K] -249 출력 (주파수) 그러나 I는 그것을 실행할 때 배열 ([129,129,129,129,129,129])이 작동합니다 :/ –

+0

'tableau_ampli()'의 첫 줄에'wave' 란 무엇입니까? 이 스 니펫을 실행하려고하면 오류가 발생합니다. – Antimony

답변

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을 얻을 수 있습니다.

+0

웨이브 가져 오기, 고마워요! –

+0

좋아요! 대답을 받아 들일 수 있습니까? :) – Antimony

+0

물론, 끝났어! –