2011-08-04 10 views
8

अभी भी BigNerdRanch आईओएस विकास पुस्तक पर।एक्सेलेरोमीटर कम पास फ़िल्टरिंग

एक्सेलेरोमीटर अध्याय में, वे पहले एक्सेलेरोमीटर ट्रैकिंग को लागू करते हैं लेकिन यह काफी अजीब है।

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{ 
    HypnosisView *hv = (HypnosisView *)[self view]; 

    [hv setXShift:10.0 * [acceleration x]]; 
    [hv setYShift:10.0 * [acceleration y]]; 

    [hv setNeedsDisplay]; 
} 
इस के लिए

:

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{ 
    HypnosisView *hv = (HypnosisView *)[self view]; 

    float xShift = [hv xShift] * 0.8 + [accel x] * 2.0; 
    float yShift = [hv yShift] * 0.8 + [accel y] * 2.0; 

    [hv setXShift:xShift]; 
    [hv setYShift:yShift]; 

    [hv setNeedsDisplay]; 
} 

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

#define kFilteringFactor 0.1 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration { 
    // Use a basic low-pass filter to keep only the gravity component of each axis. 
    accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)); 
    accelY = (acceleration.y * kFilteringFactor) + (accelY * (1.0 - kFilteringFactor)); 
    accelZ = (acceleration.z * kFilteringFactor) + (accelZ * (1.0 - kFilteringFactor)); 

    // Use the acceleration data. 
} 

हालांकि, मैं पहली बार है कि कोड के साथ की कोशिश की और मैं एक त्रुटि मिल गया (मेरे एप्लिकेशन का विश्लेषण करके) कह रही है '*' का बायां मान एक कचरा मूल्य है '। मेरा एक्सेलेरोमीटर ट्रैकिंग या तो काम नहीं करता था।

मैं इन मूल्यों के अर्थ के रूप में काफी उलझन में हूं। उदाहरण के लिए, कोड के पहले भाग में, वे त्वरण मानों को 10 से गुणा क्यों करते हैं? 'बड़ा' आंदोलन प्राप्त करने के लिए? मैं उसमें से कुछ समझ सकता था, लेकिन कम पास फ़िल्टर वाला दूसरा कोड मुझे बिल्कुल समझ में नहीं आता है।

+1

मुझे लगता है कि 10 से गुणा करने का कारण यह है कि यूआईसीक्लेरेशन आपको जी में मूल्य वापस देता है जो 1 जी प्रति सेकेंड 9.81 मीटर प्रति सेकंड है। 10 9.81 का अनुमान है। – SDJMcHattie

उत्तर

14
accelX = (acceleration.x * kFilteringFactor) + (accelX * (1.0 - kFilteringFactor)); 

क्या इस कोड में क्या हो रहा आप छनन कारक 0.1 से पल में त्वरण गुणा कर रहे हैं और उसके बाद पिछली बार एक अद्यतन 0.9 द्वारा बुलाया गया था के त्वरण फ़िल्टर्ड में जोड़ने।

यह बहुत अधिक नया मूल्य प्राप्त कर रहा है और इसे कुल एक्सेलक्स का 10% जोड़ रहा है, अन्य 90% पिछले मान से बना है जो इससे पहले मूल्य पर निर्भर करता है, जो इससे पहले मूल्य पर निर्भर करता है पर। यह उच्च आवृत्ति मूल्यों में कटौती करता है क्योंकि नए एक्सेलएक्स मूल्य के माध्यम से किसी भी बदलाव के 10% को जाने की अनुमति देता है।

0.1 का KFilteringFactor इस फ़िल्टर को सभी उच्च आवृत्तियों को काट देता है। आप निश्चित रूप से अपने विशेष आवेदन के अनुरूप इस मूल्य को बदलकर प्रयोग करना चाहते हैं।

+0

व्याख्या के लिए आपको बहुत धन्यवाद –

+0

इस मामले में कट ऑफ आवृत्ति का अर्थ क्या है –

2

चूंकि आप बिग नेर्ड रांच बुक के माध्यम से काम कर रहे हैं - एक अच्छा विचार Book's discussion forum पर जाना होगा।

अधिक जानकारी के लिए Wikepedia article पर कम पास फ़िल्टर के बारे में देखें।

और छानने का एक और उदाहरण के लिए

इसके अलावा एप्पल के AccelerometerGraph उदाहरण पर एक नजर है - लगता है कि अगर आप kFilteringFactor ले 0.2 जो 0.8 जो है 1 होने के लिए वर्तमान मूल्य के लिए मल्टीप्लायरों देता है होना करने के लिए - 0.2, और नए मान के लिए गुणक 2.0 है क्योंकि यह 0.2 x 10

मुझे लगता है कि 10 उचित मान देने के लिए स्केलिंग कारक है।

+0

धन्यवाद। मैंने फोरम की जांच की लेकिन कम पास फ़िल्टर के बारे में कुछ भी नहीं। विकी लेख मेरे लिए बहुत उन्नत है, मुझे इसमें से कोई भी समझ में नहीं आता .. मैं ऐप्पल के उदाहरण की जांच करूंगा, शायद यह चीजों को साफ़ करता है। एक बार फिर धन्यवाद। – cabaret

संबंधित मुद्दे