2016-11-24 8 views
0

Karplus-Strong 알고리즘을 구현하려고합니다.Python, Numpy 배열 및 WAVE 모듈을 사용하여 WAV 파일 작성

오디오 (y, rate = Fs)을 사용하여 Jupyter Notebook을 통해 수집 된 numpy 배열 (guitar accord를 나타내는)이 모두 잘 보입니다.

불행히도 NumPy와 배열 작성 : WAVE 모듈을 이용하여 WAV 파일로 Y하면 (다음 Python 코드를 사용하여) 올바르지 않습니다 Y의 각 요소

<type 'numpy.float64'> 
noise_output = wave.open('k-s.wav', 'w') 
noise_output.setparams((1, 4, Fs, 0, 'NONE', 'not compressed')) 

for i in range(0, len(y)): 
    value = y[i] 
    packed_value = struct.pack('f', value) 
    noise_output.writeframes(packed_value) 

noise_output.close() 

이다

WAV 파일을 올바르게 쓰려면 쓰기 루프를 어떻게 수정해야합니까?

문제에 대한 추가 정보 WAV에 쓰기 전에, y를 배열의 첫 번째 요소는 다음과 같습니다

[ 0.33659756 0.33659756 -0.43915295 -0.87036152 1.40708988 0.32123558 
-0.6889402 1.9739982 -1.29587159 -0.12299964 2.18381762 0.82228042 
0.24593503 -1.28067426 -0.67568838 -0.01843234 -1.830472 1.2729578 
-0.56575346 0.55410736] 

WAV 파일에 대한 요소를 작성 후, WAV 파일을 닫고 다시 그것을 읽고, 나는 수집의 첫 번째 20 개 요소에 대해이있어 배열 :

[ 1051481732 1051481732 -1092560728 -1084305405 1068768133 1050966269 
-1087349149 1073523705 -1079648481 -1107564740 1074512811 1062371576 
    1048303204 -1079775966 -1087571478 -1130954901 -1075163928 1067642952 
-1089415880 1057872379] 
+0

플로트 데이터를 정수로 변환하고 Little Endian으로 패킹해야합니다. –

+0

어떻게 정수로 변환 하시겠습니까? 일부 스케일링 또는? 플로트 수는 1에 가깝기 때문에 스케일링이 필요할 수도 있습니다. @ PM2Ring – mir0soft

+0

예, 크기를 조정해야합니다. 부호가있는 16 비트 정수를 사용하는 것이 좋으므로 부동 소수점을 '-2 ** 15

답변

1
import scipy.io.wavfile 
scipy.io.wavfile.write("karplus.wav", Fs, y) 

타다! AFAIK는 float64 및 float32와 함께 작동합니다. 스테레오의 경우 모양은 (nb_samples, 2) 여야합니다. scipy.io.wavfile.write을 참조하십시오.

+0

예, scipy로 시도했지만 모두 정상적으로 작동합니다. 그러나 나는 왜 내가 WAVE를 사용할 때 이런 일이 일어나고 있는지 당혹 스럽다. – mir0soft