現在、iPhone のスピーカー/マイクの往復の周波数応答を計算しようとしています。スピーカーでサインスイープを再生し、マイクを介して録音し、そこから周波数応答を取得しようとします。最終的な目標は、特定のサウンドに FR を乗算して、iPhone のスピーカー/マイクのように聞こえるようにすることです。
これまでの私のコード:
//apply window function
vDSP_vmul(sineSweepMic,1,hammingWindow,1,sineSweepMic,1,n);
vDSP_vmul(sineSweepFile,1,hammingWindow,1,sineSweepFile,1,n);
//put both signals in complex arrays
vDSP_ctoz((DSPComplex *)sineSweepMic, 2, &fftSineSweepMic, 1, nOver2);
vDSP_ctoz((DSPComplex *)sineSweepFile, 2, &fftSineSweepFile, 1, nOver2);
//fft of both file and mic sweeps
vDSP_fft_zrip(fftSetup, &fftSineSweepFile, 1, log2n, FFT_FORWARD);
vDSP_fft_zrip(fftSetup, &fftSineSweepMic, 1, log2n, FFT_FORWARD);
//back to interleaved
vDSP_ztoc(&fftSineSweepFile, 1, (COMPLEX *)sineSweepFile, 2, nOver2);
vDSP_ztoc(&fftSineSweepMic, 1, (COMPLEX *)sineSweepMic, 2, nOver2);
//divide mic-sweep by file-sweep to create frequency response
vDSP_vdiv(sineSweepFile, 1, sineSweepMic, 1, frequencyResponse, 1, n);
これはこれまでのところ機能しており、FR を最初のファイル スイープで乗算すると、マイク スイープのように聞こえます。
私の問題: これは、FR が生成された正確なファイル (スイープ) に対してのみ機能します。FR を使って他のサウンドを変更するとすぐに、たとえばノイズだけの音楽が出てきます。
私はこのようなFRを使用します(周波数ドメイン、インターリーブ、複雑ではなく、同じ長さでも):
vDSP_vmul(soundToModify, 1, frequencyResponse, 1, soundToModify, 1, n);
スピーカーで再生されたファイルからのサイン スイープ:
記録されたサイン スイープ (減衰された低周波が表示されます):
上記のコードで生成された FR を使用して、私のファイル サイン スイープを周波数領域で乗算します。
私の目標: 私の理解では、周波数応答は各周波数に関する情報であり、システムによってどれだけ減衰または増幅されるかです(私の例では、低周波数を再現できません)。この種の情報を取得するために、必要なすべての周波数を含むサウンドを生成し (サイン スイープ)、それを再生し、記録されたスイープ/ファイル スイープを分割して (コードで分割)、すべての周波数がどのように変更されるかを分析します。
この FR を周波数領域で任意のサウンドに乗算すると、周波数の振幅が変更され、システムでの再生が模倣されます。
ありがとう!
更新: 最終的に、障害は複雑な算術演算の欠落であり、サインスイープとピンクノイズの両方が、インパルス応答を回復するためのインパルスとしてかなりうまく機能しました。
動作するコードを取得するには、記録されたスイープ fft データを最初のスイープ fft データで複雑に除算します。