“ ตัวกรองสัญญาณความถี่ต่ำ” ในบริบทของซอฟต์แวร์ที่ไม่ใช่ EE


12

ฉันเป็นวิศวกรซอฟต์แวร์ที่มีประสบการณ์และกำลังทำงานกับเซ็นเซอร์ของสมาร์ทโฟน ฉันใช้คลาส EE พื้นฐานใน DSP และพยายามใช้ความรู้ของฉัน ฉันเชื่อว่าฉันเข้าใจการแปลงฟังก์ชั่นถ่ายโอนการแปลง z เป็นต้นฉันรู้เล็กน้อยเกี่ยวกับตัวกรอง FIR และ IIR

ตอนนี้เมื่ออ่าน API ของซอฟต์แวร์และเอกสารฉันเห็นผู้คนกำลังใช้ LPF กับข้อมูลเซ็นเซอร์ในโดเมนเวลา ฉันรู้ว่าคุณทำอย่างนั้นผ่านการใช้สมการความแตกต่าง (เช่น y [i] = y [i-1] + 2 * x [i]) แต่ฉันเรียนรู้ในชั้นเรียน EE ของฉันที่ LPF มักจะนำมาใช้ผ่านการดำเนินการสังวัตนา โดยที่คุณสามารถสังเกตุสัญญาณเวลาด้วยค่าสัมประสิทธิ์ของคลื่น sinc (ตัวอย่าง) และมีความถี่ตัดเฉพาะ ดังนั้นการใช้งานภาษาพูดของ "ตัวกรองความถี่ต่ำ" จึงไม่แน่นอนสำหรับฉัน

ตัวอย่างเช่น Google Android API มีเอกสารนี้: 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];
 }

ฉันจะตีความตัวกรองความถี่ต่ำได้อย่างไร ความถี่ตัดคืออะไร แบนด์วิดธ์การเปลี่ยนแปลงคืออะไร? พวกเขาใช้ LPF นี้เพื่อทำการหาค่าเฉลี่ยหรือไม่


มันเป็นการรบกวนจิตใจฉันเช่นกัน
การพนัน Sibbs

คำตอบ:


11

ตัวกรองในตัวอย่างของคุณเป็นตัวกรองการตอบสนองต่อแรงกระตุ้นไม่มีที่สิ้นสุดอันดับแรก(IIR) ฟังก์ชั่นการถ่ายโอนมันคือ:

H(z)=1α1αz1

ซึ่งสอดคล้องกับสมการความแตกต่างของ:

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

โดยที่เป็นอินพุตตัวกรองและเป็นเอาต์พุตตัวกรองx[n]y[n]

ตัวกรองประเภทนี้มักจะใช้เป็นตัวกรองต่ำซับซ้อน lowpass และมักจะเรียกว่าบูรณาการรั่ว มันเป็นที่ชื่นชอบเนื่องจากการดำเนินงานของง่ายซับซ้อนในการคำนวณต่ำและ tunability ของ: ตัดความถี่ของมันขึ้นอยู่กับค่าของ\สามารถใช้ในค่าในช่วง[0,1)ไม่มีการกรองเลย (ผลลัพธ์เท่ากับอินพุต); เมื่อเพิ่มขึ้นความถี่ตัดของตัวกรองจะลดลง คุณสามารถนึกถึงเป็นกรณีขอบเขตซึ่งความถี่การตัดต่ำเหลือไม่สิ้นสุด (เอาต์พุตตัวกรองเป็นศูนย์ตลอดเวลา)αα[0,1)α=0αα=1

คุณสามารถนึกถึงเรื่องนี้โดยสังหรณ์ใจโดยสังเกตว่าอินพุตของตัวกรองนั้นมีน้ำหนักโดยดังนั้นเมื่อพารามิเตอร์เพิ่มขึ้นปริมาณลดลงดังนั้นตัวอย่างอินพุตแต่ละตัวจะมีผลต่อสัดส่วนที่เล็กกว่ากับค่าของตัวอย่างผลลัพธ์ใด ๆ นี่เป็นผลของการละเลงการตอบสนองของแรงกระตุ้นของตัวกรองในระยะเวลานานขึ้น การรวมเป็นระยะเวลานานจะคล้ายกับการคำนวณค่าเฉลี่ยเคลื่อนที่เป็นเวลานาน เมื่อความยาวของค่าเฉลี่ยเคลื่อนที่เพิ่มขึ้นความถี่ตัดของค่าเฉลี่ยจะลดลงα1α

สำหรับตัวอย่างของคุณโดยที่การตอบสนองความถี่ของตัวกรองจะเป็นดังนี้: α=0.8ป้อนคำอธิบายรูปภาพที่นี่

