অ্যাক্সিলোমিটার ডেটার জন্য সঠিক ফিল্টারটি বাছাই করা


28

আমি ডিএসপিতে মোটামুটি নতুন, এবং পাইথনের অ্যাক্সিলোমিটার ডেটা স্মুথ করার জন্য সম্ভাব্য ফিল্টারগুলি নিয়ে কিছু গবেষণা করেছি। যে ধরণের ডেটা ইলেটের অভিজ্ঞতা গ্রহণ করছে তার একটি উদাহরণ নিম্নলিখিত চিত্রটিতে দেখা যেতে পারে:

অ্যাক্সিলোমিটার ডেটা

মূলত, আমি এই তথ্যটি শেষ পর্যন্ত বেগ এবং স্থানচ্যুতিতে রূপান্তর করতে মসৃণ করার জন্য পরামর্শের সন্ধান করছি। আমি বুঝতে পারি যে মোবাইল ফোন থেকে অ্যাক্সিলোমিটারগুলি অত্যন্ত গোলমাল।

আমি এই মুহুর্তে কলম্যান ফিল্টার ব্যবহার করতে পারি বলে মনে করি না কারণ আমি ডেটা দ্বারা উত্পাদিত গোলমালটি উল্লেখ করতে ডিভাইসটি ধরে রাখতে পারি না (আমি পড়েছি যে ডিভাইসটি ফ্ল্যাট স্থাপন করা এবং সেই পাঠগুলি থেকে শব্দটির পরিমাণ খুঁজে পাওয়া প্রয়োজনীয়?)

এফএফটি কিছু আকর্ষণীয় ফলাফল তৈরি করেছে। আমার একটি প্রচেষ্টা ছিল ত্বরণ সংকেত এফএফটি করা, তারপরে নিখুঁত এফএফটি মান 0 হওয়ার জন্য কম ফ্রিকোয়েন্সি রেন্ডার করুন Then তারপরে আমি বেগের জন্য একটি প্লট অর্জনের জন্য ওমেগা গাণিতিক এবং বিপরীত এফএফটি ব্যবহার করেছি। ফলাফলগুলি নিম্নরূপ ছিল:

ফিল্টার সংকেত

জিনিসগুলি নিয়ে যাওয়ার জন্য এটি কি ভাল উপায়? আমি সিগন্যালের সামগ্রিক গোলমাল প্রকৃতির অপসারণের চেষ্টা করছি তবে প্রায় 80 সেকেন্ডের মতো সুস্পষ্ট শৃঙ্গগুলি চিহ্নিত করা দরকার।

আমি আসল অ্যাক্সিলোমিটার ডেটাতে একটি লো পাস ফিল্টার ব্যবহার করেও ক্লান্ত হয়ে পড়েছি, যা এটি মসৃণ করার জন্য দুর্দান্ত কাজ করেছে, তবে এখান থেকে কোথায় যাব আমি সত্যিই নিশ্চিত নই। এখান থেকে কোথা থেকে যাবেন সে সম্পর্কে কোনও গাইডেন্স সত্যই সহায়ক হবে!

সম্পাদনা: কিছুটা কোড:

for i in range(len(fz)): 
    testing = (abs(Sz[i]))/Nz

    if fz[i] < 0.05:
        Sz[i]=0

Velfreq = []
Velfreqa = array(Velfreq)
Velfreqa = Sz/(2*pi*fz*1j)
Veltimed = ifft(Velfreqa)
real = Veltimed.real

সুতরাং মূলত, ive আমার অ্যাক্সিলোমিটার ডেটাতে একটি এফএফটি সঞ্চালন করে এসজেড দেয়, একটি সাধারণ ইটের প্রাচীর ফিল্টার ব্যবহার করে উচ্চতর ফ্রিকোয়েন্সিগুলি ফিল্টার করে (আমি জানি এটি আদর্শ নয়)। তারপরে ive ডেটা এর FFT এ ওমেগা গাণিতিক ব্যবহার করুন। আমার পোস্টে আমার ছবি যুক্ত করার জন্য ডেটাএজিস্টকেও অনেক ধন্যবাদ :)


ডিএসপিতে আপনাকে স্বাগতম! আপনার দ্বিতীয় ছবিতে লাল বক্ররেখা কি মূল (সবুজ) ডেটার "স্মুথড" সংস্করণ?
ফোনন

লাল বক্ররেখা (আশা!) একটি বেগ FFT থেকে উত্পন্ন বক্ররেখা ফিল্টার করার মাধ্যমে অনুসরণ ওমেগা গাণিতিক (2 * পাই দ্বারা বিভাজক দ্বারা অনুসরণ ঞ), INV দ্বারা নিম্নলিখিত। ফিট
মাইকেল এম

