سؤال

أتناول كتل من البيانات الواردة وأمرها عبر FFTW للحصول على بعض المعلومات الطيفية. يبدو أن كل شيء يعمل ، لكنني أعتقد أنني أتلقى بعض المشكلات المتعرج.

لقد كنت أحاول معرفة كيفية تنفيذ نافذة هان على كتل البيانات الخاصة بي. لقد فشلت Google في أمثلة. أي أفكار أو روابط يجب أن أنظر إليها؟

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

تحديث

بفضل Oli على الإشارة إلى القضية التي أحاول إصلاحها فعليًا هي تسرب الطيفي ، وليس التعرج ...

هل كانت مفيدة؟

المحلول

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];
}

نصائح أخرى

لماذا لا تستخدم تنفيذ Math.net's Hann Windowing؟

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

ويكيبيديا صديقك: نافذة هانينغ

من المؤكد أن غوغلينغ توصلت إلى ويكيبيديا؟! على أي حال ، فقط قم بإنشاء وظيفة تُرجع مجموعة من الطول n مع معاملات hanning وضرب هذه الصفيف بواسطة الخاص بك dataIn[2048].

ليس إجابة على سؤالك ، ولكن جانبا لمشكلتك. Windowing يساعد في حل تسرب طيفي المشاكل ، لا اسم مستعار مشاكل.

تحدث تأثيرات التسرب الطيفي عندما لا تكون مكونات التردد في شكل الموجة الخاصة بك غير محددة من الأدوات الفرعية الصحيح لمعدل العينة الخاص بك.

إذا كنت تعاني من التعاون ، فأنت مشدود بشكل أساسي. ستحتاج إما إلى زيادة معدل العينة الخاص بك ، أو وضع مرشح (أفضل) مضاد للتسجيل قبل عينة.

الوظيفة الكاملة المكافئة لـ Matlab's hanning.m يمكن ايجاده هنا:

/*  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);
}

هذا جيد ولكن ربما يرغب معظم الناس في القيام بذلك على الآلاف من المصفوفات المليئة بالبيانات. يمكنك ملء مجموعة من مضاعفات ثابتة مرة واحدة مع تهيئة البرنامج (استخدم نفس الحجم الذي تغذيه إلى FFT) ثم اضرب كل نقطة في صفيفك الحقيقي بكل نقطة في صفيف المضاعف. أسرع/أرخص من أخذ كل تلك الجسبات مرة أخرى في كل مرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top