จากตัวอย่างฉันจะเดาว่าตัวกรองนี้ถูกใช้เพื่อขจัดสัญญาณรบกวนความถี่สูงที่ราบรื่นจากชุดการวัดเวลาจากเซ็นเซอร์พยายามหยอกล้อสัญญาณความถี่ต่ำที่น่าสนใจ นี่จะเป็นแอปพลิเคชันทั่วไปสำหรับตัวกรองประเภทนี้

ในคำถามย่อยอื่น ๆ ของคุณคุณถูกต้องแล้วว่าการกรองนั้นมักจะถูกนำไปใช้ผ่านการแปลงสัญญาณอินพุตด้วยการตอบสนองแบบอิมพัลส์ของตัวกรอง ในกรณีส่วนใหญ่จะทำเฉพาะกับตัวกรองการตอบสนองต่อแรงกระตุ้น จำกัด (FIR)เท่านั้น ตัวกรอง IIR เช่นนี้มักใช้งานโดยใช้สมการความแตกต่างของตัวกรอง เนื่องจากการตอบสนองต่อแรงกระตุ้นของระบบ IIR นั้นมีความยาวไม่ จำกัด คุณต้องตัดให้มีความยาว จำกัด เพื่อทำการโน้มน้าวใจกับมันซึ่งสามารถใช้งานได้ซึ่งจุดที่ตัวกรองไม่ได้เป็น IIR อีกต่อไป รูปแบบสมการความแตกต่างนั้นมักจะถูกกว่าในการใช้การคำนวณแม้ว่าข้อเสนอแนะที่มีอยู่ในโครงสร้างนั้นสามารถนำไปสู่ปัญหาเชิงตัวเลขที่ต้องได้รับการแก้ไข (เช่นการล้นภายในและการสะสมข้อผิดพลาด roundoff)


ขอบคุณ! คำถามติดตามผล: (1) คุณพูดว่าสมการของคุณ H (z) = ... เป็นสมการที่ต่างกัน มันเป็นฟังก์ชั่นการถ่ายโอนใช่ไหม? ฉันคิดว่าสมการที่ต่างกันนั้นใช้สำหรับโดเมนเวลา (2) ในผู้รวมที่รั่วของคุณ 1.0 สอดคล้องกับ sampling_frequency / 2 (เหมือนใน Matlab) หรือไม่ (3) เกี่ยวกับ FIR vs IIR ความเข้าใจของฉันถูกต้องหรือไม่ว่าสมการผลต่าง IIR สามารถนำไปใช้ใน O (N) ได้ แต่ Convolution คือ O (N ^ 2) หรือ O (N lgN) ที่มีการแปลงตาม FFT หรือไม่? (4) คุณสามารถแนะนำหนังสือให้โปรแกรมเมอร์ซอฟต์แวร์ใช้แนวคิด DSP เหล่านี้ได้หรือไม่? ชอบสิ่งที่ตัวอย่างรหัส Android กำลังทำ
stackoverflowuser2010

(1) คุณพูดถูกฉันพิมพ์ผิด ฉันจะแก้ไขคำตอบ (2) ใช่; แกน X อยู่ในความถี่ปกติ, หารด้วย , ดังนั้น 1 สอดคล้องกับ , ซึ่งเป็นครึ่งหนึ่งของอัตราตัวอย่าง (3) การคำนวณผลลัพธ์สำหรับตัวอย่างเฉพาะโดยใช้วิธีใดวิธีหนึ่งคือโดยที่คือลำดับตัวกรอง ตัวกรอง IIR โดยทั่วไปแล้วจะมีเล็กกว่ามาก (4) ฉันขอแนะนำให้ทำความเข้าใจ DSPโดย Lyons; มันเป็นหนังสือเบื้องต้นที่ดี + π O ( N ) N Nπ+πO(N)NN
Jason R

ฉันรู้ว่า (i) การใช้สมการความแตกต่างคือ O (N) แต่ฉันคิดว่า (ii) การดำเนินการสังวัตนาโดยใช้การรวมผ่านการคูณและเพิ่ม (songho.ca/dsp/convolution/convolution.html) คือ O (N ^ 2) หรือ O (N lgN) ด้วยการใช้งานแบบ FFT . ในทุกกรณี N คือลำดับตัวกรอง - โดยที่ฉันสมมติว่าลำดับตัวกรองและความยาวสัญญาณเวลานั้นมีขนาดเท่ากัน (เช่นทั้ง 256) ดังนั้น (i) และ (ii) ไม่แตกต่างกันใช่ไหม นอกจากนี้ฉันยังเห็นว่าหนังสือ Lyons บน Amazon.com แต่ฉันหวังว่าจะมีบางสิ่งที่เขียนขึ้นสำหรับโปรแกรมเมอร์ซอฟต์แวร์ C / Java
stackoverflowuser2010

