সমতুল্য ডেটা না হওয়ার জন্য সাভিটস্কি-গোলে স্মুথিং ফিল্টার


16

আমার কাছে একটি সিগন্যাল রয়েছে যা 100Hz এ পরিমাপ করা হয় এবং এই সংকেতটিতে আমার সাভিটস্কি-গোলে স্মুথিং ফিল্টারটি প্রয়োগ করা দরকার। তবে কাছাকাছি পরিদর্শনে আমার সংকেত পুরোপুরি ধ্রুবক হারে পরিমাপ করা হয় না, পরিমাপের মধ্যে ব-দ্বীপটি 9.7 থেকে 10.3 এমএসের মধ্যে রয়েছে between

একইভাবে ব্যবধানযুক্ত ডেটাতে সাভিটস্কি-গোলে ফিল্টারটি ব্যবহার করার কোনও উপায় আছে কি? আমি প্রয়োগ করতে পারে যে অন্যান্য পদ্ধতি আছে?


১৯৯১ সালে গরির একটি গবেষণাপত্রটি হুবহু এই সঠিক বিষয়টি ডেটাডপিএফ.২ . তবে টিএলডিআর, ডেটাজেস্টের উত্তরটি সঠিক মূল ধারণা (স্থানীয় সর্বনিম্ন-স্কোয়ার)। গৌরি যা পর্যবেক্ষণ করে তা হল যে সহগগুলি কেবল স্বাধীন ভেরিয়েবলের উপর নির্ভর করে এবং নির্ভরশীল ভেরিয়েবলগুলিতে লিনিয়ার থাকে (যেমন স্যাভিটস্কি-গোলে)। তারপরে তিনি সেগুলি গণনা করার জন্য একটি উপায় দেন তবে আপনি যদি অনুকূলিত লাইব্রেরি না লিখেন তবে কোনও পুরানো স্বল্প স্কোয়ারের ফিটার ব্যবহার করা যেতে পারে।
ডেভ প্রিচার্ড

উত্তর:


5

একটি পদ্ধতি হ'ল আপনার ডেটা পুনরায় নমুনা করা যাতে এটি সমানভাবে ব্যবধানযুক্ত হয়, তবে আপনি যা পছন্দসই প্রসেসিং করতে পারেন। লিনিয়ার ফিল্টারিং ব্যবহার করে ব্যান্ডিলিটেড রিস্যাম্পলিং কোনও ভাল বিকল্প হতে পারে না কারণ ডেটা অভিন্নভাবে ব্যবধানে নেই, সুতরাং অন্তর্নিহিত সংকেতের মানগুলি "নির্ভুল" এ কী আছে তা অনুমান করার জন্য আপনি একাধিক স্থানীয় বহুভিত্তিক ইন্টারপোলেশন (উদাহরণস্বরূপ ঘন স্প্লাইন) ব্যবহার করতে পারেন you 10-মিলিসেকেন্ড অন্তর।


আমি এই সমাধানটি একটি সর্বশেষ উপায় হিসাবে মনে রেখেছিলাম। আমি ভাবছি যে শেষ পর্যন্ত এই পদ্ধতিরটি কেবলমাত্র ধরে নিচ্ছি না যে আমার সংকেতটি একটি স্থির হারে পরিমাপ করা হয় than
ভিএলসি

আমি মনে করি এটি অ-সমানভাবে নমুনাযুক্ত হয়ে গেলেও আপনি এখনও সিংক () ইন্টারপোলেশন (বা এএ ভিন্ন ভিন্ন নমুনাযুক্ত লো পাস ফিল্টার) ব্যবহার করতে পারেন। এটি কোনও স্প্লিন বা একটি চিপ
হিলমার

1
@ হিলমার: আপনি ঠিক বলেছেন। আপনি ডেটা পুনরায় নমুনা করতে পারেন বিভিন্ন উপায়; আনুমানিক সংশ্লেষ বিহীনতা ব্যান্ডলিমিটেড রিম্যাপলিংয়ের জন্য "আদর্শ" পদ্ধতি হবে।
জেসন আর

15

সাভিৎস্কি-গোলে ফিল্টারটি যেভাবে উত্পাদিত হয়েছে (যেমন স্থানীয় সর্বনিম্ন-স্কোয়ারগুলি বহুপদী ফিট হিসাবে), সেখানে নন ইউনিফর্ম স্যাম্পলিংয়ের একটি প্রাকৃতিক জেনারালাইজেশন রয়েছে - এটি কেবল কম্পিউটারের চেয়ে ব্যয়বহুল।

সাধারণভাবে সাভিটস্কি-গোলে ফিল্টার

