การคำนวณ PDF ของรูปคลื่นจากตัวอย่าง


27

เมื่อไม่นานมานี้ฉันได้ลองวิธีต่างๆในการวาดรูปคลื่นดิจิตอลและหนึ่งในสิ่งที่ฉันได้ลองก็คือแทนที่จะเป็นภาพเงามาตรฐานของซองขนาดแอมพลิจูดเพื่อแสดงมันเหมือนออสซิลโลสโคป นี่คือลักษณะของไซน์และคลื่นสแควร์:

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

วิธีที่ไร้เดียงสาในการทำเช่นนี้คือ:

  1. แบ่งไฟล์เสียงเป็นก้อนเดียวต่อพิกเซลแนวนอนในภาพออก
  2. คำนวณฮิสโตแกรมของแอมพลิจูดของตัวอย่างสำหรับแต่ละอัน
  3. พล็อตฮิสโตแกรมโดยความสว่างเป็นคอลัมน์ของพิกเซล

มันสร้างบางสิ่งเช่นนี้ ป้อนคำอธิบายรูปภาพที่นี่

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

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

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

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

PDF ของ sin (x): ddxarcsinx=11x2

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

"PDF ของข้อมูลที่ถูกสอดแทรก" นี้ยังใช้กับความพยายามที่ฉันทำเพื่อประมาณความหนาแน่นของเคอร์เนลของแทร็ก GPS มันควรจะเป็นรูปวงแหวน แต่เนื่องจากมันเป็นเพียงการดูตัวอย่างและไม่พิจารณาจุดแทรกระหว่างตัวอย่าง KDE จึงดูคล้ายกับโคกมากกว่าวงแหวน หากตัวอย่างเป็นสิ่งที่เรารู้แล้วนี่คือสิ่งที่ดีที่สุดที่เราสามารถทำได้ แต่ตัวอย่างไม่ใช่สิ่งที่เรารู้ เรารู้ด้วยว่ามันมีเส้นทางระหว่างตัวอย่าง สำหรับ GPS นั้นไม่มีการสร้าง Nyquist ใหม่ที่สมบูรณ์แบบเหมือนมีสัญญาณเสียงแบบไม่ จำกัด band แต่ยังมีแนวคิดพื้นฐานที่ใช้กับการคาดเดาในฟังก์ชั่นการแก้ไข


คุณมีตัวอย่างของฟังก์ชันหลายค่าที่คุณสนใจหรือไม่? คุณอาจต้องประเมินมันตามการตัดสาขาที่เหมาะสมที่สุดสำหรับข้อมูลทางกายภาพของคุณ
Lorem Ipsum

คุณมีความสนใจในวิธีวาดพล็อตแบบนั้นหรือพล็อตเป็นเพียงแรงจูงใจสำหรับคำถามเกี่ยวกับการคำนวณ PDF หรือไม่?
เก็บข้อมูล

@yoda: ฟังก์ชั่นด้านบนสำหรับคลื่นไซน์นั้นหาได้โดยใช้เพียงครึ่งรอบ, กลับด้านและรับอนุพันธ์, เนื่องจากแต่ละครึ่งวงจรมี PDF เหมือนกัน แต่เพื่อให้ได้ค่าสำหรับสัญญาณเสียงทั้งหมดคุณไม่สามารถทำการสันนิษฐานได้ ฉันคิดว่าคุณจะต้องแบ่งมันเป็น "การตัดสาขา", นำ PDF ของแต่ละอันมารวมกันแล้วรวมเข้าด้วยกันเหรอ?
endolith

@datageist: อืม ฉันสนใจวิธีวาดพล็อตชนิดนั้น แต่พล็อตประเภทนั้นคือ PDF ทางลัดที่สร้างผลลัพธ์เหมือนหรือคล้ายกันมากก็โอเค
endolith

