การหาจุดสูงสุดในท้องถิ่นระหว่างตัวอย่าง


10

ฉันมี n ตัวอย่างที่ไม่ต่อเนื่องของสัญญาณคลื่นไหวสะเทือน y[n]: ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการค้นหา maxima ท้องถิ่นในสัญญาณ

การทดสอบที่ไร้เดียงสาสำหรับถ้า y[n] สูงสุดคือ:

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

อย่างไรก็ตามค่าสูงสุดอาจอยู่ระหว่างตัวอย่างเช่นอาจมีค่าสูงสุดที่ i=4.25.

ในการหาค่าสูงสุดในระหว่างกลุ่มตัวอย่างฉันเชื่อว่าฉันต้องแก้ไข y[n].

  • ฉันจะค้นหา maxima โดยใช้การแก้ไขได้อย่างไร
  • ฉันควรใช้รูปแบบการแก้ไขแบบใด

อย่างที่คุณเห็นสัญญาณของฉันไม่ดังมาก แต่มันจะดีถ้าวิธีนี้มีการกรองเล็กน้อยเพื่อให้ maxima เกิน treshold และมีความกว้างแน่นอน (ไม่มี spikes)

ปัญหาที่ใหญ่ที่สุดของฉันคือการหาจุดสูงสุดในตัวอย่าง ข้อเสนอแนะสำหรับวิธีที่ดีในการทำเช่นนี้?

ขอบคุณล่วงหน้าสำหรับคำตอบ!


1
อาจจะมองไปที่คำถามที่ 1และ2 คำถาม
Geerten

หลายวิธีสำหรับสเปกตรัมความถี่: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith

คนที่สองนั้นไม่มีคำตอบ @Geerten ;-)
Ivo Flipse

1
โอ้ .. ฮ่าฮ่าจุดดี ฉันจะอ้างอิงกลับไปที่คำถามนี้กับคำถามนั้น)
Geerten

คำตอบ:


7

รับความละเอียดตัวอย่างย่อย

วิธีแก้ปัญหาราคาถูกมาก (ในแง่ของขนาดรหัส) เป็นเพียงแค่อัพตัวอย่างสัญญาณของคุณ ใน MATLAB interp(y ,ratio)นี้สามารถทำได้ด้วย วิธีแก้ปัญหาที่ซับซ้อนกว่าเล็กน้อยประกอบด้วยการตรวจจับจุดสูงสุดอย่างไร้เดียงสา และสำหรับแต่ละจุดสูงสุดให้ปรับพาราโบลาผ่าน y [peak - 1], y [peak], y [peak + 1]; จากนั้นใช้จุดที่พาราโบลานี้มีค่าสูงสุดเป็นตำแหน่งสูงสุดจริง

เกี่ยวกับการตรวจจับสูงสุด

เทคนิคมากมายที่ช่วย:

  • ตามที่ฮิลมาร์แนะนำให้ใช้สัญญาณในหน้าต่างเกาส์เซียนหรือฮันน์ความกว้างของสัญญาณนั้นเท่ากับครึ่งหนึ่งของช่วงต่ำสุดที่คุณต้องการเห็นระหว่างยอดเขาที่ตรวจพบ เนื่องจากความถูกต้องทางโลกนั้นมีความสำคัญต่อแอปพลิเคชันของคุณตรวจสอบให้แน่ใจว่าคุณคำนึงถึงความล่าช้าของเวลาในการกรอง
  • ลบสัญญาณของคุณเป็นรุ่นที่มีการกรองค่ามัธยฐานของตัวเอง (มีหน้าต่างการสังเกตที่ค่อนข้างใหญ่); และหารผลลัพธ์ด้วยเวอร์ชันที่มีการเบี่ยงเบนมาตรฐานของตัวเอง สิ่งนี้จะกำจัดแนวโน้มและอนุญาตให้แสดงขีด จำกัด ในหน่วยของส่วนเบี่ยงเบนมาตรฐาน
  • สำหรับการเลือกสูงสุดฉันกำหนดว่าใช้ตัวกรอง "หมวกทรงสูง" กำหนดรุ่นที่กรองสูงสุดของสัญญาณของคุณเป็น yt [n] = สูงสุด (y [n - W], y [n - W + 1], ... , y [n + W - 1], y [n + W]); และใช้เป็นจุดสูงสุดที่ y [n] == yt [n] และ y [n]> เกณฑ์

ทั้งหมดนี้สามารถนำไปใช้อย่างมีประสิทธิภาพใน Matlab ด้วย nlfilter เพียงไม่กี่ครั้ง


การรวมกันของการอัปแซมปลิงและการประมาณพาราโบลาอาจทำงานได้ดีกว่าอย่างเดียว
hotpaw2

3

ลองเครื่องตรวจจับจุดสูงสุดแบบสูญเสีย:

y[n] = max(abs(x[n]),a*y[n-1]);

โดยที่ "a" คือตัวเลขที่เล็กกว่า 1 ที่ควบคุมความรวดเร็วของเครื่องตรวจจับที่จะสลายตัว มันกำหนดว่ายอดเขาใกล้เคียงสามารถอยู่ได้โดยไม่ต้อง smooshing เป็นหนึ่งเดียว จากนั้นทำการตรวจจับขีด จำกัด


You have both a x[n] and y[n] in your equation. Is this correct or should it be just y[n]?
Andy

x [n] คืออินพุต y [n] คือเอาต์พุต คำตอบที่ไม่ดีโดยรวมมีการพิมพ์ผิด (ตอนนี้คงที่) และฉันเข้าใจผิดคำถาม ขอโทษ
Hilmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.