4

現在、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 データで複雑に除算します。

4

1 に答える 1

3

iPhone のスピーカー/マイクの音を再現したい場合、理想的には、システムのインパルス応答を見つける必要があります。

あなたが間違っていること:システムがその上に独自の周波数応答を課す前に、入力周波数が(線形または指数関数的またはその他)変化するものであるため、サインスイープのFFTを見つけることは無意味です。Paul R が上で示唆したように、多くの統計的にフラットな入力周波数を平均化すると、システムの実際の周波数応答が得られるため、ホワイト ノイズの FFT を見つけることはより理にかなっています。

ただし、システムのサウンドを再現することが目的の場合は、上記のいずれの方法でも行われていない位相にも注意を払う必要があります。それを行うための「理想的な」方法は、完全に静かで乾燥した (反射のない) 環境で、「インパルス」に対する iPhone スピーカー/マイク システムの応答をキャプチャすることです。これには 3 つの方法があります。 1. バルーン ポップ サウンド、または合成的に作成されたインパルス サウンドを使用します。2. 多くのインパルス応答測定値を平均化する簡単な方法である Golay コードを使用します。 3. サイン スイープを使用しますが、相関を使用してインパルス応答を見つけます。

参照: https://ccrma.stanford.edu/realsimple/imp_meas/imp_meas.pdf

インパルス応答測定値を取得したら、これを「色付け」しようとしている信号とたたみ込むか、両方の信号の FFT を取得し、周波数領域で乗算してから、逆 FFT を実行して色付けされた信号を取得します。

説明: 私の知る限りで説明しようと思います: - インパルス応答の FR を取得するときは、その FFT の大きさを取得し、位相データを破棄します。したがって、根本的に異なる出力を与える同じ大きさの FR を持つ多くのフィルター (システム) があります。その好例がオールパス フィルターです。それらはすべてフラットな FR を持っていますが、それらにインパルスを加えると、フィルター パラメーターに応じてサイン スイープを取り戻すことができます。明らかに、これはいつでも IR から FR に移動できますが、反対方向に戻ることは任意の選択をしていることを意味するという事実を示しているはずです。したがって、大まかな見積もりであっても、フェーズを捨てることはできません。位相を聞くことができないという事実は、システムに関する情報について FR を調べることができるが、システムのモデル化で位相を無視することはできないことを意味します。それが理にかなっていることを願っていますか?サイン スイープを使用するには、次の手順を実行します - s(t) = sin(A(t)) および A(t) = integral[0 to t] (w(t)dt) の場合、信号 e(t) を相関させます。 = corr(v(t),sin(A(t)) ここで、v(t) = 2 * abs(dw/dt) はインパルスを生成します. したがって、その相関のサイン スイープを測定信号に置き換えると、そのインパルス応答を取得する必要があります。その相関の正弦波スイープを測定信号に置き換えると、そのインパルス応答が得られるはずです。それが役立つことを願っています! 数学っぽくてすみません。その相関の正弦波スイープを測定信号に置き換えると、そのインパルス応答が得られるはずです。それが役立つことを願っています! 数学っぽくてすみません。

于 2013-01-09T19:09:20.697 に答える