ฉันมีสัญญาณคลื่นไหวสะเทือน y (i):
ที่นี่ฉันได้พบหนึ่งสูงสุด: i = 152.54, y = 222.29 ด้วยตนเองและลงจุดด้วยสีแดง
ฉันต้องการค้นหา maxima ทั้งหมดโดยอัตโนมัติ
ฉันอ่านว่าตัวกรอง Savitzky Golay (SGF) สามารถใช้ในการหาค่าประมาณที่ราบรื่นของสัญญาณและอนุพันธ์ของมันและข้อดีอย่างหนึ่งของ SGF ก็คือมันสามารถรักษา minima และ maxima ได้ดีกว่าตัวกรองอื่น ๆ มันฟังดูดีสำหรับการใช้งานของฉัน
ฉันพบสคริปต์ Matlab ที่สร้างค่าสัมประสิทธิ์ SGF และใช้สิ่งนี้เพื่อหาว่าค่าสัมประสิทธิ์ SGF ลำดับที่ 4 สำหรับอนุพันธ์ ฉันเขียนสคริปต์ Matlab ตัวเล็ก ๆ
- ค้นหาอนุพันธ์ของสัญญาณโดยการสังสัยสัญญาณด้วยสัมประสิทธิ์ SGF ลำดับที่ 4 สำหรับอนุพันธ์
- ค้นหาคู่ของตัวอย่าง (i, i + 1) โดยที่สัญญาณอนุพันธ์เปลี่ยนแปลง
- ค้นหาการข้ามอนุพันธ์จากศูนย์โดยการสอดแทรกเชิงเส้นตรงระหว่าง i และ i + 1
สคริปต์:
function [maxX,maxY] = findLocalMax(y)
% Kernel for 4th order Savitzky-Golay filter for finding derivative:
d4 = [0.0724 -0.1195 -0.1625 -0.1061 0 0.1061 0.1625 0.1195 -0.0724];
dy = conv(y,d4,'same'); % derivative
[m n] = size(dy);
maxX = [];
maxY = [];
for i = 1 : n - 1
if dy(i) < 0 && dy(i+1) > 0 % max somewhere between i and i+1
a = dy(i)/(dy(i) - dy(i+1)); % linear interpolation
mx = i + a;
maxX = [maxX mx];
my = y(i)*(1-a) + y(i+1)*a; % linear interpolation
maxY = [maxY my];
end
end
ฉันต้องการสคริปต์ของฉันฉันต้องทดสอบว่าอนุพันธ์เปลี่ยนจากลบเป็นบวกเพื่อให้ได้ฟังก์ชันเพื่อให้ได้ผลลัพธ์ตามที่ต้องการ แต่สิ่งนี้ทำให้ฉันสับสน ไม่ควรหาอนุพันธ์สำหรับค่าสูงสุดไปจากบวกถึงลบ? มีวิธีที่ดีกว่าในการแยกแยะความแตกต่างระหว่าง maxima และ minima หรือไม่?
ด้านล่างเป็นผลลัพธ์ของการใช้ฟังก์ชั่นนี้เพื่อหาค่าสูงสุดบนสัญญาณของฉัน:
ผลลัพธ์ดูดี แต่ฉันสังเกตว่าไม่พบ maxima บางตัว: i = 143.13, 190.88, 256.97
นี่เป็นเพราะพวกเขาใกล้กับแม็กซิม่าคนอื่น ๆ หรือไม่?
ฉันจะควบคุม maxima ทั้งสองที่ใกล้ที่สุดได้อย่างไร
ขอบคุณล่วงหน้าสำหรับคำตอบ!