1
আপনি যদি কিছু করেছেন তার জন্য যদি আপনি আরও নিখুঁত গাণিতিক প্রকাশ বা সিউডোকোড অন্তর্ভুক্ত করেন তবে জিনিসগুলি কিছুটা পরিষ্কার হয়ে যাবে।
ফোনন

এখনই কিছু যুক্ত হয়েছে, কোডটির সাধারণ অনুভূতি জানায় ..
মাইকেল এম

1
আমার প্রশ্নটি হবে: আপনি ডেটাতে কী দেখতে প্রত্যাশা করবেন? ফিল্টারিংয়ের পরে আপনি যে অন্তর্নিহিত সংকেতটি দেখতে পাবেন বলে আশা করছেন তা যদি না জানেন তবে আপনার কাছে ভাল পদ্ধতি রয়েছে কিনা তা আপনি জানতে পারবেন না। এছাড়াও, আপনি যে কোডটি দেখিয়েছেন তা বিভ্রান্তিকর। যদিও আপনি fzঅ্যারের সূচনাটি দেখান না , এটি প্রদর্শিত হয় যে আপনি পরিবর্তে একটি হাইপাস ফিল্টার প্রয়োগ করছেন।
জেসন আর

উত্তর:


13

তীব্র ট্রানজিশনগুলি বজায় রাখার সময় ব্যাগ অফ ট্রিকস-এ @ জন রবার্টসনের নির্দেশিত হিসাবে , আপনার সিগন্যালটি যদি টুকটাকভাবে স্থির থাকে তবে মোট ভারিটিওন (টিভি) নিন্দা করা একটি ভাল বিকল্প। অ্যাক্সিলারমিটার ডেটার ক্ষেত্রে এটি হতে পারে, যদি আপনার সিগন্যাল বিভিন্ন মালভূমির মধ্যে পরিবর্তিত হয়।

μρ

Yএক্সμএক্স-Y2+ +ডিএক্স1ডি

function denoise()

f = [-1*ones(1000,1);3*ones(100,1);1*ones(500,1);-2*ones(800,1);0*ones(900,1)];
plot(f);
axis([1 length(f) -4 4]);
title('Original');
g = f + .25*randn(length(f),1);
figure;
plot(g,'r');
title('Noisy');
axis([1 length(f) -4 4]);
fc = denoisetv(g,.5);
figure;
plot(fc,'g');
title('De-noised');
axis([1 length(f) -4 4]);

function f = denoisetv(g,mu)
I = length(g);
u = zeros(I,1);
y = zeros(I,1);
rho = 10;

eigD = abs(fftn([-1;1],[I 1])).^2;
for k=1:100
    f = real(ifft(fft(mu*g+rho*Dt(u)-Dt(y))./(mu+rho*eigD)));
    v = D(f)+(1/rho)*y;
    u = max(abs(v)-1/rho,0).*sign(v);
    y = y - rho*(u-D(f));
end

function y = D(x)
y = [diff(x);x(1)-x(end)];

function y = Dt(x)
y = [x(end)-x(1);-diff(x)];

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


সত্যিই এই উত্তরটি পছন্দ করুন, এগিয়ে যেতে চেষ্টা করুন। এটা উত্তর দিতে আমার এতক্ষণ গ্রহণ দুঃখিত!
মাইকেল এম

দুর্দান্ত উত্তর। বিশদ জন্য ধন্যবাদ। আমি এই কোডটির সি সংস্করণটি খুঁজছি। এখানে যে কেউ এই মাতলাব কোডটি সিটিতে ভাগ করে নিতে চান তারা কি ভাগ করতে চান? ধন্যবাদ।
রিনি লিমবার্গার

টুকরা অনুসারে ধ্রুবক বলতে কী বোঝায়?
টিলাপ্রিমের

6

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

এই প্রশ্নের একটি উত্তর উইনার ফিল্টার যা আপনার গোলমালের পরিসংখ্যান এবং আপনার পছন্দসই সংকেতের জ্ঞান প্রয়োজন। মূলত, কোলাহলপূর্ণ সংকেত (সংকেত + শব্দ) আপনার ফ্রিকোয়েন্সিগুলিতে যেখানে শব্দটি আপনার সিগন্যালের চেয়েও বেশি গ্রেটার বলে আশা করা হয় এবং সেখানে আপনার সংকেতটি আপনার শব্দের চেয়ে আরও ভালতর হবে বলে ধারণা করা হয় over

