2015-05-22 16 views
5

Tôi tải một wav với phương pháp wavefile.read scipy() mà mang lại cho tôi những samplerate và audiodataStereo để Mono wav bằng Python

Tôi biết rằng dữ liệu âm thanh này nếu stereo được lưu giữ như một đa chiều mảng như

audiodata[[left right] 
      [left right] 
      ... 
      [left right]] 

tôi sau đó sử dụng phương pháp này để tạo ra một mảng mới của dữ liệu âm thanh mono bằng cách lấy (phải + trái)/2

def stereoToMono(audiodata) 
    newaudiodata = [] 

    for i in range(len(audiodata)): 
     d = (audiodata[i][0] + audiodata[i][1])/2 
     newaudiodata.append(d) 

    return np.array(newaudiodata, dtype='int16') 

và sau đó tôi viết thư này để nộp sử dụng

wavfile.write(newfilename, sr, newaudiodata) 

này được sản xuất một file wav Mono, tuy nhiên âm thanh bị bẩn và có clickd vv suốt

những gì tôi làm sai?

+0

Close-cử tri: đây không phải là lỗi đánh máy, đó là một lỗi toán học thực sự liên quan đến tràn và cách ngăn chặn nó. Nó sẽ vẫn mở. – GreenAsJade

Trả lời

4

Thứ nhất, datatype của audiodata là gì? Tôi giả sử đó là một số định dạng số nguyên cố định chiều rộng và do đó bạn sẽ bị tràn. Nếu bạn chuyển đổi nó sang định dạng điểm nổi trước khi xử lý, nó sẽ hoạt động tốt:

audiodata = audiodata.astype(float) 

Thứ hai, không viết phần tử mã Python của bạn theo phần tử; vectorize nó:

d = (audiodata[:,0] + audiodata[:,1])/2 

hoặc thậm chí tốt hơn

d = audiodata.sum(axis=1)/2 

Đây sẽ là bao la nhanh hơn so với vòng lặp yếu tố-by-yếu tố bạn đã viết.

2

Hóa ra, tất cả tôi đã phải thay đổi là

(bên phải + trái)/2

để

(bên phải/2) + (trái/2)

Các vấn đề liên quan