這裏介紹一種使用近場的乾淨的音頻生成(模擬)遠場音頻的方法。GitHub項目地址:RIR_Generator。
只介紹方法,要了解原理的請參考項目裏的rir_generator.pdf
文檔。
1.首先把這個項目git clone到本地。
2.將cpp文件編譯成matlab可執行的文件
(參考這裏)
方法是,在終端打開matlab,在matlab命令行輸入以下代碼並回車
mex rir_generator.cpp
得到rir_generator.mexa64
文件,在matlab中可以直接調用這個文件。
3.從近場音頻產生遠場音頻
以example_1.m
爲例產生遠場音頻。
example_1.m
的代碼爲
c = 340; % Sound velocity (m/s)
fs = 16000; % Sample frequency (samples/s)
r = [2 1.5 2]; % Receiver position [x y z] (m)
s = [2 3.5 2]; % Source position [x y z] (m)
L = [5 4 6]; % Room dimensions [x y z] (m)
beta = 0.4; % Reverberation time (s)
n = 4096; % Number of samples
h = rir_generator(c, fs, r, s, L, beta, n);
參數的解讀請參考rir_generator.pdf
文檔的p11
修改一下代碼,將乾淨的近場音頻close_clean.wav
生成遠場音頻。
c = 340; % Sound velocity (m/s)
fs = 16000; % Sample frequency (samples/s)
r = [2 1.5 2]; % Receiver position [x y z] (m)
s = [2 3.5 2]; % Source position [x y z] (m)
L = [5 4 6]; % Room dimensions [x y z] (m)
beta = 0.4; % Reverberation time (s)
n = 4096; % Number of samples
h = rir_generator(c, fs, r, s, L, beta, n); % 計算轉換矩陣
close_clean_wav = audioread('close_clean.wav'); % 讀取近場乾淨音頻
far_field_wav = fftfilt(h, close_clean_wav); % 產生遠場音頻
audiowrite('far_field.wav', far_field_wav, 16000); % 保存爲.wav文件
4.效果
近場音頻:close_clean.wav
產生的遠場音頻:far_field.wav
這種方法可以用於語音增強。