যাইহোক, আমি আরও আধুনিক পদ্ধতির পরামর্শ দেব যা অ-রৈখিক প্রসেসিং ব্যবহার করে, উদাহরণস্বরূপ তরঙ্গকরণ denoising। এই পদ্ধতিগুলি দুর্দান্ত ফলাফল সরবরাহ করে। মূলত, কোলাহলপূর্ণ সংকেতটি প্রথমে তরঙ্গলেখায় বিভক্ত হয় এবং তারপরে ছোট ছোট গুণফলগুলি শূন্য হয়। ওয়েভলেটগুলির একাধিক-রেজোলিউশন প্রকৃতির কারণে এই পদ্ধতির কাজ হয় (এবং ডিএফটি কার্যকর হয় না)। অর্থাত্, তরঙ্গকরণ রূপান্তর দ্বারা সংজ্ঞায়িত ফ্রিকোয়েন্সি ব্যান্ডগুলিতে সিগন্যালটি পৃথকভাবে প্রক্রিয়া করা হয়।

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

আমি পাইথনে ভাল নই, তবে আমি বিশ্বাস করি যে আপনি কিছু নুমপি প্যাকেজ খুঁজে পেতে পারেন যা হর ওয়েভলেটকে অস্বীকার করে।


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

এটি সত্য, এবং আপনি যখন নিজের সিগন্যাল এবং আপনার গোলমালের পরিসংখ্যান জানেন তখন এটি উইনার ফিল্টার দ্বারা অর্জন করা হয়।
ড্যানিয়েল আর পিপা

তরঙ্গলেখাকে অস্বীকার করার পিছনে তত্ত্বটি জটিল হলেও বাস্তবায়নটি আপনার বর্ণিত পদ্ধতির মতোই সহজ। এটিতে কেবল ফিল্টার ব্যাংক এবং থ্রেশোল্ডিং জড়িত।
ড্যানিয়েল আর পিপা

1
আমি এখন এটি নিয়ে গবেষণা করছি, উপরে আমার অগ্রগতি পোস্ট করব, এখন পর্যন্ত আপনার সমস্ত সহায়তার জন্য আপনাকে এবং ফোনন দুজনকে ধন্যবাদ!
মাইকেল এম

@ ড্যানিয়েলপিপা আমার কাছে প্রশ্নযুক্ত মাতলাব প্যাকেজগুলিতে অ্যাক্সেস নেই। আপনি কি কোনও কাগজ বা অন্য রেফারেন্স সরবরাহ করতে পারেন যা আপনার মাতলাব কোডের সাথে সম্পর্কিত পদ্ধতিটি বর্ণনা করে।
জন রবার্টসন

0

ড্যানিয়েল পিপার পরামর্শ অনুসারে, আমি তরঙ্গপত্রকে তীব্র প্রতিপন্ন করে দেখেছি এবং ফ্রান্সিসকো ব্লাঙ্কো-সিলভা এই দুর্দান্ত নিবন্ধটি পেয়েছি ।

এখানে আমি ইমেজ প্রসেসিংয়ের জন্য 3 ডি (চিত্র) ডেটার পরিবর্তে 2 ডি (অ্যাকসিলোমিটার) দিয়ে কাজ করার জন্য তার পাইথন কোডটি পরিবর্তন করেছি।

দ্রষ্টব্য , ফ্রান্সস্কোর উদাহরণে নরম-প্রান্তিককরণের জন্য প্রান্তিকতাটি "আপ" করা হয়েছে। এটি বিবেচনা করুন এবং আপনার অ্যাপ্লিকেশনটির জন্য সংশোধন করুন।

def wavelet_denoise(data, wavelet, noise_sigma):
    '''Filter accelerometer data using wavelet denoising

    Modification of F. Blanco-Silva's code at: https://goo.gl/gOQwy5
    '''
    import numpy
    import scipy
    import pywt

    wavelet = pywt.Wavelet(wavelet)
    levels  = min(15, (numpy.floor(numpy.log2(data.shape[0]))).astype(int))

    # Francisco's code used wavedec2 for image data
    wavelet_coeffs = pywt.wavedec(data, wavelet, level=levels)
    threshold = noise_sigma*numpy.sqrt(2*numpy.log2(data.size))

    new_wavelet_coeffs = map(lambda x: pywt.threshold(x, threshold, mode='soft'),
                             wavelet_coeffs)

    return pywt.waverec(list(new_wavelet_coeffs), wavelet)

কোথায়:

  • wavelet- ব্যবহৃত তরঙ্গপত্র ফর্মের স্ট্রিং নাম (দেখুন pywt.wavelist(), উদাহরণস্বরূপ 'haar')
  • noise_sigma - ডেটা থেকে শব্দটির আদর্শ বিচ্যুতি
  • data - ফিল্টার করতে মানগুলির অ্যারে (যেমন x, y, বা z অক্ষের ডেটা)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.