1
ความซับซ้อนในการคำนวณตัวอย่างผลลัพธ์แบบครั้งเดียวคือพร้อมสมการผลต่าง ถ้าความยาวสัญญาณอินพุตยังเป็นแล้วซับซ้อนรวมสำหรับผลการคำนวณสำหรับตัวอย่างการป้อนข้อมูลแต่ละกลายเป็น2) มากกว่าปกติสำหรับตัวกรอง IIR ความยาวสัญญาณอินพุตเป็นค่าที่มีขนาดใหญ่มากตั้งแต่ลำดับตัวกรองมีขนาดเล็กเพื่อความซับซ้อนที่สามารถเขียนใน(MN) ถ้าน้อยกว่าอย่างมีนัยสำคัญคุณอาจได้ประโยชน์ในการคำนวณ N O ( N 2 ) M N O ( M N ) M NO(N) NO(N2)MNO(MN)MN
Jason R

ขอโทษที่ต้องเอาชนะม้าที่ตายแล้ว สำหรับสมการผลต่างทั่วไป ( ccrma.stanford.edu/~jos/fp/Difference_Equation_I.html ) ความซับซ้อนจะไม่เป็นโดยที่ N คือความยาวสัญญาณเข้าและออก และ M คือลำดับการกรอง? วนลูปมากกว่าแต่ละเอาต์พุต y [i], , คือ O (N) และแต่ละ y [i] ต้องการลูป O (N + M) ผมคิดว่าที่คุณกล่าวว่าขึ้นอยู่กับขนาดของญาติของ N และ M ผลที่ได้คือทั้งหรือ(NM) i N O ( N 2 ) O ( N M )O(M×(N+M))iNO(N2)O(NM)
stackoverflowuser2010

2

โดยสรุปตัวกรอง IIR ที่อยู่บนพื้นฐานของแบบจำลองทางกายภาพในอุดมคติที่สมบูรณ์แบบเช่นตัวกรอง RC มีจำนวนของเสาและศูนย์จำนวนน้อยและดังนั้นจึงมักจะนำมาใช้เป็นสมการความแตกต่างเป็นจำนวนน้อยของเสาหรือศูนย์ ต่อตัวอย่างโดยใช้สมการผลต่าง

ในฐานะที่เป็น IIR หมายถึงการตอบสนองแรงกระตุ้นความยาวที่ไม่มีที่สิ้นสุดการบิดจะต้องคำนวณตลอดไปหรือการใช้การประมาณ

โดยทั่วไปแล้วตัวกรอง FIR จะถูกนำมาใช้โดยการแปลงด้วยการตอบสนองต่อแรงกระตุ้นความยาว จำกัด (หรือโดยการบิดอย่างรวดเร็ว FFT หากตัวกรองนั้นยาวพอที่จะทำให้มีประสิทธิภาพในการคำนวณ) ตัวกรองประเภทนี้มักจะถูกใช้มากกว่าเมื่อใครสามารถประมาณค่าความถี่ในการตอบสนองที่ต้องการด้วยการตอบสนองต่อแรงกระตุ้นที่มีความยาว จำกัด แทนที่จะรู้ว่าเสา Z และระนาบ Z อาจอยู่ที่ไหน

อย่างไรก็ตามเนื่องจากฟิลเตอร์ที่มีสเปคที่คมชัดบ่งบอกถึงการมีส่วนร่วมของ FIR ที่ยาวนานการดำเนินการของตัวกรอง FIR อาจช้าลงมากและการติดตั้งอาจเกี่ยวข้องกับรหัสอีกหลายบรรทัดซึ่งอาจเป็นสาเหตุที่ตัวกรอง FIR ตัวอย่าง.


0

ฉันพบว่าตัวเองกลับมาที่โพสต์ครั้งนี้อีกครั้ง ขอบคุณที่ถามคำถาม นี่คือการใช้งานที่ยอดเยี่ยมและเป็นมิตรกับการคำนวณของ integrator ที่รั่วไหลใน C (สำหรับไมโครคอนโทรลเลอร์)

ขั้นแรกให้มีการจัดเรียงใหม่: y = α * x + (1 - α) * y_last = α * (x - y_last) + y_last

หากเรา จำกัด αให้อยู่ที่ประมาณ 12%, 25%, 50%, (1/8, 1/4, 1/2, ... ) เราสามารถใช้ประโยชน์จากการเปลี่ยนบิตที่มีประสิทธิภาพ รับเรื่อง 1/8, 8 => 2 ^ 3 => (ดาวน์ 3 ครั้ง)

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

หวังว่ามันจะช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.