2015-08-03 2 views
0

У меня есть чистый образец звука в виде wav-файла. Я хочу добавить реверберацию к этому звуку. Я видел приложение freeverbreverberation, но не уверен, могу ли я использовать его для сохранения вывода в файл.Reverberate clean sound

Неужели кто-то сделал это раньше?

Спасибо,

+1

Я не уверен, как это сделать с самой Matlab. Существуют программные плагины, называемые VST, часто бесплатные, которые используются для добавления реверберации к образцу звука, но для этого обычно требуется использовать цифровую рабочую станцию ​​(DAW). Это все возможно, скорее всего, бесплатно, но это довольно немного накладных расходов в зависимости от того, что вы хотите сделать. Я советую, что создание собственного «реалистичного» ревербератора, вероятно, не является одной задачей программирования ночью. – ConfusinglyCuriousTheThird

+1

Конвольв с соответствующей импульсной функцией? Вы можете определить такую ​​функцию вручную, используя множество шипов для имитации отражений –

ответ

2

Вам необходимо определить соответствующий импульсный отклик и скручивать оригинальный звук с ним. Каждый всплеск в импульсном отклике представляет собой отражение исходного звука и характеризуется его задержкой и амплитудой. Вы должны определить большое количество шипов, чтобы они были коллективно восприняты как реверберация, а не отдельные эхо-сигналы.

Экспоненциальная модель обычно используется для представления распада амплитуды с задержкой (см., Например, here). Вы должны определить случайные значения для параметров, чтобы реверберация звучала реалистично. Ниже приведена простая модель.

%// Data: 
filename = 'file.wav'; %// name of input file. Mono or stereo. 
delay_dispersion = .2; %// this defines the amount of reverberation 
max_delay = delay_dispersion*4; %// this should be several times the delay dispersion 
num_delays = 50; %// number of echoes. Should be large for realistic reverberation 

%// Processing: 
[x, fs] = audioread(filename); %// read file 
delays = round(rand(1,50)*max_delay*fs); 
amplitudes = exp(-delays/delay_dispersion/fs); %// exponential profile 
amplitudes = .7*amplitudes+.3*rand(size(amplitudes)); %// add some randomness in amplitudes 
delays = [1 delays]; %// add clean sound... 
amplitudes = [1 amplitudes]; %// ...with unit amplitude 
h = zeros(1,ceil(max_delay*fs)); 
h(delays) = amplitudes; 
stem(delays, amplitudes) %// plot impulse response 
y = conv2(x,h(:)); %// use conv2 so that it works for mono or stereo x 
y = y/max(abs(y(:))); 
sound(x(1:min(2*fs,end),:), fs) %// play two seconds of dry sound 
pause(2) 
sound(y(1:min(2*fs,end),:), fs) %// play two seconds of reverberated sound 

Возможные улучшения включают в себя применение фильтр нижних с задержкой реплик, или определение задержки в кластеров для моделирования отражений от групп физически близких объектов.