この質問の目的では、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 つの減衰は、可聴周波数の歪み以外の可聴効果がないことは確実です。