ヘッドホンの音を立体的にします。家庭用デジタル信号処理

ヘッドホンとスピーカーで音楽を聴いたことがあるなら、音が違うことに気づいたはずです。ヘッドホンは、音源が頭の中のどこかにあるように感じることがよくあります。他にもマイナスの影響があります。たとえば、ギターが左チャンネルに完全にミックスされ、ドラムが右チャンネルに完全にミックスされるように、古い録音が行われる場合があります。スピーカーでは、ギタリストがスピーカーの1つがどこにあるかについて立っているかのように聞こえますが、ヘッドホンでは不自然であるため、非常に不快です。自然界では、片方の耳だけが音を聞くことはできません。





私はもっ​​と言います:商用オーディオ録音の大部分は、スピーカーを通して聞くために特別に設計されています。つまり、サウンドエンジニアは、録音を準備するときに、スタジオモニターで(作者の考えに従って)正しく聞こえるようにすべてを行い、ヘッドホンでどのようになるかはほとんどチェックされません。





あなたがそれを好きなら、あなたはいつでもスピーカーを通して聞くことができるように思われるでしょう。しかし、残念ながら、制限があります。オフィス、交通機関、または子供/親/隣人が長い間眠っている夜遅くに音楽を聴きたいということです。さらに、高品質のスピーカーシステムのコストは、高品質のヘッドホンのコストの数倍です。それでも、別のアンプや部屋の音響処理などが必要になる場合があります。アパートにスピーカーを置く場所がない場合もあります...ヘッドフォンを使用すると、すべてが簡単になります。





何をすべきか?

一分!しかし、スピーカーから音楽を聴くとき(またはコンサートホールに座っているとき)、非常に特殊な音響信号が各耳に届きます。したがって、各耳介の内側にある小さなマイクでこの信号を録音し、それを優れたヘッドホンで再生すると、ホールにいるような感覚が得られます。胸が感じる低周波信号を除いて。ただし、このような録音(バイノーラルと呼ばれる)が作成されたり、販売されたりすることもありますが、これは手順が複雑すぎます。





また、スピーカーからテスト信号を再生し、耳にあるこれらの小さなマイクで録音し、信号がどのように変換されたかを確認してから、ヘッドフォンで再生する前にお気に入りの音楽を同様に変換するとどうなるでしょうか。





HRTFおよび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- - , , , . . .





直接衝動
Direct impulse
反対の衝動
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デコンボリューション
FFT deconvolution

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

, " ":





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



FFTエラー
FFT error

, , . ...





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





, :





LMSデコンボリューション
LMS deconvolution

" ":





LMSエラー
LMS error

, .





:





LMSデコンボリューション、ズームイン
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デコンボリューション、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デコンボリューション、LPF、ウィンドウ処理
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