2014-09-24 5 views
1

Я написал следующий код, который должен помещать эхо через доступный звуковой файл. К сожалению, результат - очень шумный результат, который я точно не понимаю. Может ли кто-нибудь помочь мне в этом отношении? Есть ли пропущенный шаг?Импульсный отклик с файлом Wav (python)

#convolving a room impulse response function with a sound sample both of stereo type 
from scipy.io import wavfile 
    inp=wavfile.read(sound_path+sound_file_name) 
    IR=wavfile.read(IR_path+IR_file_name) 
    if inp[0]!=IR[0]: 
     print "Size mismatch" 
     sys.exit(-1) 
    else: 
     rate=inp[0] 
    print sound_file_name 
    out_0=fftconvolve(inp[1][:,1],IR[1][:,0]) 
    out_1=fftconvolve(inp[1][:,1],IR[1][:,1]) 
    in_counter+=1 
    out=np.vstack((out_0,out_1)).T 
    out[:inp[1].shape[0]]=out[:inp[1].shape[0]]+inp[1] 
    wavfile.write(sound_path+sound_file_name+'_echoed.wav',rate,out) 

ответ

1

Видимо Wav файлы импортируются как int16 файлы и модификации должно быть сделано после их преобразования в поплавки: http://nbviewer.ipython.org/github/mgeier/python-audio/blob/master/audio-files/audio-files-with-pysoundfile.ipynb

После свертке нужно снова перенормировать. Вот и все.

Надеюсь, это тоже поможет другим.

from utility import pcm2float,float2pcm 
    input_rate,input_sig=wavfile.read(sound_path+sound_file_name) 
    input_sig=pcm2float(input_sig,'float32') 
    IR_rate,IR_sig=wavfile.read(IR_path+IR_file_name) 
    IR_sig=pcm2float(IR_sig,'float32') 

    if input_rate!=IR_rate: 
     print "Size mismatch" 
     sys.exit(-1) 
    else: 
     rate=input_rate 
    print sound_file_name 
    con_len=-1 
    out_0=fftconvolve(input_sig[:con_len,0],IR_sig[:con_len,0]) 
    out_0=out_0/np.max(np.abs(out_0)) 
    out_1=fftconvolve(input_sig[:con_len,1],IR_sig[:con_len,1]) 
    out_1=out_0/np.max(np.abs(out_1)) 
    in_counter+=1 
    out=np.vstack((out_0,out_1)).T 
     wavfile.write(sound_path+sound_file_name+'_'+IR_file_name+'_echoed.wav',rate,float2pcm(out,'int16')) 

Вы можете скачать утилиту из приведенной выше ссылки.

UPDATE: Хотя он генерирует рабочий выход его еще не так хорошо, как результат при использовании оригинального сайта Openair для свертки.

2

Добавление эхо в звуковой файл только что ... добавления эхо. Ваш код не похож на добавление двух звуков; похоже, что он преобразует входной звук во что-то другое.

Ваш поток данных должен выглядеть примерно так:

source sound ------------------------------>| 
     |          + ----------> target sound 
     ---------> convolution echo --------->| 

Обратите внимание, что ваш эхо звук собирается быть больше, чем ваш оригинальный звук (т.е. имеет «хвост»).

Добавление двух звуки вместе - это просто вопрос добавления каждого из отдельных сэмплов вместе с обоими звуками для создания новой выходной волны. Я не думаю, что vstack делает это.

+1

спасибо. Я исправил проблему, но результат по-прежнему неверен. присвойте 'vstack', чтобы объединить два канала. – Cupitor

+1

Я бы начал, убедившись, что эхо (просто эхо) звучит так, как будто это должно быть. –

+1

Ну, мой первый код, как вы объяснили, был только эхом, и это звучало не так, как ожидалось. Его довольно шумно, в отличие от случая, когда я использую онлайн-источник для свертки: http://www.openairlib.net/auralizationdb/content/elveden-hall-suffolk-england – Cupitor