2010-08-24 24 views
5

Je prends des blocs de données entrantes et les passe à travers fftw pour obtenir quelques informations spectrales. Tout semble fonctionner, mais je pense que je reçois des problèmes d'aliasing.Implémenter Hann Window

J'ai essayé de mettre en œuvre une fenêtre hann sur mes blocs de données. Google m'a échoué pour des exemples. Des idées ou des liens que je devrais regarder?

double dataIn[2048] > /* windowing here? */ > FFT > double freqBins[2048] 

Mise à jour

Merci à Oli pour souligner la question que je suis en train d'essayer de fixer est spectrale fuite, pas aliasing ...

Répondre

13

http://en.wikipedia.org/wiki/Hann_function. La mise en œuvre découle de la définition assez simplement. Utilisez simplement la fonction w(n) comme multiplicateur, bouclez tous vos échantillons (en changeant n au fur et à mesure), et c'est tout.

for (int i = 0; i < 2048; i++) { 
    double multiplier = 0.5 * (1 - cos(2*PI*i/2047)); 
    dataOut[i] = multiplier * dataIn[i]; 
} 
2

Wikipédia est votre ami: Hanning window

Votre googling est sûrement venu avec wikipedia ?! Quoi qu'il en soit, créez simplement une fonction qui retourne un tableau de longueur N avec les coefficients de Hanning et multipliez ce tableau par votre dataIn[2048].

2

Pas une réponse à votre question, mais une réponse à votre question. Le fenêtrage aide à résoudre fuite spectrale problèmes, pas aliasing problèmes.

Les effets de fuite spectrale se produisent lorsque les composantes de fréquence de votre forme d'onde ne sont pas des sous-multiples entiers exacts de votre fréquence d'échantillonnage.

Si vous avez un aliasing, alors vous êtes fondamentalement vissé. Vous devrez soit augmenter votre taux d'échantillonnage, soit mettre un filtre anti-alias (meilleur) avant de prélever un échantillon.

2

La fonction complète qui équivaut à Matlab de hanning.m se trouvent here:

/* function w = hanning(varargin) 
% HANNING Hanning window. 
% HANNING(N) returns the N-point symmetric Hanning window in a column 
% vector. Note that the first and last zero-weighted window samples 
% are not included. 
% 
% HANNING(N,'symmetric') returns the same result as HANNING(N). 
% 
% HANNING(N,'periodic') returns the N-point periodic Hanning window, 
% and includes the first zero-weighted window sample. 
% 
% NOTE: Use the HANN function to get a Hanning window which has the 
%   first and last zero-weighted samples.ep 
    itype = 1 --> periodic 
    itype = 0 --> symmetric 
    default itype=0 (symmetric) 

    Copyright 1988-2004 The MathWorks, Inc. 
% $Revision: 1.11.4.3 $ $Date: 2007/12/14 15:05:04 $ 
*/ 

float *hanning(int N, short itype) 
{ 
    int half, i, idx, n; 
    float *w; 

    w = (float*) calloc(N, sizeof(float)); 
    memset(w, 0, N*sizeof(float)); 

    if(itype==1) //periodic function 
     n = N-1; 
    else 
     n = N; 

    if(n%2==0) 
    { 
     half = n/2; 
     for(i=0; i<half; i++) //CALC_HANNING Calculates Hanning window samples. 
      w[i] = 0.5 * (1 - cos(2*PI*(i+1)/(n+1))); 

     idx = half-1; 
     for(i=half; i<n; i++) { 
      w[i] = w[idx]; 
      idx--; 
     } 
    } 
    else 
    { 
     half = (n+1)/2; 
     for(i=0; i<half; i++) //CALC_HANNING Calculates Hanning window samples. 
      w[i] = 0.5 * (1 - cos(2*PI*(i+1)/(n+1))); 

     idx = half-2; 
     for(i=half; i<n; i++) { 
      w[i] = w[idx]; 
      idx--; 
     } 
    } 

    if(itype==1) //periodic function 
    { 
     for(i=N-1; i>=1; i--) 
      w[i] = w[i-1]; 
     w[0] = 0.0; 
    } 
    return(w); 
} 
0

Ceci est bien, mais la plupart des gens veulent probablement faire sur des milliers de tableaux pleins de données. Vous pouvez remplir un tableau de multiplicateurs constants une seule fois lors de l'initialisation de votre programme (utilisez le même tableau que vous alimentez en FFT), puis multipliez chaque point de votre tableau réel par chaque point du tableau de multiplicateurs. Plus rapide/moins cher que de reprendre tous ces cosinus à chaque fois.