@ endolith โอ้ใช่ฉันเข้าใจ แค่คำถามเกี่ยวกับการเน้นจริง ๆ (เช่นทางลัดประเภทใดที่เหมาะสม)
เก็บข้อมูล

คำตอบ:


7

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

สมมติว่าทุกคู่ของค่าที่เกินตัวอย่างมีเส้นต่อเนื่องจากค่าหนึ่งไปยังอีก ใช้ค่าทั้งหมดระหว่าง สิ่งนี้จะช่วยให้คุณสามารถแบ่งแนวนอนบาง ๆ ชิ้นจาก y1 ถึง y2 เพื่อรวบรวมเป็นความละเอียด PDF โดยพลการ ความน่าจะเป็นแต่ละชิ้นสี่เหลี่ยมจะต้องถูกปรับอัตราส่วนเป็นพื้นที่ 1 / nsamples

การใช้เส้นแบ่งระหว่างกลุ่มตัวอย่างมากกว่ากลุ่มตัวอย่างเองจะป้องกัน PDF "spikey" แม้ในกรณีที่มีความสัมพันธ์พื้นฐานระหว่างช่วงการสุ่มตัวอย่างและรูปแบบของคลื่น


ฉันเขียนฟังก์ชันสำหรับฮิสโตแกรมเชิงเส้นที่สอดแทรกเชิงเส้น แต่มันก็หลบ คุณรู้รหัสที่มีอยู่สำหรับสิ่งนี้หรือไม่?
endolith

การแก้ไขเชิงเส้นทำให้เกิดความแตกต่างอย่างมากสำหรับรูปคลื่นส่วนใหญ่แม้ว่าจะไม่มีการสุ่มตัวอย่างมากเกินไปก็ตาม 1 kHz sine ส่วนใหญ่ดูเหมือน 997 Hz sine ในขณะนี้ แทนที่จะเป็นแค่เส้นแนวนอนที่ค่าตัวอย่างตอนนี้มันก็เป็นแถบสีแนวนอนระหว่างพวกมัน เมื่อมีการสุ่มตัวอย่างมากเกินไปวงก็จะเรียบเนียนเช่นกัน ด้วยการสุ่มตัวอย่าง FFT และบางส่วนทับซ้อนกับชิ้นส่วนที่อยู่ติดกันฉันควรจะสามารถทำให้มันเป็นยอดเขาตัวอย่างจริง ฉันต้องทำให้ฮิสโทแกรมของฉันเร็วขึ้นแม้ว่า ...
endolith

ฉันเขียนสคริปต์ของฉันอีกครั้งโดยสมบูรณ์และฉันคิดว่าฉันได้ฮิสโตแกรมและการลดรอยหยักในเวลานี้: gist.github.com/endolith/652d3ba1a68b629ed328
endolith

รุ่นล่าสุดอยู่ที่github.com/endolith/scopeplot
endolith

7

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

ฉันใช้การประมาณลูกบาศก์แบบง่าย ๆ กับจุดสุ่มหนึ่งจุดระหว่างแต่ละตัวอย่าง สำหรับเสียง synth แบบดั้งเดิม (การสลายตัวจากสัญญาณแบบสี่เหลี่ยมจัตุรัสที่ไม่มีความอิ่มตัวเชิงซ้อน + แม้แต่เสียงประสานไปยังไซน์) ดูเหมือนว่า:

สุ่ม synth PDF สุ่มใหม่

ลองเปรียบเทียบกับเวอร์ชั่นที่สูงกว่าตัวอย่าง

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

และสิ่งแปลกประหลาดที่มีกลุ่มตัวอย่างเดียวกัน แต่ไม่มีการแก้ไข

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

