Question

Je suis en train de mettre en œuvre un égaliseur 8 bandes à base de DFT dans le seul but de l'apprentissage. Pour prouver que ma mise en œuvre DFT fonctionne, je nourrissais un signal audio, analysé et il resynthèse à nouveau sans modifications apportées au spectre des fréquences. Jusqu'à présent, si bon.

J'utilise le soi-disant « méthode standard de calcul de la DFT » qui est par corrélation. Cette méthode permet de calculer les parties réelles et imaginaires des deux échantillons N / 2 + 1 de longueur. Pour atténuer une fréquence que je fais juste:

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

où « k » est un indice compris entre 0 à N / 2, mais ce que je reçois après resynthèse est un signal déformé slighty, en particulier à des fréquences basses.

Le signal d'entrée la fréquence d'échantillonnage est de 44,1 kHz et comme je veux juste un égaliseur 8 bandes J'alimentant les DFT 16 échantillons à la fois, donc j'ai 8 cases de fréquence pour jouer.

show Quelqu'un peut-moi ce que je fais mal? J'ai essayé de trouver des informations à ce sujet sur Internet mais n'a pas pu trouver.

Merci à l'avance.

Était-ce utile?

La solution

DFT et FFT sont essentiellement les mêmes pour les besoins de cette question.

Pour atténuer une bande de fréquence (ou « bande ») dans un tableau transformé FFT, vous devez multiplier les composantes réelles et imaginaires par le même facteur, et aussi multiplier les composantes réelles et imaginaires du correspondant négatif bin fréquence. FFT produit une paire de matrices transformées, où la première moitié des valeurs représentent des composantes de fréquence positive et la seconde moitié représente des composantes de fréquence négatifs.

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. Je suppose que vous obtenez une massivement signal de re-synthèse déformée, et non un "signal déformé slighty, en particulier aux basses fréquences".

Je pense que la distorsion que vous voyez est le résultat de la taille de la fenêtre très petite que vous utilisez -. Ce serait surtout le cas si vous n'êtes pas en utilisant une approche de fenêtre 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 une fenêtre FFT 8-bin. En règle générale, les paramètres de 8 curseurs seraient utilisés pour calculer une fonction sinueuse reliant les 8 points dans le domaine de fréquence, et cette fonction seraient alors utilisés pour régler les amplitudes des bacs pour un beaucoup plus grand, ensemble de fréquences plus fine à grains fins.

Un point de plus, aussi: les bacs de fréquence divisent la gamme disponible de façon uniforme, donc peu importe la taille de votre taille de la fenêtre est, plus de la moitié des bacs couvrent les fréquences qui ne sont pas audibles à l'oreille humaine. Voilà pourquoi la bandes couverts par un égaliseur sont généralement mis à l'échelle logarithmique (par exemple 100Hz, 1 KHz et 10Khz pour un égaliseur 3 bandes typique) et donc ne sont pas applicables à un nombre égal de fréquence bacs .

Dans le cas d'une fenêtre de 8 bin uniformément espacées, une atténuation de 5 des 8 est certain qu'il n'a aucun effet audible autre que la distorsion des fréquences audibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top