एक्सेलेरोमीटर डेटा के लिए सही फ़िल्टर चुनना


28

मैं डीएसपी के लिए काफी नया हूं, और अजगर में एक्सेलेरोमीटर डेटा को चौरसाई करने के लिए संभावित फिल्टर पर कुछ शोध किया है। निम्न चित्र में देखे जा सकने वाले डेटा के प्रकार का एक उदाहरण देखा जा सकता है:

एक्सेलेरोमीटर डेटा

अनिवार्य रूप से, मैं इस डेटा को सुचारू रूप से सलाह देने के लिए देख रहा हूं कि आखिरकार इसे वेग और विस्थापन में बदल दिया जाए। मैं समझता हूं कि मोबाइल फोन से एक्सेलेरोमीटर बेहद शोर है।

मुझे नहीं लगता कि मैं इस समय एक कलमन फ़िल्टर का उपयोग कर सकता हूं क्योंकि मैं डेटा द्वारा उत्पादित शोर को संदर्भित करने के लिए डिवाइस को पकड़ सकता हूं (मैंने पढ़ा कि डिवाइस को फ्लैट में रखने और उन रीडिंग से शोर की मात्रा का पता लगाने के लिए आवश्यक है?)

एफएफटी ने कुछ दिलचस्प परिणाम उत्पन्न किए हैं। मेरे प्रयासों में से एक था एफएफटी त्वरण सिग्नल, फिर निम्न आवृत्तियों को 0. का पूर्ण एफएफटी मूल्य प्रदान करना। फिर मैंने ओमेगा अंकगणित और व्युत्क्रम एफएफटी का उपयोग वेग के लिए एक भूखंड प्राप्त करने के लिए किया। परिणाम निम्नवत थे:

फ़िल्टर किया गया संकेत

क्या यह चीजों के बारे में जाने का एक अच्छा तरीका है? मैं संकेत की समग्र शोर प्रकृति को दूर करने की कोशिश कर रहा हूं, लेकिन स्पष्ट चोटियों जैसे कि लगभग 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 पर ओमेगा अंकगणित का उपयोग करें। इसके अलावा मेरी पोस्ट में मेरी छवियों को जोड़ने के लिए डेटाजिस्ट का बहुत बहुत धन्यवाद :)


DSP में आपका स्वागत है! क्या आपकी दूसरी तस्वीर में लाल वक्र मूल (हरा) डेटा का "चिकना" संस्करण है?
फोनॉन

लाल वक्र (उम्मीद है!) एक वेग से उत्पन्न वक्र है जिसे फ़िल्टर करने के बाद फ़िल्टर किया जाता है, इसके बाद ओमेगा अंकगणित (2 * pi f j से विभाजित ), आमंत्रण द्वारा पीछा किया जाता है। fft
माइकल एम

1
शायद अगर आप एक अधिक सटीक गणितीय अभिव्यक्ति या छद्मकोड को शामिल करते हैं, तो आपने जो कुछ किया है, वह थोड़ा स्पष्ट होगा।
फोनॉन

अब कुछ जोड़ा गया है, कोड का सामान्य अनुभव ..
माइकल एम

1
मेरा प्रश्न यह होगा: आप डेटा में क्या देखने की उम्मीद करते हैं? आपको पता नहीं चलेगा कि क्या आपके पास एक अच्छा तरीका है जब तक कि आपको अंतर्निहित सिग्नल के बारे में कुछ नहीं पता है जिसे आप फ़िल्टर करने के बाद देखने की उम्मीद करते हैं। इसके अलावा, आपके द्वारा दिखाया गया कोड भ्रामक है। हालाँकि आप fzसरणी के आरंभीकरण को नहीं दिखाते हैं , यह प्रतीत होता है कि आप इसके बजाय एक हाईपास फ़िल्टर लागू कर रहे हैं।
जेसन आर

जवाबों:


13

जैसा कि @JohnRobertson ने ट्रिक्स के बैग में Denoising सिग्नल के लिए बताया है जबकि शार्प ट्रांजैक्शंस को मेन्टेन करना, टोटल वैरिटोन (TV) को डिनॉइज़ करना एक और अच्छा विकल्प है अगर आपका सिग्नल पीस-वाइज कॉन्स्टेंट है। यह एक्सेलेरोमीटर डेटा के लिए मामला हो सकता है, अगर आपका सिग्नल अलग-अलग प्लैटॉक्स के बीच अलग-अलग रहता है।

μρ

yxμxy2+Dx1D

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

परिणाम:

यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें यहाँ छवि विवरण दर्ज करें


वास्तव में इस जवाब की तरह, आगे बढ़ो और यह कोशिश करो। खेद है कि मुझे उत्तर देने में इतना समय लगा!
माइकल एम।

बहुत बढ़िया जवाब। विवरण के लिए धन्यवाद। मैं इस कोड के C संस्करण की तलाश कर रहा हूं। यहाँ किसी ने भी इस matlab कोड को C में पोर्ट किया है जिसे वे साझा करना चाहेंगे? धन्यवाद।
रेने लिम्बर्गर

टुकड़ा-वार स्थिर का क्या अर्थ है?
तिलाप्रिमेरा

6