สิ่งประดิษฐ์ที่โดดเด่นของวิธีนี้คือ overhoot ในโดเมนแบบสแควร์ แต่นี่คือสิ่งที่ PDF ของสัญญาณ sinc-filtered (อย่างที่ฉันบอกว่าสัญญาณของฉันไม่ band band ไม่ จำกัด ) จะมีลักษณะและแสดงถึงความดังที่รับรู้ได้ดีขึ้นมาก กว่ายอดเขาถ้านี่เป็นสัญญาณเสียง

รหัส (Haskell):

cubInterpolate vll vl v vr vrr vrrr x
    = v*lSpline x + vr*rSpline x
      + ((vr-vl) - (vrr-vll)/4)*ldSpline x
      + ((vrr-v) - (vrrr-vl)/4)*rdSpline x
     where lSpline x = rSpline (1-x)
           rSpline x = x*x * (3-2*x)
           ldSpline x = x * (1 + x*(x-2))
           rdSpline x = -ldSpline (1-x)

                   --  rand list   IN samples  OUT samples
stochasticAntiAlias :: [Double] -> [Double] -> [Double]
stochasticAntiAlias rs (lsll:lsl:lsc:lsr:lsrr:[]) = []
stochasticAntiAlias (r:rLst) (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)
    = ( cubInterpolate lsll lsl lsc lsr lsrr lsrrr r )
          : stochasticAntiAlias rLst (lsll:lsl:lsc:lsr:lsrr:lsrrr:t)

rand list เป็นรายการของตัวแปรสุ่มในช่วง [0,1]


1
ดูน่ากลัว +1 สำหรับรหัส Haskell
เก็บข้อมูล

ใช่มันควรจะเกินค่าตัวอย่าง จริง ๆ แล้วฉันวางแผนที่จะมีค่าสูงสุดสำหรับแต่ละพิกเซลของคอลัมน์เช่นกันซึ่งอาจแตกต่างกันไปตามยอดสูงสุดของการกระจายตัวอย่างสูงสุดไม่ใช่เฉพาะในตัวอย่างสูงสุด รูปแบบของคลื่นอย่างflic.kr/p/7QAScXแสดงว่าทำไมถึงมีความจำเป็น
endolith

โดย "รุ่นที่สูงกว่าตัวอย่าง" คุณหมายถึงว่ามันเป็นแบบอัพ แต่เป็นตัวอย่างที่สม่ำเสมอ และนั่นคือจุดสีฟ้า?
endolith

1
@endolith มันเป็นเพียงรูปแบบของคลื่นต้นฉบับที่คำนวณในอัตราตัวอย่างที่สูงขึ้นตั้งแต่แรก โดยพื้นฐานแล้วเช่นจุดสีน้ำเงินแสดงถึงการสุ่มตัวอย่างเสียงที่ 192 kHz และสีเหลืองที่ต่ำที่สุดแสดงถึงการลดลงของตัวอย่างที่ไร้ค่าถึง 24 kHz จุดสีเหลืองบนเป็นเท่าstochasticAntiAliasนี้ แต่รุ่นที่สูงกว่านั้นเป็นอัตราที่แน่นอนในทั้งสองกรณี
leftaroundabout

5

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

ตามที่คุณได้กล่าวไปแล้วการสุ่มตัวอย่างเป็นประจำจะเป็นชุดเดียวกันและมีความเสี่ยงสูงต่อการประมาณการที่ไม่ดีในภูมิภาคที่ไม่ได้ทำการสุ่มตัวอย่าง (แม้ว่าเกณฑ์ของ Nyquist จะเป็นที่พอใจ) ในกรณีนี้การสุ่มตัวอย่างเป็นระยะเวลานานจะไม่ช่วยได้เช่นกัน

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

f(x)=sin(20πx)+sin(100πx)fs=1000fN=1001000 ตัวอย่าง (การกระจายเครื่องแบบ) ต่อวินาที (ฉันไม่ได้ใช้ Hz ที่นี่เพราะนั่นหมายถึงความหมายที่แตกต่างกัน) เป็นเวลา 30 วินาทีให้พล็อตทางด้านขวา (binning เดียวกัน)

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

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


