2011-08-04 34 views
8

Vẫn còn trên sách Phát triển iOS BigNerdRanch.Bộ lọc thông thấp gia tốc kế

Trong chương Gia tốc kế, trước hết chúng thực hiện theo dõi gia tốc nhưng nó khá nhanh. Sau đó, họ đề nghị áp dụng một bộ lọc thông thấp với nó bằng cách thay đổi mã gốc:

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

này: Câu hỏi

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

Khá đơn giản: nơi nào họ nhận được những giá trị này từ đâu? Tôi đã tìm kiếm thông qua các tài liệu hướng dẫn và tôi thấy một cái gì đó về các bộ lọc thông thấp, điều này cho thấy đoạn mã sau:

#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. 
} 

Tuy nhiên, lần đầu tiên tôi đã cố gắng với mã đó và tôi đã nhận ra lỗi (bằng cách phân tích ứng dụng của tôi) nói 'giá trị còn lại của' * 'là giá trị rác'. Theo dõi gia tốc của tôi cũng không hoạt động.

Tôi khá bối rối về ý nghĩa của những giá trị này. Ví dụ, trong phần đầu của mã, tại sao chúng nhân các giá trị gia tốc lên 10? Để có được một phong trào 'lớn hơn'? Tôi có thể làm cho một số ý nghĩa ra khỏi đó, nhưng mã thứ hai với bộ lọc thông thấp làm cho hoàn toàn không có ý nghĩa với tôi.

+1

Tôi nghĩ lý do nhân với 10 là UIAcceleration mang lại cho bạn các giá trị trở lại trong G mà 1G là 9,81 m/s/giây. 10 là xấp xỉ 9,81. – SDJMcHattie

Trả lời

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

Điều gì xảy ra trong mã này bạn đang nhân gia tốc tại thời điểm này với hệ số lọc 0,1 và sau đó thêm vào gia tốc đã lọc lần cuối cập nhật được gọi là 0,9. Điều này là khá nhiều nhận được giá trị mới và thêm nó như là 10% của tổng số AccelX 90% khác được tạo thành từ giá trị trước đó mà phụ thuộc vào giá trị trước đó, mà phụ thuộc vào giá trị trước đó và như vậy trên. Điều này cắt ra các giá trị tần số cao vì chỉ cho phép 10% của bất kỳ thay đổi nào đi qua giá trị gia tốc mới.

Máy lọc KFilteringF 0.1 làm cho bộ lọc này cắt bỏ tất cả các tần số cao. Bạn chắc chắn sẽ muốn thử nghiệm bằng cách thay đổi giá trị này cho phù hợp với ứng dụng cụ thể của bạn.

+0

Cảm ơn bạn rất nhiều vì đã giải thích –

+0

ý nghĩa của tần suất cắt trong trường hợp này là bao nhiêu –

2

Vì bạn đang làm việc thông qua Sách Nông trại Big Nerd - một ý tưởng hay là đi đến số Book's discussion forum.

Để biết thêm thông tin, hãy xem Wikepedia article về bộ lọc thông thấp.

Và đối với một ví dụ về lọc có một cái nhìn tại AccelerometerGraph dụ của Apple

Ngoài ra - nghĩ rằng nếu bạn mất kFilteringFactor là 0.2 mang đến cho các nhân cho giá trị hiện tại là 0.8 đó là 1-0,2, và hệ số cho giá trị mới là 2.0 vì nó là 0,2 x 10

Tôi giả sử 10 là hệ số chia tỷ lệ để cung cấp các giá trị hợp lý.

+0

Cảm ơn. Tôi đã kiểm tra diễn đàn nhưng không có gì về bộ lọc thông thấp. Các bài viết wiki là quá tiên tiến đối với tôi, tôi không hiểu bất kỳ của nó .. Tôi sẽ kiểm tra ví dụ của Apple, có lẽ nó xóa mọi thứ lên. Cảm ơn một lần nữa. – cabaret

Các vấn đề liên quan