Bộ lọc thông thấp của FAN trong bối cảnh phi EE, bối cảnh API phần mềm


12

Tôi là một kỹ sư phần mềm có kinh nghiệm và đang làm việc trên các cảm biến điện thoại thông minh. Tôi đã tham gia các lớp EE cơ bản về DSP và đang cố gắng áp dụng kiến ​​thức của mình. Tôi tin rằng tôi hiểu tích chập, hàm truyền, biến đổi z, v.v. Tôi biết một chút về bộ lọc FIR và IIR.

Bây giờ, khi đọc qua tài liệu và API phần mềm, tôi thấy mọi người đang áp dụng LPF cho dữ liệu cảm biến trong miền thời gian. Tôi biết rằng bạn làm điều đó thông qua việc sử dụng các phương trình sai khác (ví dụ y [i] = y [i-1] + 2 * x [i]), nhưng tôi đã học được trong lớp EE của mình rằng LPF thường được áp dụng thông qua hoạt động tích chập trong đó bạn kết hợp tín hiệu thời gian với các hệ số của sóng chân (ví dụ) và với tần số cắt cụ thể. Vì vậy, việc sử dụng thông thường của "bộ lọc thông thấp" là không đủ chính xác đối với tôi.

Ví dụ: API Google Android có tài liệu này: http://developer.android.com/reference/android/hardware/SensorEvent.html#values

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }

Làm cách nào để diễn giải bộ lọc thông thấp đó? Tần số cắt là gì? Băng thông chuyển tiếp là gì? Có phải họ đang sử dụng LPF này chỉ để làm trung bình?


thật tốt, điều đó cũng làm phiền tôi
Đánh bạc Sibbs

Câu trả lời:


11

Bộ lọc trong ví dụ của bạn là bộ lọc đáp ứng xung vô hạn thứ nhất (IIR) . Chức năng chuyển của nó là:

H(z)= =1-α1-αz-1

tương ứng với một phương trình khác biệt của:

y[n]= =αy[n-1]+(1-α)x[n]

trong đó là đầu vào bộ lọc và y [ n ] là đầu ra bộ lọc.x[n]y[n]

Loại bộ lọc này thường được sử dụng làm bộ lọc thông thấp có độ phức tạp thấp và thường được gọi là bộ tích hợp rò rỉ . Nó được ưa chuộng vì thực hiện đơn giản, độ phức tạp tính toán thấp và khả năng điều chỉnh của nó: tần số cắt của nó phụ thuộc vào giá trị của . α có thể nhận các giá trị trong khoảng [ 0 , 1 ) . α = 0 mang lại không lọc gì cả (đầu ra bằng với đầu vào); khi tăng α , tần số cắt của bộ lọc giảm. Bạn có thể nghĩ về α = 1 như một trường hợp biên trong đó tần số cắt là vô cùng thấp (đầu ra của bộ lọc bằng 0 cho mọi thời điểm).αα[0,1)α= =0αα= =1

Bạn có thể nghĩ về điều này bằng trực giác bằng cách nhận thấy rằng đầu vào bộ lọc được tính trọng số bởi , do đó khi tham số tăng, đại lượng 1 - α giảm, do đó mỗi mẫu đầu vào có hiệu ứng tỷ lệ nhỏ hơn trên giá trị của bất kỳ mẫu đầu ra cụ thể nào. Điều này có tác dụng làm mờ đi phản ứng thúc đẩy của bộ lọc trong một khoảng thời gian dài hơn. Tổng kết trong một khoảng thời gian dài tương tự như tính toán một đường trung bình dài. Khi chiều dài của trung bình di chuyển tăng, tần số cắt của trung bình giảm.α1-α

Ví dụ của bạn, trong đó , đáp ứng tần số của bộ lọc như sau: α= =0,8nhập mô tả hình ảnh ở đây

Từ ví dụ, tôi đoán rằng bộ lọc này đang được sử dụng để loại bỏ nhiễu tần số cao ra khỏi chuỗi các phép đo thời gian từ một cảm biến, cố gắng đưa ra tín hiệu quan tâm tần số tương đối thấp. Đây sẽ là một ứng dụng rất điển hình cho loại bộ lọc này.

Đối với câu hỏi phụ khác của bạn, bạn chính xác rằng việc lọc thường được thực hiện thông qua tích hợp tín hiệu đầu vào với đáp ứng xung của bộ lọc. Trong hầu hết các trường hợp, điều này chỉ được thực hiện với các bộ lọc đáp ứng xung hữu hạn (FIR) . Các bộ lọc IIR như bộ lọc này thường được triển khai bằng phương trình sai phân của bộ lọc; do đáp ứng xung của hệ thống IIR là vô cùng dài, bạn phải cắt nó đến một độ dài hữu hạn để thực hiện tích chập với nó có thể kéo được, tại thời điểm đó, bộ lọc không còn là IIR. Định dạng phương trình sai khác hầu như luôn rẻ hơn để thực hiện tính toán, mặc dù phản hồi vốn có trong cấu trúc đó có thể dẫn đến các vấn đề về số phải được giải quyết (chẳng hạn như tràn nội bộ và tích lũy lỗi vòng).