1
"มันยากมากที่จะคำนวณค่าผกผันของฟังก์ชันทั่วไป" ทีนี้นี่ไม่ใช่ฟังก์ชั่นมากพอ ๆ กับชุดตัวอย่างดังนั้นการหาค่าผกผันก็แค่แลกค่าพิกัด x และ y ของตัวอย่างแล้วปรับให้พอดีอีกครั้ง ระบบพิกัดใหม่ ฉันไม่สามารถเปลี่ยนตัวอย่างได้ เรากำลังพูดถึงข้อมูลที่มีอยู่แล้วที่สร้างขึ้นโดยใช้การสุ่มตัวอย่างแบบสม่ำเสมอ
endolith

4

การประมาณความหนาแน่นของเคอร์เนล

วิธีหนึ่งในการประเมินรูปแบบไฟล์ PDF ของรูปแบบของคลื่นคือการใช้ประมาณการความหนาแน่นเคอร์เนล

x(n)K(x)δ(xx(n))P^

P^(x)=n=0NK(xx(n))

อัปเดต: ข้อมูลเพิ่มเติมที่น่าสนใจ

x(n)n=0,1,...,N1X(k)

X(k)=n=0N1x(n)eȷ2πnk/N

X(k)eȷ2πnk/N

x(n)=1Nk=0N1X(k)eȷ2πnk/N

ดังนั้นการคาดเดาสิ่งที่คุณกำลังจะทำให้ PDF ทั้งหมดของส่วนประกอบฟูริเยร์เข้าด้วยกัน:

|X(k)|11x2

X(k)x(n)

ต้องการความคิดมากกว่านี้!


ฉันคิดถึงสิ่งนั้น แต่การประมาณความหนาแน่นใช้สำหรับประเมินฟังก์ชันความหนาแน่นของความน่าจะเป็นที่ไม่รู้จัก เนื่องจากทฤษฎีการสุ่มตัวอย่างของ Nyquist ทำให้มีการรู้จักรูปแบบของคลื่นทั้งหมดและฟังก์ชั่นความหนาแน่นของความน่าจะเป็นที่แน่นอนก็ควรทราบเช่นกัน ฉันพอใจกับการประเมินว่าการแลกเปลี่ยนความเร็วเทียบกับความถูกต้องแม่นยำหรือไม่ แต่ต้องมีวิธีที่จะได้ PDF จริงออกมา เช่นเดียวกับรูปคลื่นที่สร้างขึ้นใหม่สามารถทำได้โดยการใส่ฟังก์ชั่น sinc ในแต่ละตัวอย่างและรวมเข้าด้วยกัน สามารถสร้าง PDF โดยใช้ PDF ของฟังก์ชัน sinc เป็นเคอร์เนลได้หรือไม่ ฉันไม่คิดว่ามันจะทำงานอย่างนั้น
endolith

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

4

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

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

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

  • π


แต่ถ้ารูปคลื่นเป็น 44.1 / 44 kHz :) นี่เป็นคำแนะนำที่ดี มีการสุ่มตัวอย่างแบบสุ่มอีกครั้งหรือไม่ หรือจริง ๆ ฉันเดาว่าสิ่งที่จะทำงานได้อย่างสมบูรณ์แบบคือการสุ่มตัวอย่างที่ไม่เหมือนกันเช่นตัวอย่างใหม่จะพอดีกับถังขยะในมิติ y อย่างสมบูรณ์แทนที่จะเว้นระยะเท่า ๆ กันในมิติ x ไม่แน่ใจว่ามีวิธีการดังกล่าวหรือไม่
endolith

