4

学習のみを目的として、DFT ベースの 8 バンド イコライザーを実装しようとしています。DFT の実装が機能することを証明するために、オーディオ信号を入力して分析し、周波数スペクトルを変更せずに再合成しました。ここまでは順調ですね。

私は相関による、いわゆる「DFTを計算する標準的な方法」を使用しています。このメソッドは、実数部と虚数部の両方を N/2 + 1 サンプルの長さで計算します。私がやっている周波数を減衰させるには:

float atnFactor = 0.6;
Re[k] *= atnFactor;
Im[k] *= atnFactor;

ここで、「k」は 0 から N/2 の範囲のインデックスですが、再合成後に得られるのは、特に低周波数でわずかに歪んだ信号です。

入力信号のサンプル レートは 44.1 khz で、8 バンドのイコライザーが必要なため、一度に 16 サンプルを DFT に供給して、8 つの周波数ビンで再生します。

誰かが私が間違っていることを教えてもらえますか? インターネットでこの件に関する情報を見つけようとしましたが、何も見つかりませんでした。

前もって感謝します。

4

1 に答える 1

5

この質問の目的では、DFT と FFT は本質的に同じです。

FFT 変換された配列の周波数ビン (または「バンド」) を減衰させるには、実数成分と虚数成分の両方に同じ係数を掛ける必要があり、対応するの周波数ビンの実数成分と虚数成分も掛ける必要があります。FFT は、値の前半が正の周波数成分を表し、後半が負の周波数成分を表す、変換された配列のペアを生成します。

ローパス フィルターの簡単なコード サンプルを次に示します。

// fftsize = size of fft window
int halfFFTsize = fftsize / 2;
float lowpassFreq1 = 1000.0;
float lowpassFreq2 = 2000.0;
for (int i = 0; i < halfFFTsize; i++)
{
    int ineg = fftsize - 1 - i; // index of neg. freq.
    float freq = (float)i * (44100.0F / (float)halfFFTsize);
    if (freq >= lowpassFreq2)
    {
        real[i] = 0;
        imag[i] = 0;
        real[ineg] = 0;
        imag[ineg] = 0;
    }
    else if (freq >= lowpassFreq1)
    {
        float mult = 1.0 - ((freq - lowpassFreq1) / 
            (lowpassFreq2 - lowpassFreq1));
        real[i] *= mult;
        imag[i] *= mult;
        real[ineg] *= mult;
        imag[ineg] *= mult;
    }

}

更新:あなたの編集を読んだ後、あなたのコードは期待どおりに機能していると言わざるを得ません。「特に低周波数でわずかに歪んだ信号」ではなく、大幅に歪んだ再合成された信号取得していると思いました。

表示されている歪みは、使用しているウィンドウ サイズが非常に小さいためだと思います。これは、元の信号を再構築するためにハニング ウィンドウ アプローチを使用していない場合に特に当てはまります。

より一般的なウィンドウ サイズ (1024 など) でコードを実行してみてください。8 バンド イコライザーは通常、8 ビン FFT ウィンドウを使用しません。通常、8 つのスライダーの設定を使用して、周波数領域の 8 つのポイントを接続する曲線関数を計算し、この関数を使用して、はるかに大きく、より細かく設定された一連の周波数のビン振幅を設定します。

もう 1 つのポイント: 周波数ビンは使用可能な範囲を均等に分割するため、ウィンドウ サイズがどれほど大きくても、ビンの半分以上が人間の耳には聞こえない周波数をカバーします。これが、イコライザーがカバーする帯域が通常対数的にスケーリングされ (たとえば、典型的な 3 バンド イコライザーの場合は 100Hz、1Khz、10Khz)、同じ数の周波数ビンに適用されない理由です。

等間隔の 8 ビン ウィンドウの場合、8 つのうちの 5 つの減衰は、可聴周波数の歪み以外の可聴効果がないことは確実です。

于 2010-05-20T17:30:17.930 に答える