স্ট্যান্ডার্ড ফিল্টারটির জন্য, ধারণাটি স্থানীয় স্যাম্পলগুলির [একটি সর্বনিম্ন স্কোয়ার ব্যবহার করে] বহুবর্ষের সাথে মাপসই করা হবে, তারপরে কেন্দ্রের নমুনাটিকে কেন্দ্রের সূচীতে বহিরাগতের মানের সাথে প্রতিস্থাপন করুন (অর্থাত্ 0 এ)। তার মানে নমুনা ইঙ্গিতগুলির ভ্যান্ডারমনডে ম্যাট্রিক্সকে উল্টিয়ে স্ট্যান্ডার্ড এসজি ফিল্টার সহগগুলি তৈরি করা যায়। উদাহরণস্বরূপ, পাঁচটি নমুনা (স্থানীয় সূত্রের সাথে -2, -1,0,1,2) জুড়ে স্থানীয় প্যারাবলিক ফিট উত্পন্ন করতে ডিজাইন সমীকরণগুলির সিস্টেম A c = y নিম্নরূপ হবে:y0y4Ac=y

[202122101112000102101112202122][c0c1c2]=[y0y1y2y3y4].

উপরের দিকে, হ'ল নূন্যতম বর্গাকার বহুবর্ষ c 0 + c 1 x + c 2 x 2 এর অজানা সহগ । যেহেতু x = 0 এ বহুপথের মান কেবল সি 0 , তাই ডিজাইনের ম্যাট্রিক্সের সিউডোয়েন্টারস (যেমন সি = ( টি) - 1টি ওয়াই ) গণনা করলে শীর্ষ সারিতে এসজি ফিল্টার সহগের ফল পাওয়া যাবে। এই ক্ষেত্রে, তারা হবেc0c2c0+c1x+c2x2x=0c0c=(ATA)1ATy 

[c0c1c2]=[312171237404753535][y0y1y2y3y4].

লক্ষ্য করুন ডেরিভেটিভ যেহেতু হয় 1 + + 2 2 এক্স , ম্যাট্রিক্স (যা মূল্যায়ণ দ্বিতীয় সারি 1 ) একটি মসৃণ ব্যুৎপন্ন ফিল্টার হবে। একই যুক্তি ধারাবাহিক সারিগুলির জন্য প্রযোজ্য - তারা উচ্চতর অর্ডার ডেরিভেটিভগুলি স্মুথ দেয়। নোট করুন যে আমি ম্যাট্রিক্সটি 35 দ্বারা স্কেল করেছি সুতরাং প্রথম সারিতে উইকিপিডিয়ায় দেওয়া উপরের স্মুথিং কোফিয়েনটিসের সাথে মেলে (উপরে)। ডেরাইভেটিভ ফিল্টারগুলি অন্য স্কেলিংয়ের কারণে পৃথক হয়।c0+c1x+c2x2c1+2c2xc1

নন ইউনিফর্ম নমুনা

যখন নমুনাগুলি সমানভাবে ব্যবধানে করা হয়, ফিল্টার সহগগুলি অনুবাদ-আক্রমণকারী হয়, সুতরাং ফলাফলটি কেবল একটি এফআইআর ফিল্টার। নন-ইউনিফর্ম নমুনাগুলির জন্য, স্থানীয় নমুনা ব্যবধানের উপর ভিত্তি করে সহগগুলি পৃথক হবে, সুতরাং নকশার ম্যাট্রিক্স প্রতিটি নমুনায় নির্মিত এবং উল্টানো প্রয়োজন। যদি অযৌক্তিক নমুনার সময়গুলি এবং আমরা প্রতিটি কেন্দ্রের নমুনা সময় 0 এর সাথে স্থির করে স্থানীয় স্থানাঙ্ক টি এন তৈরি করি , অর্থাৎxntn0

t2=x2x0t1=x1x0t0=x0x0t1=x1x0t2=x2x0

তারপরে প্রতিটি ডিজাইনের ম্যাট্রিক্স নিম্নলিখিত ফর্মের হবে:

A=[t20t21t22t10t11t12t00t01t02t10t11t12t20t21t22]=[1t2t221t1t121001t1t121t2t22].

A c0


এটি O (লগ (এন)) থেকে ও (n ^ 2) এ চলে যাওয়ার মতো শোনাচ্ছে।
এনগ্রিস্টুডেন্ট - মনিকা

এখানে উপরের দিকে ডেটাজিস্ট দ্বারা বর্ণিত স্কালার একটি বাস্তবায়ন রয়েছে।
মিডিয়াম কোর