2
คุณสามารถนำ resampler "สุ่ม" ไปใช้งานได้อย่างง่ายดายโดยใช้โครงสร้าง Farrow เป็นรูปแบบที่อนุญาตให้มีการหน่วงเวลาตัวอย่างบางส่วนโดยการประมาณโดยใช้พหุนาม (มักลูกบาศก์) คุณสามารถรักษาตัวสะสมเฟสระหว่างตัวอย่างได้เช่นเดียวกับที่ใช้ในNCOที่เพิ่มขึ้นด้วยเศษส่วนหลอกเทียมของช่วงเวลาการสุ่มตัวอย่างสำหรับตัวอย่างแต่ละเอาต์พุต (ตัวอย่างซ้ำ) ค่าของตัวสะสมจะถูกใช้เป็นข้อมูลป้อนเข้าของ Farrow interpolator ซึ่งจะกำหนดจำนวนของการหน่วงเวลาแบบเศษส่วนสำหรับแต่ละเอาต์พุต
Jason R

อืมเพื่อให้ชัดเจนว่า Farrow เป็นเพียงตัวประมวลผล / หน่วยความจำที่ได้รับการปรับให้เหมาะสมที่สุดของการประมาณค่าพหุนามแบบเก่า?
endolith

1
ใช่. มันเป็นเพียงโครงสร้างที่มีประสิทธิภาพสำหรับการนำความล่าช้าแบบแยกส่วนตามพหุนามมาใช้
Jason R

การแก้ไขแบบลูกบาศก์เป็นเพียงการประมาณ ฉันต้องการทราบยอดตัวอย่างระหว่างจริงและดูเหมือนว่าจะทำงานได้ไม่ดีกับยอดเขาที่สูงมาก: stackoverflow.com/questions/1851384/…ที่ จริงแล้วดูเหมือนว่าซีรี่ส์ที่ไม่มีที่สิ้นสุดที่มีความไม่ต่อเนื่องเช่น [... , -1, 1, -1, 1, 1, -1, 1, -1, ... ] จะสร้างจุดสูงสุดอินสแตนซ์ของอินสแตนซ์ที่ไม่มีที่สิ้นสุดดังนั้นฉันไม่แน่ใจว่ามันจะมีความสำคัญในทางปฏิบัติเท่าไหร่
endolith

0

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

คุณยกตัวอย่างของเสียง 1kHz โดยที่เนื้อเรื่องไม่เป็นไปตามที่คุณคาดหวัง นี่คือข้อเสนอของฉัน (รหัส Matlab / Octave)

pixels_vertical = 100;
% This needs to be tuned to your configuration and acceptance
upsampling_factor = 16*(pixels_vertical/100); 
fs_original = 48000;
fsine = 1000; % in Hz
fs_up = upsampling_factor*fs_original;
duration = 1; % in seconds
x = sin(2*pi*fsine*[0:duration*fs_up]/fs_up);
period_in_samples = fs_up/fsine;
hist_points = linspace(-1,1,pixels_vertical);
istart = 1;
iend   = period_in_samples;
pixel_values = hist(x(istart:iend), hist_points);
% smooth pixel values
[b,a] = butter(2,0.2);
pixel_values_smooth = filtfilt(b,a,pixel_values);
figure;hold on;
plot(hist_points, pixel_values);
plot(hist_points, pixel_values_smooth,'r');

สำหรับเสียง 1000Hz ของคุณคุณจะได้รับสิ่งนี้ ป้อนคำอธิบายรูปภาพที่นี่

สิ่งที่คุณต้องทำคือการปรับแต่งนิพจน์ upsampling_factor ตามความต้องการของคุณ

ยังไม่แน่ใจ 100% ว่าสิ่งที่คุณต้องการคืออะไร แต่ด้วยหลักการข้างต้นของการยกตัวอย่างและการทำให้ราบรื่นคุณจะได้สิ่งนี้สำหรับเสียง 1kHz (ทำด้วย Matlab) โปรดทราบว่าในฮิสโตแกรมข้อมูลดิบมีถังขยะจำนวนมากที่มีค่าศูนย์ยอด

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


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

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