การประมาณความล่าช้าของสัญญาณออสซิลโลสโคปโดยใช้สหสัมพันธ์ข้าม


12

ฉันได้บันทึก 2 สัญญาณจากออสโคป พวกเขามีลักษณะเช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการวัดการหน่วงเวลาระหว่างพวกเขาใน Matlab แต่ละสัญญาณมี 2,000 ตัวอย่างพร้อมความถี่การสุ่มตัวอย่าง 2001000.5

ข้อมูลอยู่ในไฟล์ csv นี่คือสิ่งที่ฉันมี
ฉันลบข้อมูลเวลาออกจากไฟล์ csv เพื่อให้มีเพียงระดับแรงดันไฟฟ้าเท่านั้นที่อยู่ในไฟล์ csv

x1 = csvread('C://scope1.csv');
x2 = csvread('C://scope2.csv');  
cc = xcorr(x1,x2);
plot(cc);  

สิ่งนี้ให้ผลลัพธ์นี้: ป้อนคำอธิบายรูปภาพที่นี่

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

แก้ไข: หลังจากลบ DC offset นี่คือผลลัพธ์ที่ฉันได้รับ:
ป้อนคำอธิบายรูปภาพที่นี่

มีวิธีการล้างข้อมูลนี้เพื่อให้ได้เวลาล่าช้ามากขึ้นหรือไม่?

แก้ไข 2: นี่คือไฟล์:
http://dl.dropbox.com/u/10147354/scope1col.csv
http://dl.dropbox.com/u/10147354/scope2col.csv


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

1
โปรดโพสต์รหัสที่คุณใช้และที่สำคัญกว่านั้นคือสัญญาณพล็อตสหสัมพันธ์ เครื่องมือ / ไลบรารีบางอันใส่คะแนน (lag = 0) ไว้ที่กึ่งกลางของกราฟ ฉันจำไม่ได้ว่า Matlab ทำเช่นนั้น
pichenettes

@pichenettes: อัปเดตโพสต์แล้ว
Nick Sinas

@JimClay: โพสต์ที่ได้รับการปรับปรุง
Nick Sinas

@NickS หากสัญญาณของคุณอยู่ในแนวที่สมบูรณ์แบบคุณจะได้รับจุดสูงสุดในช่วงกลางของพล็อตซีซีของคุณ ดังนั้นยอดที่ 2000 หมายถึงไม่ล่าช้า ตอนนี้ให้เราบอกว่าคุณมีความล่าช้า 10 ตัวอย่างซึ่งหมายความว่าสัญญาณ 2 คือ 10 ตัวอย่างจากสัญญาณ 1 นี่จะเป็นการเพิ่มจุดสูงสุดของคุณในซีซีจาก 2000 ถึง 2010 (หรือ 1990) ดังนั้นการหน่วงเวลาของคุณจึงสอดคล้องกับตำแหน่งสูงสุดจริงของคุณ MINUS 2000
Spacey

คำตอบ:


11

@NickS

เนื่องจากมันยังห่างไกลจากความจริงที่ว่าสัญญาณที่สองในแปลงนั้นเป็นรุ่นแรกที่ล่าช้าเพียงอย่างเดียวดังนั้นจึงต้องพยายามใช้วิธีอื่นนอกเหนือจากความสัมพันธ์ข้ามแบบคลาสสิก นี่เป็นเพราะ cross-correlation (CC) เป็นเพียงตัวประมาณโอกาสสูงสุดหากสัญญาณของคุณเป็นเวอร์ชันล่าช้าซึ่งกันและกัน ในกรณีนี้พวกเขาไม่ชัดเจนที่จะไม่พูดอะไรเกี่ยวกับความไม่แน่นอนของพวกเขาเช่นกัน

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

ด้วยเหตุนี้ฉันทำต่อไปนี้:

ขั้นตอนที่ 1: คำนวณซองสัญญาณ:

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

นอกจากนี้เนื่องจากเรากำลังดำเนินการประมาณการหน่วงเวลาประมาณการพลังงานของสัญญาณของคุณวิธีการนี้จึงรับประกัน

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 2: การขจัดเสียงรบกวนด้วยการกรองตรงกลางที่ไม่ใช่เชิงเส้น:

นี่เป็นขั้นตอนสำคัญ วัตถุประสงค์ที่นี่คือการทำให้ซองจดหมายของคุณเรียบขึ้น แต่ไม่มีการทำลายหรือทำให้ขอบของคุณราบรื่นและเวลาที่เพิ่มขึ้นอย่างรวดเร็ว จริงๆแล้วมีทั้งฟิลด์ที่อุทิศให้กับสิ่งนี้ แต่เพื่อจุดประสงค์ของเราที่นี่เราสามารถใช้ตัวกรอง Medial ที่ไม่ใช่เชิงเส้นได้ง่าย การกรองแบบมัธยฐาน. นี่เป็นเทคนิคที่ทรงพลังเพราะต่างจากการกรองแบบเฉลี่ยการกรองแบบกึ่งกลางจะไม่ลบขอบของคุณ แต่ในเวลาเดียวกัน 'เรียบ' สัญญาณของคุณโดยไม่มีการลดลงอย่างมีนัยสำคัญของขอบที่สำคัญเนื่องจากไม่มีการคำนวณทางคณิตศาสตร์ใด ๆ กับสัญญาณของคุณ (หากความยาวของหน้าต่างเป็นเลขคี่) สำหรับกรณีของเราที่นี่ฉันเลือกตัวกรองตรงกลางของขนาดหน้าต่าง 25 ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 3: ลบเวลา: สร้างฟังก์ชันการประมาณความหนาแน่นเคอร์เนล Gaussian:

จะเกิดอะไรขึ้นถ้าคุณดูที่แผนการด้านบนแทนการใช้วิธีปกติ การพูดทางคณิตศาสตร์นั่นหมายความว่าคุณจะได้อะไรถ้าคุณฉายตัวอย่างสัญญาณ denoised ของเราลงบนแกน y-amplitude ในการทำเช่นนี้เราจะจัดการลบเวลาเพื่อพูดและสามารถศึกษาสถิติสัญญาณเพียงอย่างเดียว

สังหรณ์ใจว่าอะไรโผล่ออกมาจากรูปด้านบน? ในขณะที่พลังงานเสียงรบกวนต่ำ แต่ก็มีข้อดีคือเป็นที่นิยมมากกว่า ในทางตรงกันข้ามในขณะที่ซองสัญญาณที่มีพลังงานมีพลังมากกว่าเสียงรบกวนก็มีการแยกส่วนตามเกณฑ์ ถ้าเราถือว่า 'ความนิยม' เป็นตัววัดพลังงานล่ะ? นี่คือสิ่งที่เราจะทำกับการใช้งานฟังก์ชั่นความหนาแน่นของเคอร์เนล (KDE) (KDE) กับเคอร์เนลแบบเกาส์เซียน

ในการทำเช่นนี้ทุกตัวอย่างจะถูกนำมาและฟังก์ชัน gaussian ที่สร้างขึ้นโดยใช้ค่าของมันเป็นค่าเฉลี่ยและแบนด์วิดท์ที่ตั้งไว้ล่วงหน้า การตั้งค่าความแปรปรวนของ Gaussian ของคุณเป็นพารามิเตอร์ที่สำคัญ แต่คุณสามารถตั้งค่าตามสถิติเสียงรบกวนตามแอปพลิเคชันของคุณและสัญญาณทั่วไป (ฉันมีเพียง 2 ไฟล์ของคุณที่จะออกไป) ถ้าเราสร้างการประมาณค่า KDE เราจะได้พล็อตต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถนึกถึง KDE เป็นรูปแบบต่อเนื่องของฮิสโตแกรมเพื่อพูดและความแปรปรวนเป็นความกว้างของถังขยะของคุณ อย่างไรก็ตามมันมีข้อดีของการรับประกัน PDF ที่ราบรื่นซึ่งเราสามารถทำการคำนวณแคลคูลัสแรกและตัวที่สองได้ ตอนนี้เรามี KDE ของเกาส์เซียนแล้วเราสามารถดูได้ว่าเสียงตัวอย่างได้รับความนิยมสูงสุดที่ไหน โปรดจำไว้ว่าแกน x ที่นี่แสดงการคาดการณ์ข้อมูลของเราไปยังพื้นที่แอมพลิจูด ดังนั้นเราสามารถดูได้ว่าเกณฑ์เสียงรบกวนใดเป็น 'พลัง' มากที่สุดและผู้ที่บอกเราว่าต้องหลีกเลี่ยงเกณฑ์ใด