Cảm ơn! Một số câu hỏi tiếp theo: (1) Bạn đã nói phương trình H (z) = ... là một phương trình khác biệt; Nó thực sự là một chức năng chuyển, phải không? Tôi nghĩ rằng một phương trình khác biệt là đúng cho miền thời gian. (2) Trong tích hợp rò rỉ của bạn, 1.0 có tương ứng với lấy mẫu_frequency / 2 (như trong Matlab) không? (3) Về FIR so với IIR, tôi có hiểu đúng rằng phương trình sai phân IIR có thể được áp dụng trong O (N) nhưng tích chập là O (N ^ 2) hoặc O (N lgN) với tích chập dựa trên FFT không? (4) Bạn có thể giới thiệu một cuốn sách cho các lập trình viên phần mềm để thực hiện các ý tưởng DSP này không? Giống như những gì ví dụ mã Android đang làm.
stackoverflowuser2010

π+πÔi(N)NN

Tôi biết rằng (i) áp dụng phương trình sai khác là O (N). Nhưng tôi nghĩ rằng (ii) hoạt động tích chập sử dụng phép tính tổng trên bội số và thêm (songho.ca/dsp/convolution/convolution.html) là O (N ^ 2) hoặc O (N lgN) với triển khai dựa trên FFT . Trong mọi trường hợp, N là thứ tự bộ lọc - trong đó tôi giả sử thứ tự bộ lọc và độ dài tín hiệu thời gian là cùng một thứ tự cường độ (ví dụ: cả 256). Vì vậy, không (i) và (ii) khác nhau? Ngoài ra, tôi đã thấy cuốn sách Lyons trên Amazon.com, nhưng tôi đã hy vọng về một cái gì đó được viết nhiều hơn cho các lập trình viên phần mềm C / Java.
stackoverflowuser2010

1
Ôi(N) NÔi(N2)MNÔi(MN)MN
Jason R

Ôi(M×(N+M))TôiNÔi(N2)Ôi(NM)
stackoverflowuser2010

2

Tóm lại, các bộ lọc IIR dựa trên các mô hình vật lý lý tưởng đơn giản, chẳng hạn như bộ lọc RC, có một số lượng cực nhỏ và số không, và do đó thường được thực hiện như một phương trình khác biệt, vì một số lượng cực nhỏ hoặc số không ngụ ý rất ít hoạt động số học trên mỗi mẫu sử dụng một phương trình khác nhau.

Vì IIR ngụ ý đáp ứng xung dài vô hạn, tích chập sẽ yêu cầu mãi mãi để tính toán hoặc sử dụng phép tính gần đúng.

Các bộ lọc FIR thường được thực hiện bằng tích chập với đáp ứng xung có độ dài hữu hạn (hoặc bằng tích chập nhanh FFT nếu bộ lọc đủ dài để điều đó có hiệu quả tính toán). Các loại bộ lọc này thường được sử dụng nhiều hơn khi người ta có thể tính gần đúng thông số đáp ứng tần số mong muốn với đáp ứng xung có độ dài hữu hạn, thay vì biết vị trí của các cực và mặt phẳng Z có thể nằm ở đâu.

Tuy nhiên, do bộ lọc có thông số kỹ thuật sắc nét ngụ ý tích chập FIR dài, việc triển khai bộ lọc FIR có thể chậm hơn rất nhiều và thiết lập có thể liên quan đến nhiều dòng mã hơn, đó có thể là lý do tại sao bộ lọc FIR có thể không được sử dụng thường xuyên trong phần mềm đơn giản ví dụ.


0

Tôi thấy mình trở lại bài này hết lần này đến lần khác. Cảm ơn bạn đã đặt câu hỏi. Đây là một triển khai tuyệt vời, thân thiện với máy tính của bộ tích hợp rò rỉ trong C (dành cho vi điều khiển).

Đầu tiên, một số sắp xếp lại: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

nếu chúng tôi giới hạn α là khoảng 12%, 25%, 50%, (1/8, 1/4, 1/2, ...). Chúng ta có thể tận dụng một số dịch chuyển bit hiệu quả. Lấy trường hợp là 1/8, 8 => 2 ^ 3 => (giảm 3 lần)

= (x - y_last) / 8 + y_last

#define SMOOTHING_FACTOR       (3)

int16_t FilterSample(int16_t new_sample)
{
  static int16_t last_result = 0;

  // Each bit shift down is equivalent to dividing-by-two
  last_result = (new_sample - last_result) >> SMOOTHING_FACTOR) + last_result;

  return last_result;
}

Hy vọng nó giúp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.