समस्या यह है कि आपके शोर में एक सपाट स्पेक्ट्रम है। यदि आप सफेद गाऊसी शोर (जो एक अच्छी धारणा है) की शक्ति मान लेते हैं तो इसकी शक्ति स्पेक्ट्रम घनत्व स्थिर है। मोटे तौर पर, इसका मतलब है कि आपके शोर में सभी आवृत्तियाँ हैं। यही कारण है कि किसी भी आवृत्ति दृष्टिकोण, जैसे डीएफटी या कम-पास फिल्टर, एक अच्छा नहीं है। स्पेक्ट्रम के बाद आपका शोर क्या है?

इस प्रश्न का एक उत्तर वीनर फ़िल्टर है, जिसे आपके शोर के आँकड़ों और आपके वांछित संकेत के ज्ञान की आवश्यकता होती है। मूल रूप से, शोर संकेत (सिग्नल + शोर) को उन आवृत्तियों पर देखा जाता है जहां शोर आपके सिग्नल की तुलना में ग्रेटर होने की उम्मीद है, और यह प्रवर्धित है जहां आपके सिग्नल को आपके शोर से ग्रेटर होने की उम्मीद है।

हालांकि, मैं और अधिक आधुनिक दृष्टिकोणों का सुझाव दूंगा जो गैर-रेखीय प्रसंस्करण का उपयोग करते हैं, उदाहरण के लिए वेवलेट डेनिओजिंग। ये विधियां उत्कृष्ट परिणाम प्रदान करती हैं। असल में, शोर का संकेत पहले तरंगिकाओं में विघटित होता है और फिर छोटे गुणांक शून्य हो जाते हैं। यह दृष्टिकोण तरंगों के बहु-रिज़ॉल्यूशन प्रकृति के कारण काम करता है (और DFT नहीं करता है)। यही है, सिग्नल को तरंगिका परिवर्तन द्वारा परिभाषित आवृत्ति बैंड में अलग से संसाधित किया जाता है।

MATLAB में, 'wavemenu' और फिर 'SWT को 1-D' टाइप करें। फिर 'फाइल', 'उदाहरण विश्लेषण', 'शोर संकेत', 'हार के साथ स्तर 5, शोर ब्लॉकों' पर। यह उदाहरण Haar wavelet का उपयोग करता है, जिसे आपकी समस्या के लिए ठीक काम करना चाहिए।

मैं पायथन में अच्छा नहीं हूं, लेकिन मेरा मानना ​​है कि आप कुछ न्यूमपाइप पैकेज पा सकते हैं, जो हर वेवलेट को प्रदर्शित करते हैं।


1
मैं आपके पहले बयान से असहमत होऊंगा। आप मान रहे हैं कि ब्याज का संकेत इनपुट अनुक्रम की पूर्ण बैंडविड्थ को कवर करता है, जो कि संभावना नहीं है। इस मामले में रैखिक फ़िल्टरिंग का उपयोग करके बेहतर सिग्नल-टू-शोर अनुपात प्राप्त करना अभी भी संभव है, आउट-ऑफ-बैंड शोर को समाप्त करना। यदि सिग्नल अत्यधिक ओवरसम्पल्ड है, तो आप इस तरह के एक सरल दृष्टिकोण के साथ एक बड़ा सुधार प्राप्त कर सकते हैं।
जेसन आर

यह सच है, और यह वीनर फ़िल्टर द्वारा प्राप्त किया जाता है, जब आप अपने सिग्नल और आपके शोर के आंकड़े जानते हैं।
डैनियल आर। पीपा

यद्यपि तरंगिका को अस्वीकार करने के पीछे का सिद्धांत जटिल है, कार्यान्वयन आपके द्वारा वर्णित दृष्टिकोण जितना सरल है। इसमें केवल फ़िल्टर बैंक और थ्रॉल्डिंग शामिल हैं।
डैनियल आर। पीपा

1
अब में इस पर शोध कर रहा हूँ, मेरी प्रगति को ऊपर पोस्ट करेंगे, अब तक आपकी और आपकी मदद के लिए फोनन दोनों का धन्यवाद!
माइकल एम

@DanielPipa मैं सवाल में matlab संकुल तक पहुँच नहीं है। क्या आप एक पेपर या अन्य संदर्भ प्रदान कर सकते हैं जो आपके मैटलैब कोड से मेल खाती विधि का वर्णन करता है।
जॉन रॉबर्टसन

0

डैनियल पीपा के सुझाव के अनुसार, मैंने तरंगिका पर एक नज़र डाली और इस उत्कृष्ट लेख को फ्रांसिस्को ब्लैंको-सिल्वा ने पाया ।

यहाँ मैंने 3D (छवि) डेटा के बजाय 2D (एक्सेलेरोमीटर) के साथ काम करने के लिए इमेज प्रोसेसिंग के लिए उसका पायथन कोड संशोधित किया है।

ध्यान दें , थ्रेशोल्ड को "थ्रू" बनाया जाता है जो कि सॉफ्ट-थ्रॉल्डिंग के लिए फ्रांसिस्को के उदाहरण में दिया गया है। इस पर विचार करें और अपने आवेदन के लिए संशोधित करें।

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 अक्ष डेटा)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.