ในพล็อตที่สองเราใช้อนุพันธ์อันดับแรกของKDE แบบเกาส์เซียนและเราเลือก abscissa ของตัวอย่างแรกหลังจากอนุพันธ์อันดับแรกหลังจากจุดสูงสุดของส่วนผสมของ Gaussians เพื่อให้ได้ค่าใกล้เคียงกับศูนย์ (หรือข้ามศูนย์แรก) เราสามารถใช้วิธีนี้และ 'ปลอดภัย' เพราะ KDE ของเราสร้างขึ้นด้วย Gaussians ที่ราบรื่นของแบนด์วิดท์ที่เหมาะสมและอนุพันธ์อันดับแรกของฟังก์ชั่นที่ราบรื่นและปราศจากเสียงรบกวนนี้ถูกนำมาใช้ (โดยทั่วไปอนุพันธ์อันดับหนึ่งอาจมีปัญหาในทุกสิ่งยกเว้นสัญญาณ SNR สูงเนื่องจากจะขยายสัญญาณรบกวน)

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

ป้อนคำอธิบายรูปภาพที่นี่

นี่จึงให้ aตัวอย่างδt=241

ฉันหวังว่านี่จะช่วยได้


ว้าว. ขอบคุณมาก. ทั้งหมดนี้เป็นเทคนิคใหม่สำหรับฉันที่ฉันจะเริ่มค้นคว้า มีวิธีใดบ้างที่ฉันจะดูรหัส matlab ที่คุณใช้หรือไม่
Nick Sinas

ดังนั้นฉันจึงมีขั้นตอน # 1 และ # 2 ทำใน Matlab และผลลัพธ์ของฉันตรงกับของคุณ แต่ฉันมีปัญหากับขั้นตอนที่ 3 คุณใช้ฟังก์ชันอะไร
Nick Sinas

@NickS ถาม .. และคุณจะได้รับส่งอีเมลถึงฉันและฉันสามารถส่งรหัสที่คุณใช้
Spacey

@ Mohammed คุณช่วยกรุณาโพสต์รหัสของคุณเพื่อประมาณความล่าช้า ฉันได้ส่งอีเมลถึงคุณเกี่ยวกับเรื่องนี้ดังนั้นโปรดช่วย

6

มีปัญหาเล็กน้อยในการทำเช่นนี้ด้วยการเชื่อมโยงอัตโนมัติ

  1. ออฟเซ็ต DC ขนาดใหญ่ (แก้ไขแล้ว)
  2. หน้าต่างเวลา: xcorr ของ Matlab มีรูปแบบที่น่ารำคาญที่จะต้อง "zero pad" สัญญาณที่ปลายทั้งสองขณะที่คุณเลื่อนเวลาล่าช้า นั่นคือหน้าต่างข้อมูลเป็นฟังก์ชั่นการหน่วงเวลา สิ่งนี้จะสร้างรูปสามเหลี่ยมสำหรับสัญญาณที่อยู่นิ่ง (รวมถึงคลื่นไซน์) ตัวเลือกที่ดีกว่าคือการเลือกหน้าต่างสหพันธรัฐเพื่อให้ขนาดหน้าต่างบวกเวลาล่าช้าสูงสุดพอดีกับหน้าต่างข้อมูลทั้งหมดของคุณหรือเพื่อทำให้ความสัมพันธ์ข้ามโดยปกติเป็นไปตามจำนวนของตัวอย่างที่ไม่มีเบาะ
  3. สัญญาณสองสัญญาณนั้นดูไม่สัมพันธ์กับฉันโดยเฉพาะ รูปร่างค่อนข้างคล้ายกัน แต่ระยะห่างที่เฉพาะเจาะจงของยอดเขาและจุดหยดแตกต่างกันมากดังนั้นฉันสงสัยว่าแม้ความสัมพันธ์อัตโนมัติที่เหมาะสมจะให้ความเข้าใจอย่างถ่องแท้ที่นี่

