2010-08-24 9 views
5

मैं आने वाले डेटा के ब्लॉक लेता हूं और कुछ वर्णक्रमीय जानकारी प्राप्त करने के लिए उन्हें fftw के माध्यम से पास करता हूं। सबकुछ काम कर रहा है, हालांकि मुझे लगता है कि मुझे कुछ अलियासिंग मुद्दे मिल रहे हैं।हन विंडो लागू करें

मैं डेटा के अपने ब्लॉक पर एक हन विंडो को कार्यान्वित करने का तरीका जानने का प्रयास कर रहा हूं। Google ने मुझे उदाहरणों के लिए विफल कर दिया है। मुझे कोई विचार या लिंक देखना चाहिए? मुद्दा मैं वास्तव में ठीक करने के लिए कोशिश कर रहा हूँ ओर इशारा करते हुए के लिए ओली को

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

अद्यतन

धन्यवाद वर्णक्रमीय-रिसाव, नहीं aliasing है ...

उत्तर

13

http://en.wikipedia.org/wiki/Hann_function। कार्यान्वयन परिभाषा से काफी सरलता से पालन करता है। w(n) फ़ंक्शन को अपने सभी नमूनों के माध्यम से गुणक के रूप में उपयोग करें (n बदलते समय), और यही वह है।

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

विकिपीडिया अपने दोस्त है: Hanning window

निश्चित रूप से आपका गुगल विकिपीडिया के साथ आया ?! वैसे भी एक ऐसा फ़ंक्शन बनाएं जो हैनिंग गुणांक के साथ लंबाई एन की एक सरणी देता है और इस सरणी को आपके dataIn[2048] से गुणा करें।

2

आपके प्रश्न का उत्तर नहीं, लेकिन आपकी समस्या पर एक तरफ। घुमाव वर्णक्रमीय रिसाव समस्याओं को हल करने में मदद करता है, aliasing समस्याएं।

स्पेक्ट्रल-रिसाव प्रभाव तब होते हैं जब आपके तरंग के आवृत्ति घटक आपके नमूना दर के सटीक पूर्णांक गुणांक नहीं होते हैं।

यदि आपके पास अलियासिंग है, तो आप मूल रूप से खराब हो गए हैं। आपको नमूना देने से पहले या तो अपनी नमूना दर बढ़ाने की आवश्यकता होगी, या एक (बेहतर) एंटी-एलाइजिंग फ़िल्टर डालना होगा।

2

पूरा समारोह है कि MATLAB के hanning.m के बराबर है 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); 
} 
3

नहीं क्यों Math.NET के हेन विंडोइंग कार्यान्वयन का उपयोग करें?

double[] hannDoubles = MathNet.Numerics.Window.HannPeriodic(dataIn.Length); 
for (int i = 0; i < dataIn.Length; i++) 
{ 
    dataOut[i] = hannDoubles[i] * dataIn[i]; 
} 

यहाँ स्थित: https://numerics.mathdotnet.com/api/MathNet.Numerics/Window.htm

0

यह ठीक है लेकिन अधिकांश लोगों को शायद आंकड़ों के पूरे सरणियों के हजारों पर ऐसा करना चाहते हैं। आप अपने प्रोग्राम के आरंभ होने के बाद केवल स्थिर गुणक की एक सरणी भर सकते हैं (उसी आकार सरणी का उपयोग करें जिसे आप एफएफटी में खिलाते हैं) तो गुणक सरणी में प्रत्येक बिंदु से बस अपने वास्तविक सरणी में प्रत्येक बिंदु को गुणा करें। हर बार फिर से उन सभी कोसाइन लेने से तेज़/सस्ता।