Si vous avez déjà écouté de la musique avec des écouteurs et des haut-parleurs, vous devez avoir remarqué que cela sonne différemment. Les écouteurs ont souvent l'impression que la source sonore se trouve quelque part à l'intérieur de la tête. Il y a d'autres effets négatifs: certains enregistrements plus anciens sont faits de sorte que, par exemple, la guitare soit complètement mixée dans le canal gauche et la batterie - dans le droit. Sur les haut-parleurs, cela semble normal - comme si le guitariste se tenait à proximité de l’un des haut-parleurs, mais dans les écouteurs, c’est très désagréable, car ce n’est pas naturel: dans la nature, il n’existe pas de telle chose qu'une seule oreille puisse entendre le son.
Je dirai plus: la grande majorité des enregistrements audio commerciaux sont conçus spécifiquement pour une écoute via des haut-parleurs. Autrement dit, l'ingénieur du son, lors de la préparation de l'enregistrement, fait tout pour qu'il sonne correctement (conformément aux idées de l'auteur) dans les moniteurs de studio, et comment il sera dans le casque ne sera probablement même pas vérifié.
Il semblerait que si vous l'aimez, vous pouvez toujours écouter via les haut-parleurs. Mais hélas, il y a des limites: vous voulez écouter de la musique au bureau, dans les transports, ou juste tard le soir, lorsque les enfants / parents / voisins dorment depuis longtemps. De plus, le coût des systèmes de haut-parleurs de haute qualité est plusieurs fois plus élevé que celui des écouteurs de haute qualité. Et puis il peut encore y avoir besoin d'un amplificateur séparé, d'un traitement acoustique de la pièce, etc. Parfois, il n'y a tout simplement pas de place pour les enceintes dans l'appartement ... Avec un casque, tout est plus facile.
Que faire?
Une minute! Mais lorsque nous écoutons de la musique via les haut-parleurs (ou même si nous nous asseyons dans une salle de concert), un signal acoustique très spécifique atteint chaque oreille. Donc, si vous enregistrez ce signal avec un petit microphone situé à l'intérieur de chaque oreillette, puis le reproduisez avec de bons écouteurs, nous aurons la même sensation d'être dans la salle. Sauf pour les signaux basse fréquence ressentis par la poitrine. Cependant, c'est une procédure trop compliquée, bien que de tels enregistrements (on les appelle binauraux) soient parfois réalisés, et même vendus.
Et si vous lisez un signal de test via les haut-parleurs, enregistrez-le avec ces minuscules microphones dans vos oreilles, déterminez comment le signal a été converti, puis transformez de la même manière votre musique préférée avant de la lire au casque?
HRTF et 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');
.
, . . , , .
, , , , , 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/ - un ensemble d'utilitaires pour créer des filtres FIR qui corrigent les distorsions introduites par l'acoustique de la pièce.
https://hydrogenaud.io/index.php?topic=90662.0 - Plug-in Stereo Convolver pour foobar2000.