1
@ মিডিয়ামকোর আপনি নিজের মূল পোস্টে একটি লিঙ্ক যুক্ত করেন নি। এছাড়াও, আমি এটিকে মুছে ফেলেছি কারণ এটি প্রশ্নের কোনও উত্তর দেয় না। একটি লিঙ্ক যুক্ত করতে দয়া করে ডেটাজেস্টের পোস্ট সম্পাদনা করার চেষ্টা করুন; এটি পর্যালোচনা পরে সংযত করা হবে।
পিটার কে।

4


fNN/2

(ডেরাইভেশন কারও?)


±N/2tt
tii


1

আমি জানতে পেরেছি যে মতলব-এ স্যাভিটস্কি-গোলে অ্যালগরিদম ব্যবহারের দুটি উপায় রয়েছে। একবার ফিল্টার হিসাবে এবং একবার স্মুথিং ফাংশন হিসাবে, তবে মূলত তাদের একই করা উচিত।

  1. yy = sgolayfilt (y, k, f): এখানে, y = y (x) এর মানগুলি x তে সমান দূরত্ব হিসাবে ধরে নেওয়া হবে।
  2. yy = মসৃণ (x, y, স্প্যান, 'স্বগোলে', ডিগ্রি): এখানে আপনার অতিরিক্ত ইনপুট হিসাবে এক্স থাকতে পারে এবং মতলব সহায়তা x উল্লেখ করে সমান ব্যবধানে থাকতে হবে না!

0

যদি এটি কোনও সহায়তা করে থাকে তবে আমি ডেটাজিস্ট দ্বারা বর্ণিত পদ্ধতিটির সি প্রয়োগকরণ করেছি। আপনার নিজের ঝুঁকিতে বিনামূল্যে ব্যবহার করুন।

/**
 * @brief smooth_nonuniform
 * Implements the method described in  /signals/1676/savitzky-golay-smoothing-filter-for-not-equally-spaced-data
 * free to use at the user's risk
 * @param n the half size of the smoothing sample, e.g. n=2 for smoothing over 5 points
 * @param the degree of the local polynomial fit, e.g. deg=2 for a parabolic fit
 */
bool smooth_nonuniform(uint deg, uint n, std::vector<double>const &x, std::vector<double> const &y, std::vector<double>&ysm)
{
    if(x.size()!=y.size()) return false; // don't even try
    if(x.size()<=2*n)      return false; // not enough data to start the smoothing process
//    if(2*n+1<=deg+1)       return false; // need at least deg+1 points to make the polynomial

    int m = 2*n+1; // the size of the filter window
    int o = deg+1; // the smoothing order

    std::vector<double> A(m*o);         memset(A.data(),   0, m*o*sizeof(double));
    std::vector<double> tA(m*o);        memset(tA.data(),  0, m*o*sizeof(double));
    std::vector<double> tAA(o*o);       memset(tAA.data(), 0, o*o*sizeof(double));

    std::vector<double> t(m);           memset(t.data(),   0, m*  sizeof(double));
    std::vector<double> c(o);           memset(c.data(),   0, o*  sizeof(double));

    // do not smooth start and end data
    int sz = y.size();
    ysm.resize(sz);           memset(ysm.data(), 0,sz*sizeof(double));
    for(uint i=0; i<n; i++)
    {
        ysm[i]=y[i];
        ysm[sz-i-1] = y[sz-i-1];
    }

    // start smoothing
    for(uint i=n; i<x.size()-n; i++)
    {
        // make A and tA
        for(int j=0; j<m; j++)
        {
            t[j] = x[i+j-n] - x[i];
        }
        for(int j=0; j<m; j++)
        {
            double r = 1.0;
            for(int k=0; k<o; k++)
            {
                A[j*o+k] = r;
                tA[k*m+j] = r;
                r *= t[j];
            }
        }

        // make tA.A
        matMult(tA.data(), A.data(), tAA.data(), o, m, o);

        // make (tA.A)-¹ in place
        if (o==3)
        {
            if(!invert33(tAA.data())) return false;
        }
        else if(o==4)
        {
            if(!invert44(tAA.data())) return false;
        }
        else
        {
            if(!inverseMatrixLapack(o, tAA.data())) return false;
        }

        // make (tA.A)-¹.tA
        matMult(tAA.data(), tA.data(), A.data(), o, o, m); // re-uses memory allocated for matrix A

        // compute the polynomial's value at the center of the sample
        ysm[i] = 0.0;
        for(int j=0; j<m; j++)
        {
            ysm[i] += A[j]*y[i+j-n];
        }
    }

    std::cout << "      x       y       y_smoothed" << std::endl;
    for(uint i=0; i<x.size(); i++) std::cout << "   " << x[i] << "   " << y[i]  << "   "<< ysm[i] << std::endl;

    return true;
}

smoothing

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.