A Novel Echo-Hiding Scheme with Backward and Forward Kernels [สารบัญกลุ่มเรื่องที่กำลังศึกษา] เนื้อหาตอนนี้ผมสรุปจากบทความในชื่อเดียวกันของ H.J. Kim กับ Y.H. Choi ตีพิมพ์ใน IEEE Transactions on Circuits and Systems for Video Technology, vol. 13, no. 8, pp. 885-889 ปี 2003 ข้อเสนอ B&F Kernels ของคิมนี้เป็นข้อเสนอที่ถูกอ้างถึงบ่อย ไอเดียของ Kim พัฒนามาจากของ Bender (1996) กับ Oh (2001) แบบง่าย ๆ ครับ คือ แทนที่จะใช้ kernel ซึ่งมี echo เดียว หรือ echo 2 ตัวที่เป็นบวกกับลบ (ดูรูป Fig.1 กับ Fig.2) เขาก็ใช้ kernel ที่มี echo ที่เป็นบวก 2 ตัว โดยตัวหนึ่งเกิดขึ้นก่อนสัญญาณและอีกตัวหนึ่งเกิดขึ้นหลังสัญญาณ (Fig.3) ![]() ![]() สำหรับ kernel แบบแรกของ Bender มีผลตอบสนอง impulse: h[n] = δ[n] + αδ[n-d] เมื่อ δ คือ Kronecker delta function, α เป็น decay rate เป็นพารามิเตอร์ตัวหนึ่ง และ d คือ delay offset สำหรับแบบ dual kernel ของ Oh นั้น h[n] = δ[n] + α1δ[n-d1] - α2δ[n-d2] h[n] ของ Kim คือ δ[n] + αδ[n-d] + αδ[n+d], คำถาม ทำแบบ Kim มีข้อดียังไง? Kim ได้พิสูจน์ให้เห็นในทางคณิตศาสตร์ว่า kernel ของเขาช่วยให้ recovery rate เพิ่มขึ้น เพราะขนาดของสัญญาณหลังการแปลง cepstrum ที่เวลา offset delay มีค่าสูงขึ้น เมื่อเทียบกับ 2 แบบแรก ลองดูสมการกันสักนิดนะ สัญญาณเสียง x[n] ป้อนเข้า kernel ที่มี impulse response h[n] ได้สัญญาณเสียงที่ใส่ echo เข้าไปแล้วคือ y[n] = x[n]*h[n] (เครื่องหมาย * แทนการ convolute) ต่อมา ในการตรวจจับเวลา delay ของ echo นั้น เราจะใช้วิธีหา cepstrum ของ y[n] เขียนแทนด้วย cy[n] = F-1(ln F(y[n])) เมื่อ F-1 และ F คือ การแปลงฟูริเยร์ผกผันและการแปลงฟูริเยร์ตามลำดับ จาก y[n] = x[n]*h[n] หรือ F(y[n]) = F(x[n]*h[n]) = F(x[n])·F(h[n]) = X(ejω)·H(ejω) ดังนั้น เราจะได้ cy[n] = F-1(ln X(ejω)) + F-1(ln H(ejω)) กรณี kernel ของ Bender นั้น H(ejω) = 1 + αe-jωd หรือ ln H(ejω) = αe-jωd - (α2/2)e-2jωd + (α3/3)e-3jωd - ... (เราใช้การกระจายอนุกรมกำลังของ ln(1 + x) = x - x2/2 + x3/3 - ...) แปลงกลับ ได้ ch[n] = αδ[n-d] - (α2/2)δ[n-2d] + (α3/3)δ[n-3d] - ... หรือ cy[n] = cx + αδ[n-d] - (α2/2)δ[n-2d] + (α3/3)δ[n-3d] - ... เห็นได้ชัดจากสมการนี้ว่า cepstrum ของ kernel จะทำให้เกิด pulse ซ้ำ ๆ กันที่ระยะห่างออกไปทีละ d และ peak แรกของ echo มีขนาดเท่ากับ α แต่ถ้า h[n] = δ[n] + αδ[n-d] + αδ[n+d] เราจะได้ H(ejωd) = 1 + αe-jωd + αe+jωd = 1 + 2α cosωd (จาก eiθ = cosθ + i sinθ) เมื่อกระจายอนุกรมกำลังแบบเดิมนะครับ ได้ ch[n] = 2α cosωd - (2α cosωd)2/2 + (2α cosωd)3/3 - ... โดยมีเงื่อนไขอนุกรมลู่เข้าคือ |2α cosωd| < 1 ฉะนั้น ch[n] = α{δ[n-d] + δ[n+d]} - (α2/2){δ[n-2d] + 2δ[n] + δ[n+2d]} + (α3/3){δ[n-3d] + 3δ[n-d] + δ[n+d] + δ[n+3d]} - ... จากสมการนี้ peak ของ cepstrum ที่ n = d เท่ากับ α + α3 + α5 + ... หรือประมาณ a = α/(1-α2) ซึ่งในกรณีที่ a2 < 1 นั้น a จะมากกว่า α นี่จึงเป็นเหตุผลที่ Kim อ้างว่าวิธีของเขาดีกว่า ดังแสดงในตาราง และรูปตัวอย่างด้านล่าง ![]() Kim อธิบายต่อว่า กรณี h[n] = δ[n] + αδ[n-d1] + αδ[n+d2] ที่ d1 ≠ d2 นั้น เราจะไม่มีทางได้ α/(1-α2) นั่นคือ ขนาดของ cepstrum จะดีขึ้นกรณีที่ kernel สมมาตร หรือ d1 = d2 เท่านั้น ความสูงของ cepstrum ขึ้นอยู่กับปัจจัย 3 ประการ ได้แก่ cepstrum response ของ echo kernel และของสัญญาณต้นฉบับ กับ echo kernel delay กระนั้น Kim ก็ไม่ได้อ้างว่า kernel ของเขาใช้การได้ดีในทุกกรณีนะครับ โดยเฉพาะเมื่อ x[n] เป็น monophonic ดังจะได้เห็นจากผลการทดลองต่อไป เพลงที่ Kim เลือกใช้ในการทดลองแสดงดังตารางด้านล่าง เขาเลือกคลิปเสียงอัตราสุ่ม 44.1 kHz 16 bits แบ่งเป็น segment ขนาด 4410 แซมเปิ้ล แต่ละ segment ก่อนนำมาฝังข้อมูลก็ให้มันผ่านหน้าต่าง Hanning โดยกำหนด delay = 100 แซมเปิ้ลแบบสมมาตรสำหรับฝัง "1" และ 103 แซมเปิ้ล สำหรับ "0" ![]() จากตาราง 01.wav - 03.wav เป็นเพลงที่ซ่อนลายน้ำได้ง่าย เพราะเป็นเพลงที่มีพลังงานสูง ขณะที่ 04.wav กับ 05.wav ซ่อนได้ยากกว่า โดยเฉพาะ 04 มีเสียงเครื่องดนตรีโบราณของญี่ปุ่นเป็นหลัก ซึ่งเป็นเสียง monophonic ผลลัพธ์จากการทดลองแสดงค่า dectection error rate (= จำนวนบิตที่ผิด/จำนวนบิตที่ฝัง) แสดงดังตารางด้านล่างเมื่อผ่านการโจมตีแบบต่าง ๆ ที่ค่า α = 0.2 และ 0.4 ตามลำดับ สังเกตกรณีของ 04.wav นะครับ ![]() นอกจากนี้ ผู้เขียนยังได้เสนอให้ฝังลายน้ำด้วยเทคนิค 2 แบบที่อ่อนไหวต่อการโจมตีแตกต่างกัน เพื่อเพิ่มโอกาสรอดของลายน้ำ |
บทความทั้งหมด
|