Hacemos que el sonido en los auriculares sea tridimensional. Procesamiento de señales digitales para uso doméstico

Si alguna vez escuchó música a través de auriculares y parlantes, debe haber notado que suena diferente. Los auriculares suelen tener la sensación de que la fuente de sonido está en algún lugar dentro de la cabeza. Hay otros efectos negativos: algunas grabaciones más antiguas se hacen para que, por ejemplo, la guitarra se mezcle completamente en el canal izquierdo y la batería en el derecho. En los altavoces suena normal, como si el guitarrista estuviera parado cerca de uno de los altavoces, pero en los auriculares es muy desagradable, porque no es natural: en la naturaleza no existe tal cosa en que solo un oído pueda escuchar el sonido.





Diré más: la gran mayoría de las grabaciones de audio comerciales están diseñadas específicamente para escuchar a través de altavoces. Es decir, el ingeniero de sonido, al preparar la grabación, hace todo lo posible para que suene correctamente (de acuerdo con las ideas del autor) en los monitores de estudio, y es muy probable que ni siquiera revise cómo quedará en los auriculares.





Parecería que si te gusta, siempre puedes escuchar a través de los altavoces. Pero, por desgracia, existen limitaciones: desea escuchar música en la oficina, en el transporte o simplemente a última hora de la noche, cuando los niños / padres / vecinos han estado durmiendo durante mucho tiempo. Además, el costo de los sistemas de altavoces de alta calidad es varias veces mayor que el costo de los auriculares de alta calidad. Y luego puede que todavía sea necesario un amplificador separado, un tratamiento acústico de la habitación, etc. A veces simplemente no hay lugar para los altavoces en el apartamento ... Con los auriculares, todo es más fácil.





¿Qué hacer?

¡Un minuto! Pero cuando escuchamos música a través de los altavoces (o incluso nos sentamos en una sala de conciertos), una señal acústica muy específica llega a cada oído. Entonces, si grabas esta señal con un pequeño micrófono ubicado dentro de cada aurícula, y luego la reproduces con unos buenos auriculares, tendremos la misma sensación de estar en el pasillo. Excepto por las señales de baja frecuencia sentidas por el pecho. Sin embargo, este es un procedimiento demasiado complicado, aunque estas grabaciones (se denominan binaurales) a veces se realizan e incluso se venden.





¿Y si reproduce alguna señal de prueba a través de los altavoces, la graba con estos pequeños micrófonos en sus oídos, determina cómo se convirtió la señal y luego transforma de manera similar su música favorita antes de reproducirla a través de los auriculares?





HRTF y 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- - , , , . . .





Impulso directo
Direct impulse
Impulso opuesto
Opposite impulse

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 (. . ). , :





Deconvolución FFT
FFT deconvolution

- :) , . , - . ... , , hcorr(t) * hR(t) = hL(t).

, " ":





plot(conv(impulsedirect, impulsetf)(1:4096) - impulseopposite);
      
      



Error de FFT
FFT error

, , . ...





. , : . , . - () -. Matlab, , ( , - ).





, :





Deconvolución de LMS
LMS deconvolution

" ":





Error de LMS
LMS error

, .





:





Deconvolución LMS, ampliada
LMS deconvolution, zoomed-in

, . , , 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');
      
      



Deconvolución LMS, LPF
LMS deconvolution, LPF

.

, . . , , .





, … , 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;
      
      



Deconvolución de LMS, LPF, ventanas
LMS deconvolution, LPF, windowing

. . , 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 . - .





, . . .





- .





GNU Octave GitHub.





, . .












All Articles