Wir machen den Ton im Kopfhörer dreidimensional. Digitale Signalverarbeitung für den Heimgebrauch

Wenn Sie jemals Musik über Kopfhörer und Lautsprecher gehört haben, müssen Sie bemerkt haben, dass sie anders klingt. Kopfhörer haben oft das Gefühl, dass sich die Schallquelle irgendwo im Kopf befindet. Es gibt noch andere negative Effekte: Einige ältere Aufnahmen werden so gemacht, dass beispielsweise die Gitarre vollständig in den linken Kanal und das Schlagzeug in den rechten Kanal eingemischt wird. Auf den Lautsprechern klingt es normal - als ob der Gitarrist dort steht, wo sich einer der Lautsprecher befindet, aber in Kopfhörern ist es sehr unangenehm, weil es unnatürlich ist: In der Natur gibt es nicht so etwas, dass nur ein Ohr den Ton hören kann.





Ich werde noch mehr sagen: Die überwiegende Mehrheit der kommerziellen Audioaufnahmen ist speziell für das Hören über Lautsprecher konzipiert. Das heißt, der Toningenieur macht bei der Vorbereitung der Aufnahme alles so, dass es auf Studiomonitoren korrekt klingt (gemäß den Ideen des Autors), und wie es in den Kopfhörern sein wird, wird höchstwahrscheinlich nicht einmal überprüft.





Es scheint, dass Sie, wenn Sie es mögen, immer über die Lautsprecher hören können. Leider gibt es Einschränkungen: Sie möchten Musik im Büro, im Transportwesen oder erst spät abends hören, wenn Kinder / Eltern / Nachbarn lange geschlafen haben. Darüber hinaus sind die Kosten für hochwertige Lautsprechersysteme um ein Vielfaches höher als die Kosten für hochwertige Kopfhörer. Und dann ist möglicherweise noch ein separater Verstärker, eine akustische Behandlung des Raums usw. erforderlich. Manchmal ist einfach kein Platz für die Lautsprecher in der Wohnung ... Mit Kopfhörern ist alles einfacher.





Was zu tun ist?

Eine Minute! Wenn wir jedoch Musik über die Lautsprecher hören (oder sogar in einem Konzertsaal sitzen), erreicht jedes Ohr ein ganz bestimmtes akustisches Signal. Wenn Sie dieses Signal also mit einem kleinen Mikrofon in jeder Ohrmuschel aufnehmen und es dann über gute Kopfhörer wiedergeben, haben wir das gleiche Gefühl, in der Halle zu sein. Mit Ausnahme von niederfrequenten Signalen, die von der Brust gefühlt werden. Dies ist jedoch ein zu kompliziertes Verfahren, obwohl solche Aufzeichnungen (sie werden als binaural bezeichnet) manchmal gemacht und sogar verkauft werden.





Und was ist, wenn Sie ein Testsignal über die Lautsprecher abspielen, es mit diesen winzigen Mikrofonen in Ihren Ohren aufnehmen, bestimmen, wie das Signal umgewandelt wurde, und dann Ihre Lieblingsmusik auf ähnliche Weise umwandeln, bevor Sie es über die Kopfhörer abspielen?





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





Direkter Impuls
Direct impulse
Gegenimpuls
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 (. . ). , :





FFT-Entfaltung
FFT deconvolution

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

, " ":





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



FFT-Fehler
FFT error

, , . ...





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





, :





LMS-Entfaltung
LMS deconvolution

" ":





LMS-Fehler
LMS error

, .





:





LMS-Entfaltung, vergrößert
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');
      
      



LMS-Entfaltung, 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;
      
      



LMS-Entfaltung, LPF, Fensterung
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