ฉันจะคำนวณ SNR ของสัญญาณที่มีเสียงดังได้อย่างไร


14

ฉันมีปัญหาในการทำความเข้าใจวิธีการใช้งานจริง

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

ตอนนี้ฉันส่งไฟล์นี้ผ่านโปรแกรมลดเสียงรบกวนและได้รับไฟล์อื่นตามมา ฉันจะคำนวณ SNR ของไฟล์ "ลดเสียงรบกวน" นี้ได้อย่างไร

--- แก้ไข ---

คำถามติดตามติดตามโพสต์ที่นี่

คำตอบ:


8

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

snr_before = mean( signal .^ 2 ) / mean( noise .^ 2 );
snr_before_db = 10 * log10( snr_before ) % in dB

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

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )

1
สัญญาณและ noise_reduced_signal จะต้องมีการจัดตำแหน่งเวลาในกรณีของคุณ
dspGuru

@dspGuru จริงฉันคิดว่าอัลกอริทึมการลดเสียงรบกวนไม่แนะนำการหน่วงเวลา
Deve

@DspGuru และ Dev: ในสถานที่เหล่านี้แทนที่จะใช้ var และค่าเฉลี่ยของสัญญาณทั้งหมดจะเกิดอะไรขึ้นถ้าฉันระบุบางส่วนของสัญญาณที่มีคำพูดแน่นอน? สำหรับ s \ example ให้แทนที่สัญญาณด้วยสัญญาณ (start_speech: end_speech) ใน Matlab เนื่องจากสัญญาณของฉันมีความยาว 5 วินาทีโดยมีการหยุดระหว่างคำ
user13267

@ user13267 สัญญาณใด ก่อนหรือหลังการลดเสียงรบกวน? โดยทั่วไปยิ่งสัญญาณที่คุณวิเคราะห์ดีกว่านั้นก็คือการประมาณค่า SNR ของคุณ
Deve

เขาทั้งคู่. สิ่งที่ฉันหมายถึงคือตัวอย่างเสียงของฉันมีบางคนพูดประโยคสั้น ๆ ดังนั้นเมื่อฉันเปิดมันด้วยความกล้าฉันจะเห็นความเข้มของรูปแบบของคลื่นสูงและบริเวณที่มีความเข้มต่ำ (การปรากฏของคำและความเงียบระหว่างคำที่ฉันคิด) ดังนั้นฉันต้องการเลือกตัวอย่างที่มีคำและไม่รวมตัวอย่างเหล่านั้นที่มีความเงียบ
user13267

3

ทางด้านอินพุต:

  1. คำนวณ DB1 = 10 * log10 (var (noiseSignal))
  2. คำนวณ DB2 = 10 * log10 (var (cleanSpeechSignal))

SNR คือ = DB2 - DB1

ที่ด้านเอาต์พุต:

  1. ส่งสัญญาณเสียงพูดที่ชัดแจ้งผ่านอัลคาเดียมลดเสียงรบกวนของคุณ แสดงผลลัพธ์ Y1
  2. ส่งสัญญาณเสียงพูดที่ดังไปทั่วเสียงรบกวนการลดเสียงรบกวนของคุณ แสดงว่าเอาต์พุต Y2
  3. คำนวณ Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB

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

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

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