DSP - Filtrage dans le domaine fréquentiel par la FFT

J'ai joué un peu avec le Exocortex mise en œuvre de la FFT, mais je vais avoir quelques problèmes.

Chaque fois que je modifie l'amplitude de la fréquence des bacs avant l'appel de la iFFT le signal résultant contient quelques clics et pops, surtout quand les basses fréquences sont présentes dans le signal (tels que la batterie ou basses). Cependant, cela ne se produit pas si je l'atténuation de toutes les bacs par le même facteur.

Laissez-moi vous donner un exemple de la mémoire tampon de sortie de 4-exemple de la FFT:

//Bin 0 (DC)
FFTOut[0] = 0.0000610351563
FFTOut[1] = 0.0

//Bin 1
FFTOut[2] = 0.000331878662
FFTOut[3] = 0.000629425049

//Bin 2
FFTOut[4] = -0.0000381469727
FFTOut[5] =  0.0

//Bin 3, this is the first and only negative frequency bin.
FFTOut[6] =  0.000331878662
FFTOut[7] = -0.000629425049

La sortie est composé de paires de chars, chacun représentant le réel et imaginay parties d'une seule cellule. Donc, bin 0 (tableau d'indices 0, 1) représentent les parties réelles et imaginaires de la DC fréquence. Comme vous pouvez le voir, les bacs 1 et 3 ont les mêmes valeurs, (sauf pour le signe de la Gi partie), donc je suppose que bin 3 est le premier négatif de fréquence, et enfin un index (4, 5) serait le dernier de fréquence positif bin.

Ensuite pour atténuer la fréquence bin 1 c'est ce que je fais:

//Attenuate the 'positive' bin
FFTOut[2] *= 0.5;
FFTOut[3] *= 0.5;

//Attenuate its corresponding negative bin.
FFTOut[6] *= 0.5;
FFTOut[7] *= 0.5;

Pour les tests, je suis en utilisant une résolution de 1024-longueur de la FFT et j'ai toujours fournir tous les échantillons, donc pas de 0-rembourrage est nécessaire.

//Attenuate
var halfSize = fftWindowLength /2;
float leftFreq = 0f;
float rightFreq = 22050f; 
for( var c = 1; c < halfSize; c++ )
{
    var freq = c * (44100d /halfSize);

    //Calc. positive and negative frequency indexes.
    var k = c * 2;
    var nk = (fftWindowLength - c) * 2;

    //This kind of attenuation corresponds to a high-pass filter.
    //The attenuation at the transition band is linearly applied, could
    //this be the cause of the distortion of low frequencies?
    var attn = (freq < leftFreq) ? 
                    0 : 
                    (freq < rightFreq) ? 
                        ((freq - leftFreq) /(rightFreq - leftFreq)) :
                        1;

    //Attenuate positive and negative bins.
    mFFTOut[ k ] *= (float)attn;
    mFFTOut[ k + 1 ] *= (float)attn;
    mFFTOut[ nk ] *= (float)attn;
    mFFTOut[ nk + 1 ] *= (float)attn;
}

Évidemment, je suis en train de faire quelque chose de mal, mais ne peut pas comprendre ce qu'.

Je ne veux pas utiliser la FFT sortie comme un moyen de générer un ensemble de SAPIN coefficients depuis que je suis en train de mettre en œuvre un très dynamique de base de l'égaliseur.

Quelle est la façon correcte de filtre dans le domaine fréquentiel? ce que je suis absent?

Aussi, est-il vraiment nécessaire pour atténuer des fréquences négatives ainsi? J'ai vu une FFT de mise en œuvre où nég. valeurs de la fréquence sont mis à zéro avant de synthèse.

Merci d'avance.

  • Vous semblez supposer que passe-haut de filtrage est fait en prenant un fenêtré DFT, en multipliant les coefficients et la prise de la transformation inverse ("resyntehsis"). Eh bien, ce n'est pas la manière habituelle. Vous devriez lire d'abord les principes de base du traitement numérique du signal, ou poser une question plus concrète. dspguide.com/pdfbook.htm
  • Je ne suis pas en supposant que quelque chose en particulier en ce qui concerne le filtre passe-haut mais le filtrage dans le domaine fréquentiel, je pensais que c'était clair que c'est juste un exemple. Aussi, de ne pas être "de façon habituelle" n'a pas pour effet d'invalider ma question. Tout ce que je demande est une explication quant à pourquoi je fais ces étranges distorsions après la synthèse, et ce n'est pas expliqué dans ce livre, et c'est pourquoi je pose la question ici. Je ne pense pas que cela mérite un downvote, vraiment.
  • Votre question est raisonnable, mais vos doutes sont d'ordre conceptuel et non liés à la programmation (ni même Matlab programmation), mais les principes fondamentaux de la DSP et de la DFT. Pour répondre à ça, il faut copier-coller deux ou trois chapitres de traitement numérique du signal livre.
InformationsquelleAutor Trap | 2010-05-28