วิธีที่ง่ายกว่านี้มากคือการใช้เครื่องตรวจจับจุดเริ่มต้นเพื่อหาจุดเริ่มต้นและใช้ความแตกต่างระหว่างจุดเหล่านี้เป็นความล่าช้า


4

ตามที่ระบุ pichenettes ในกรณีนี้จุดสูงสุดที่ตรงกลางของเอาต์พุตบ่งชี้ว่า 0 lag การชดเชยสูงสุดของจุดกลางคือความล่าช้าของเวลาของคุณ

แก้ไข: มันเกี่ยวข้องกับฉันว่าความสัมพันธ์นั้นเกือบจะเป็นรูปสามเหลี่ยมที่สมบูรณ์แบบ นั่นแสดงให้ฉันเห็นว่าการข้ามสัมพันธ์ไม่มีการทำกำลังให้เป็นมาตรฐาน ที่ให้อคติที่ไม่ยุติธรรมกับ lags ขนาดเล็กกว่า lags ที่ใหญ่กว่า ฉันจะแก้ไขการเรียก xcorr ของคุณเป็น "cc = xcorr (x1, x2, 'unbiased');"

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


หมายความว่าสัญญาณไม่ล่าช้าหรือไม่
Nick Sinas

ฉันไม่แน่ใจ - จุดสูงสุดอยู่ที่ไหน ฉันเห็นได้ว่ามันอยู่ใกล้กลาง แต่ไม่ชัดเจนว่าจริง ๆ แล้วอยู่ตรงกลาง นอกจากนี้ยังมีปัญหาการปรับกำลังไฟตามมาตรฐานซึ่งฉันจะแก้ไขในคำตอบของฉัน
Jim Clay

พารามิเตอร์ 'ไม่ลำเอียง' ทำให้ดูดีขึ้นอย่างแน่นอน มากกว่าสิ่งที่ฉันคาดหวัง ฉันจะดูต่อไปในเรื่องนี้ ขอบคุณ
Nick Sinas

@JimClay บางที Nick S มีความสัมพันธ์กับซองจดหมายของสัญญาณของเขาและไม่ใช่สัญญาณที่แท้จริง (นิคเป็นเรื่องจริงเหรอ?) นี่จะให้รูปสามเหลี่ยมที่ฉันจินตนาการ
Spacey

2
@NickS ความคิดเห็นของโมฮัมหมัดทำให้ฉันดูและตระหนักว่าคุณมีออฟเซ็ต DC จำนวนมากที่ทำให้ผลลัพธ์ของคุณยุ่งเหยิง ลบค่าเฉลี่ยจากสัญญาณทั้งสองของคุณแล้วเรียกใช้ xcorr บนพวกเขา ฉันจะลองโดยไม่มีตัวเลือก "เป็นกลาง" ก่อน
Jim Clay

4

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

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

มีหลายกรณีที่ความสัมพันธ์ข้ามมีประโยชน์อย่างไร สมมติว่าสัญญาณที่สองของคุณเป็นรุ่นดั้งเดิมที่มีการเลื่อนเวลาจริง ๆ แม้จะมีการเพิ่มสัญญาณรบกวนเพิ่มเติม:

a = csvread('scope1col.csv');
a = a - mean(a);               % to remove DC offset
b = a(200:end) + sqrt(0.05)*randn(1801,1);
figure; subplot(211); plot(a); subplot(212); plot(b)

ป้อนคำอธิบายรูปภาพที่นี่

ขณะนี้ยังไม่ชัดเจนในทันทีว่าสัญญาณทั้งสองเกี่ยวข้องกันโดยการหน่วงเวลา อย่างไรก็ตามถ้าเราคำนึงถึงความสัมพันธ์ข้ามกันเราจะได้:

[c,lags] = xcorr(a,b);
igure; plot(lags,c); grid on; xlabel('Lag'); ylabel('Cross-correlation');

