DFT et FFT sont essentiellement les mêmes pour les besoins de cette question. Pour atténuer une case de fréquence (ou "bande") dans un tableau transformé par FFT, vous devez multiplier les composantes réelle et imaginaire par le même facteur, et également multiplier les composantes réelles et imaginaires du résultat négatif. bin de fréquence. La FFT produit une paire transformée de tableaux où la première moitié des valeurs représente des composantes de fréquence positives et la seconde moitié représente des composantes de fréquence négatives.
Voici un exemple de code simplifié pour un filtre passe-bas qui explique ce que je veux dire:
// 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;
}
}
Mise à jour: après avoir lu votre édition, je dois dire que votre code fonctionne comme prévu . J'ai supposé que vous obteniez un massivement signal re-synthétisé déformé, pas un "signal faiblement distordu, particulièrement aux basses fréquences". Je pense que la distorsion que vous voyez est le résultat de la très petite taille de fenêtre que vous utilisez - ce serait particulièrement le cas si vous n'utilisez pas une approche de fenêtre de Hanning pour reconstruire le signal original. Essayez d'exécuter votre code avec une taille de fenêtre plus typique (comme 1024). Un égaliseur 8 bandes n'utilise généralement pas de fenêtre FFT à 8 cases. Typiquement, les réglages de 8 curseurs seraient utilisés pour calculer une fonction sinueuse reliant les 8 points dans le domaine fréquentiel, et cette fonction serait alors utilisée pour régler les amplitudes bin pour un ensemble de fréquences beaucoup plus grand et plus finement granulaire.
Encore un point: les bacs de fréquences divisent uniformément la plage disponible, donc quelle que soit la taille de votre fenêtre, plus de la moitié des bacs couvrent des fréquences qui ne sont pas audibles pour l'oreille humaine. C'est pourquoi les bandes couvertes par un égaliseur sont typiquement mises à l'échelle logarithmiquement (par exemple 100Hz, 1Khz et 10Khz pour un égaliseur 3 bandes typique) et ne s'appliquent donc pas à des nombres égaux de fréquence cases.
Dans le cas d'une fenêtre à 8 cases régulièrement espacées, l'atténuation de 5 sur 8 ne produira aucun effet audible autre qu'une distorsion des fréquences audibles.
+1. Votre dernière phrase est particulièrement importante. Filtrer en mettant à zéro des valeurs dans le domaine fréquentiel applique en effet un filtre carré, ce qui provoquera une sonnerie importante (phénomène de Gibbs) dans la réponse en fréquence. Gardez à l'esprit que définir une valeur dans le domaine de fréquence discrète sur zéro n'affecte que la réponse à cette fréquence exacte. La réponse en fréquence entre les échantillons de fréquence oscillera sauvagement avec un filtre mural en briques. Je vous suggère de regarder dans les tutoriels sur la conception de bande passante FIR. –
@Jason: avez-vous des liens vers de bons didacticiels de conception de filtres? J'ai fait une brève plongée dans les filtres de codage comme mon exemple ci-dessus, mais je n'ai pas été beaucoup plus loin que cela. – MusiGenesis
Oh, je suppose que vous avez supprimé cette phrase, mais vous avez également changé votre code pour montrer un changement plus progressif dans la bande passante. –