Jika Anda pernah mendengarkan musik melalui headphone dan melalui speaker, Anda pasti pernah memperhatikan bahwa suaranya berbeda. Headphone sering kali merasa bahwa sumber suaranya ada di suatu tempat di dalam kepala. Ada efek negatif lainnya: beberapa rekaman lama dibuat sehingga, misalnya, gitar dicampur sepenuhnya ke saluran kiri, dan drum - ke saluran kanan. Pada speaker terdengar biasa - seolah-olah gitaris berdiri di sekitar salah satu speaker, tapi di headphone sangat tidak menyenangkan, karena itu tidak wajar: di alam tidak ada yang hanya satu telinga yang dapat mendengar suaranya.
Saya akan mengatakan lebih banyak: sebagian besar rekaman audio komersial dirancang khusus untuk didengarkan melalui speaker. Artinya, insinyur suara, saat menyiapkan rekaman, melakukan segalanya agar terdengar benar (sesuai dengan ide penulis) di monitor studio, dan bagaimana jadinya di headphone kemungkinan besar bahkan tidak akan diperiksa.
Tampaknya jika Anda suka, Anda selalu dapat mendengarkan melalui speaker. Namun sayang, ada batasannya: mau mendengarkan musik di kantor, di transportasi, atau baru larut malam, padahal anak / orang tua / tetangga sudah lama tidur. Selain itu, biaya sistem speaker berkualitas tinggi beberapa kali lebih tinggi daripada biaya headphone berkualitas tinggi. Dan kemudian mungkin masih ada kebutuhan untuk amplifier terpisah, perawatan akustik ruangan, dll. Terkadang tidak ada tempat untuk speaker di apartemen ... Dengan headphone, semuanya lebih mudah.
Apa yang harus dilakukan?
Satu menit! Tetapi ketika kita mendengarkan musik melalui speaker (atau bahkan duduk di aula konser), sinyal akustik yang sangat spesifik mencapai setiap telinga. Jadi jika Anda merekam sinyal ini dengan mikrofon kecil yang terletak di dalam setiap daun telinga, dan kemudian memutarnya melalui headphone yang bagus, kita akan merasakan perasaan yang sama seperti berada di aula. Kecuali sinyal frekuensi rendah yang dirasakan oleh dada. Namun, prosedur ini terlalu rumit, meskipun rekaman semacam itu (disebut binaural) terkadang dibuat, bahkan dijual.
Dan bagaimana jika Anda memainkan beberapa sinyal tes melalui speaker, merekamnya dengan mikrofon kecil ini di telinga Anda, menentukan bagaimana sinyal diubah, dan kemudian mengubah musik favorit Anda dengan cara yang sama sebelum memutarnya melalui headphone?
HRTF dan HRIR
, , , , . . x(t). , . , , "" . , : , , , . . , , , , , , . , , XL(t), - XR(t). , : XL(t)=FL(x(t)) XR(t)=FR(x(t)).
, - - - - , , ( *), :
XL(t) = hL(t) * x(t) XR(t) = hR(t) * x(t),
hL(t) hR(t) - .
? , ( ). , 2003- IRCAM () . , , , , , , . . , . . Head-Related Impulse Response - . HRTF, .
, . IRCAM , , , 30 , FIR- . , โฆ
, - Sennheizer, AKG, Beyerdynamic, Sony . . . - : "" "" . , . , "Harman Target Curves". , , "" , , . "" - , , . , HRTF.
, "" HRTF , - .
, - .
, : hR(t) hL(t). , "" HRTF ( hR(t) ) , , FR(), hR(t). , , XL(t) - . hcorr(t). : hcorr(t)*hR(t)*x(t)=hL(t)*x(t). hR(t), . ( ): hcorr(t)*hR(t)=hL(t).
, , , . . , - , . fft(). :
fft(hcorr(t)) โ
fft(hR(t)) = fft(hL(t))
( โ
).
, , :
fft(hcorr(t)) = fft(hL(t)) / fft(hR(t)).
( ), !
, , - , - . : .
, , , , , , .
, , , . . , .
: ( ) ( "target curve") - . , , . , , , . / .
, - - . - - , cross-feed. - . / . . , , , , "" . , , - ( ).
, , - Dolby Headphones. - foobar2000, Dolby. . -, . , ( ). , - . - . , , Dolby, , . , Windows. , , , , reverse-engineering, .
, - GitHub, - , . . , readme.md .
Matlab. , - GNU Octave. , .
, IRCAM. +-30 - , . -, , , (, ), , , , . IRC_1006_R_R0195_T030_P000.wav IRC_1006_R_R0195_T330_P000.wav, , , , - .
1006 - , 0195 - , 030/330 - (0 - , 90 , 180 - , 270 - ), 000 - . IRCAM xml- - , , , . . .
8192 , 44.1. 186, 63. , , ( 2 !) , . 1024..4096 . :
channel_idx = 1; % Channel index, used from input files: 1 - left, 2 - right
max_impulse_len = 4096;
[impulse, fs] = audioread(fname);
len = min(rows(impulse), max_impulse_len);
.
impulse = impulse(1 : len, channel_idx);
:
fft_div = fft(impulse_opposite) ./ fft(impulse_direct);
impulse_tf = real(ifft(fft_div));
- deconvolution system identification (. . ). , :
- :) , . , - . ... , , hcorr(t) * hR(t) = hL(t).
, " ":
plot(conv(impulsedirect, impulsetf)(1:4096) - impulseopposite);
, , . ...
. , : . , . - () -. Matlab, , ( , - ).
, :
" ":
, .
:
, . , , 20 ( ) :
lpf = remez(2 * round(fs / 600), [0 20000 / (fs / 2) 21000 / (fs / 2) 1], [1 1 0 0]); % For Matlab environment change "remez" to "firpm".
filteredImpulse=conv(impulse_tf, lpf, 'same');
.
, . . , , .
, โฆ , 8192 - , . - ! , , , .
, , , , , DRC, , . , DRC :)
, , ...
, . , :
avgDelay = round(median(grpdelay(impulse_tf)));
.
wnd = window(@blackman, 2 * (size(impulse_tf)(1) - avgDelay));
% Cut the window in size
wnd = flipud(wnd(1:size(impulse_tf)));
% Apply window
impulse_tf = impulse_tf .* wnd;
. . , 2..4 , . - . , .
( FFT). , , - ( ), :
. ( :)) - , . , , .
-, .
impulse_tf_stereo_L(:, 2) = impulse_tf;
impulse_tf_stereo_L(1, 1) = 1;
impulse_tf_stereo_R(:, 1) = impulse_tf;
impulse_tf_stereo_R(1, 2) = 1;
audiowrite(strcat(directory, fname_direct, '_TF_stereo_L.wav'), impulse_tf_stereo_L, fs);
audiowrite(strcat(directory, fname_direct, '_TF_stereo_R.wav'), impulse_tf_stereo_R, fs);
, . foobar2000 "Stereo Convolver". :
- , โฆ , .
- IRCAM . - .
, . . .
- .
, . .
http://recherche.ircam.fr/equipes/salles/listen/ - HRIR . IRCAM () 2003. LINKS HRTF.
-
https://www.musicdsp.org/en/latest/ - ,
https://en.wikipedia.org/wiki/Head-related_transfer_function - .
https://www.headphones.com/pages/measurements-and-frequency-response - - .
http://drc-fir.sourceforge.net/ - seperangkat utilitas untuk membuat filter FIR yang mengoreksi distorsi yang disebabkan oleh akustik ruangan.
https://hydrogenaud.io/index.php?topic=90662.0 - Plugin Stereo Convolver untuk foobar2000.