ป้อนคำอธิบายรูปภาพที่นี่

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


ความคิดใดที่ฉันสามารถทำได้อีก อาจเป็นเทคนิคอื่นที่ไม่ใช่ cross correlation หรืออาจเป็นตัวกรองบางประเภท? ขอบคุณ
Nick Sinas

@NickS ฉันได้ดูมันและพวกเขาก็ไม่ได้ล่าช้ากัน คุณต้องการที่จะประเมินความล่าช้าของพลังงานหรือไม่? ผมคิดว่าจะทำให้รู้สึกมากขึ้นในกรณีนี้ล่าช้า VS ของสัญญาณ หากคุณบอกเราเพิ่มเติมเกี่ยวกับแชแนล / การทดสอบพื้นฐานที่คุณใช้งานอยู่เราสามารถบอกคุณเพิ่มเติมเกี่ยวกับเส้นทางที่เป็นไปได้
Spacey

@ Mohammad ขอบคุณ ช่องทางพื้นฐานคือเหล็ก มีความคิดว่าจะประเมินความล่าช้าของพลังงานอย่างไร?
Nick Sinas

@ โมฮัมหมัดคุณคิดว่าการบิดเบือนสัญญาณอาจเป็นประเภทของเสียงก้องที่สามารถล้างออกด้วยการกรองได้หรือไม่?
Nick Sinas

@NickS อาจมีกลวิธีการทำความสะอาดพัดโบกอยู่ที่นั่น (ฉันไม่ทราบว่าจะทำสิ่งเหล่านั้นได้อย่างไร) แต่ฉันได้ทำสิ่งที่เรียบง่ายด้วยก้อนหินที่จะเป็นตัวประมาณค่าพลังงานหากคุณต้องการดู
Spacey

0

ตามคำแนะนำของ Muhammad ฉันพยายามสร้าง Matlab script อย่างไรก็ตามฉันไม่สามารถอนุมานได้ว่าเขาสร้างการแจกแจงแบบเกาส์ตามความแปรปรวนจากนั้นใช้การประมาณ KDE หรือเขาทำการประมาณ KDE ด้วยการสันนิษฐานแบบเกาส์

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

%% Initialising data

Ws1 = data1;
Ws2 = data2;
mWs1 = nanmean(Ws1);
mWs2 = nanmean(Ws2);
sdWs1 = nanstd(Ws1);
sdWs2 = nanstd(Ws2);

%% Computing the signal envelopes
Ws1d = Ws1 - mWs1;
Ws2d = Ws2 - mWs2;
h1 = abs(hilbert(Ws1d));
h2 = abs(hilbert(Ws2d));
figure();
subplot(211)
plot([Ws1d, h1])
subplot(212)
plot([Ws2d, h2])

%% Denoise the signal with edge preserving nonlinear medial filtering
w = 25;
mf1 = medfilt1(h1, w);
mf2 = medfilt1(h2, w);
figure();
subplot(211)
plot(mf1)
subplot(212)
plot(mf2)

<%% Remove time: construct the gaussian kernel density estimation functions>
% Using the kde from Matlab central directly on the filtered data
data1 = mf1;
[bw1, den1, xmesh1, cdf1] = kde(data1, 2^14);
der1 = diff(den1);
data2 = mf2;
[bw2, den2, xmesh2, cdf2] = kde(data2, 2^14);
der2 = diff(den2);
figure();
plot([der1, der2]);
legend('Sig1', 'Sig2')

% the other method as explained in Muhammad's post
for i = 1:length(mf1)
gf1(:,i) = mf1(i) + sdWs1*randn(1000,1);
gf2(:,i) = mf2(i) + sdWs2*randn(1000,1);
end
[bwM1, denM1, xmeshM1, cdfM1] = kde(gf1(:,1), 2.^11);
dd1 = diff(denM1);
[bwM2, denM2, xmeshM2, cdfM2] = kde(gf2(:,1), 2.^11);
dd2 = diff(denM2);
figure();
plot([dd1, dd2]);
legend('Sig1', 'Sig2')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.