1

signal1 と signal2 の 2 つのオーディオ信号を比較する必要があります。Signal1 はホワイト ノイズです。Signal2 は signal1 と同じ信号で、一部の周波数をカットまたは減衰するための特定のイコライゼーションが適用されています。周波数ドメインで 2 つのオーディオ信号の比率を取得するにはどうすればよいですか? (例: 100Hz の周波数では、signal2 は signal1 と比較して 50% 減衰します)。この情報は、signal1 を signal2 に変換するために適用されたのと同じイコライゼーションを適用して 3 番目の信号を処理するために必要です。

このライブラリを使用してデータを処理し、時間領域から周波数領域に渡しました。このコードは、signal1 と signal2 で同じです。

DoubleFFT_1D fft1 = new DoubleFFT_1D (FFT_SIZE);
double[] input1 = new double[FFT_SIZE];

double[] fftBuff1 = new double[FFT_SIZE * 2];


this.wavFileDoubleInputStreamMic.read(input1, 0, FFT_SIZE);


for (int i = 0; i < FFT_SIZE; i++){
    fftBuff1[2*i] = input1[i];
    fftBuff1[2*i+1] = 0;
}


fft1.complexForward(fftBuff1);

FFT の結果 (signal1 と signal2 から) を使用して目標を達成するにはどうすればよいですか?

4

1 に答える 1

1

周波数領域で各信号の振幅を計算して、それぞれのパワー スペクトル推定値を取得し、除算を行う必要があります。

  • シグナル 1 とシグナル 2 を取得する
  • 適切なウィンドウ関数を両方の信号に適用します (例: von Hann)
  • ウィンドウ処理された信号に FFT を適用する
  • FFT 出力の大きさを計算します。mag = sqrt(re*re+im*im)これにより、実数値のパワー スペクトルが得られます。
  • 信号 1 のパワー スペクトルを信号 2 のパワー スペクトルで割って、周波数に対する実数値の比率を取得します。

この修正を信号 3 に適用するには、オーバーラップ加算またはオーバーラップ保存方法を使用できます。基本的には、信号 3 の FFT を取得し、各複素数値に上記で取得した実数値を掛けてから、逆 FFT を使用して時間を元に戻します。ドメイン。わずかな複雑さは、連続するサンプル ウィンドウをオーバーラップさせ、このオーバーラップを正しく処理する必要があることです (上記のオーバーラップ追加/オーバーラップ保存メソッドへのリンクを参照してください)。

于 2013-05-15T08:15:46.540 に答える