วิธีแยกเสียงจากการกรน


22

พื้นหลัง: ฉันกำลังทำงานกับโปรแกรม iPhone (พาดพิงถึงใน หลาย อื่น ๆ โพสต์ ) ที่ "ฟัง" นอนกรน / การหายใจในขณะที่หนึ่งคือนอนหลับและกำหนดว่ามีสัญญาณของการหยุดหายใจขณะหลับ (ในขณะที่ก่อนหน้าจอสำหรับ "นอนห้องปฏิบัติการ" การทดสอบ) แอปพลิเคชั่นส่วนใหญ่ใช้ "ความแตกต่างของสเปกตรัม" เพื่อตรวจจับกรน / ลมหายใจและทำงานได้ค่อนข้างดี (มีความสัมพันธ์ 0.85--0.90) เมื่อทดสอบกับการบันทึกแล็บในห้องปฏิบัติการ (ซึ่งจริง ๆ แล้วค่อนข้างมีเสียงดัง)

ปัญหา: เสียง "ห้องนอน" ส่วนใหญ่ (พัดลม ฯลฯ ) ฉันสามารถกรองด้วยเทคนิคต่าง ๆ และมักจะตรวจจับการหายใจในระดับ S / N ที่หูมนุษย์ไม่สามารถตรวจพบได้อย่างน่าเชื่อถือ ปัญหาคือเสียงรบกวน ไม่ใช่เรื่องผิดปกติที่จะมีโทรทัศน์หรือวิทยุทำงานในพื้นหลัง (หรือเพียงแค่ให้ใครบางคนกำลังพูดอยู่ในระยะไกล) และจังหวะของเสียงที่ใกล้เคียงกับการหายใจ / การนอนกรน ในความเป็นจริงฉันใช้งานการบันทึกของ Bill Holm ผู้เขียน / นักเล่าเรื่องตอนปลายผ่านแอพและมันก็แยกไม่ออกจากการนอนกรนในจังหวะความแปรปรวนระดับและมาตรการอื่น ๆ (แม้ว่าฉันสามารถพูดได้ว่าเห็นได้ชัดว่าเขาไม่ได้หยุดหายใจขณะหลับอย่างน้อยก็ไม่ได้ในขณะที่ตื่น)

นี่เป็นช็อตเล็กน้อย (และอาจเป็นกฎของฟอรัม) แต่ฉันกำลังมองหาแนวคิดบางอย่างเกี่ยวกับวิธีแยกแยะเสียง เราไม่จำเป็นต้องกรองเสียงกรนอย่างใด (คิดว่าน่าจะดี) แต่เราต้องการวิธีที่จะปฏิเสธว่าเสียง "ดังเกินไป" ที่ปนเปื้อนด้วยเสียงมากเกินไป

ความคิดใด ๆ

ไฟล์ที่เผยแพร่:ฉันได้วางไฟล์ไว้ที่ dropbox.com แล้ว:

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

ทั้งสามไฟล์ถูกเปลี่ยนชื่อจาก ".wav" เป็น "_wav.dat" เนื่องจากเบราว์เซอร์จำนวนมากทำให้มันยากที่จะดาวน์โหลดไฟล์ wav อย่างน่ารำคาญ เพียงเปลี่ยนชื่อพวกเขากลับเป็น ".wav" หลังจากดาวน์โหลด

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

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

( ข้อมูลเพิ่มเติม:สำหรับบางกรณีขนาดของสัญญาณ FFT จะสร้างรูปแบบที่แตกต่างกันอย่างมากโดยมีค่าสูงสุดที่ประมาณ 0.2 Hz และ Harmonics แบบขั้นบันได แต่รูปแบบนั้นไม่ได้มีความแตกต่างกันมากนักในเวลาส่วนใหญ่ รูปแบบที่คล้ายกันในรุ่นอาจมีวิธีการคำนวณค่าสหสัมพันธ์สำหรับตัวเลขของบุญ แต่ดูเหมือนว่าจะต้องใช้เส้นโค้งที่เหมาะสมกับพหุนามลำดับที่ 4 และการทำครั้งที่สองในโทรศัพท์ดูเหมือนจะทำไม่ได้)

ฉันยังพยายามที่จะทำแอมพลิจูดเฉลี่ย FFT เดียวกันสำหรับ "วงดนตรี 5 วง" แต่ละวงที่ฉันได้แบ่งสเปกตรัมออกเป็น วงดนตรีคือ 4000-2000, 2000-1000, 1,000-500 และ 500-0 รูปแบบสำหรับ 4 วงแรกนั้นโดยทั่วไปคล้ายกับรูปแบบโดยรวม (แม้ว่าจะไม่มีวงดนตรี "stand-out" ที่แท้จริงและสัญญาณขนาดเล็กที่หายไปมักจะหายไปในย่านความถี่สูงกว่า) แต่ 500-0 โดยทั่วไปจะสุ่ม

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


2
คุณสามารถโพสต์สเป็คตรัมตัวแทน (ให้ข้อมูลคุยกัน) คุณคำนวณ "ความแตกต่างของสเปกตรัม" อย่างไร?
Emre

"ความแตกต่างทางสเปกตรัม" บางครั้งเรียกว่า "สเปกตรัมการไหล" และคำอื่น ๆ โดยพื้นฐานแล้วมันคือผลรวมของกำลังสองของความแตกต่างของแต่ละบุคคลใน FFT ที่ต่อเนื่องของเสียง
Daniel R Hicks

2
ลองคิดดูสิคลิปเสียงน่าจะดีกว่านี้ ขอขอบคุณสำหรับการชี้แจง.
Emre

ฉันพยายามหาว่างานนำเสนอที่ดีที่สุดจะเป็นอย่างไร ฉันไม่มีซอฟต์แวร์แฟนซีที่จะทำ spectra (นอกเหนือจาก FFT ที่แท้จริงของฉัน) สำหรับตัวอย่างสั้น ๆ - ความกล้าต้องใช้ตัวอย่างนานเกินไปในการจับสเปกตรัมของเสียงแต่ละเสียง และมีปัญหาความเป็นส่วนตัวทางการแพทย์ด้วยการโพสต์เสียงผู้ป่วยจริง
Daniel R Hicks

1
@DanielRHicks สเปกโทรแกรมพร้อมทีวี + กรนและแค่กรนหรืออะไรสักอย่างที่จะไปได้ไกลจริงๆ
Spacey

คำตอบ:


10

พื้นหลัง

ตามเอกสารด้านล่างการกรนนั้นมีลักษณะเป็นจุดสูงสุดที่ประมาณ 130Hz และมีความเข้มข้นต่ำกว่า 12kHz:

ลองดูว่าเราสามารถใช้ประโยชน์จากสิ่งนี้ได้หรือไม่

ตัวอย่าง MATLAB

เรามีการบันทึกเสียงกรนของเด็กไม่ดี ไฟล์ WAV โมโนแบบ 8 บิต 10 นาที อัตราการสุ่มตัวอย่างคือ 8KHz ซึ่งหมายความว่าแบนด์วิดธ์ของสัญญาณเสียงคือ 4KHz ระดับต่ำมากดังนั้นฉันจะบังคับก่อน

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
surf(linspace(0,600,length(t)),f/pi,10*log10(p),'edgecolor','none'); 
axis tight; view(0,90);

สเปกโตรแกรมเต็มรูปแบบ

แกน y ถูกทำให้เป็นมาตรฐานกับแบนด์วิดท์ 4KHz เพื่อให้รอยที่คุณเห็นที่ 0.1 สอดคล้องกับความถี่ 400Hz มีเข็มที่สัมพันธ์กับอาการไอที่ ~ 186s; ไม่สนใจสิ่งนั้น เราสามารถเห็นรอยหยักระหว่างกรนแต่ละครั้ง ไม่เพียงแค่นั้น แต่พวกเขาดูเข้มข้นต่ำกว่า 0.2 x 4KHz = 800Hz ลองมาดูอย่างใกล้ชิด

idx_max_freq=round(0.2*length(f));
surf(linspace(0,600,length(t)),fs*f(1:,idx_max_freq:)/(2*pi),10*log10(p(1:idx_max_freq,:)),'edgecolor','none');
axis tight; view(0,90);

ซูมของ spectrogram ถึง 0-800Hz

เวลานี้แกนความถี่ถูกระบุเป็นเฮิรตซ์ ตอนนี้รอยหยักค่อนข้างชัดเจน เราสามารถเห็น overtones ของสัญญาณรบกวนสายไฟเริ่มต้นที่ 60Hz (180Hz, 300Hz, 420Hz) ตอนนี้เป็นสาระสำคัญของอัลกอริทึม: มาแบ่งประเภทของสัญญาณตามพลังงานในย่านย่อยนี้โดยขจัดสัญญาณรบกวนสายออก

freq_list=round([1:57 63:177 183:297 303:417 423:800]*idx_max_freq/800);
y=10*log10(sum(p(freq_list,:)));
plot(linspace(0,600,length(y)),y-median(y))
stem(linspace(0,600,length(y)),y-median(y)>.5*std(y))

หากเราต้องการจินตนาการเราสามารถทิ้งหนามขนาดใหญ่ได้:

stem(linspace(0,600,length(y)),(y-median(y)>.5*std(y)).*(y-median(y)<5*std(y)))

พล็อตของพลังงานในหยัก subband 0-800Hz

ผลสุดท้าย

SNR ต่ำซึ่งแสดงให้เห็นถึงความยากลำบากในการมองเห็นสัญญาณในพล็อตแรกหมายความว่าเรามีค่าเบี่ยงเบนมาตรฐานเพียงครึ่งเดียว (ค่าที่ 4.1) ลำต้นทำเครื่องหมายกรน


ใช่อัลกอริทึมปัจจุบันของฉันยกเลิกฮัมและเสียงฮาร์มอนิกอื่น ๆ (เสียงเครื่องช่วยหายใจมีแนวโน้มที่จะอยู่ที่ประมาณ 110Hz) โดยการสร้างศูนย์ฝากข้อมูล FFT ที่อยู่ในระดับคงที่มากหรือน้อย ฉันไม่ชัดเจนว่าคุณหมายถึงอะไรเมื่อคุณพูดว่า "เราแบ่งสัญญาณตามพลังงานในย่านย่อยนี้" - คุณหมายถึง subband อะไร?
Daniel R Hicks

โอ้ฉันเข้าใจแล้วคุณกำลังพูดถึงต่ำกว่า 800 เฮิร์ตซ์ - ฉันพลาดบิตนั้นไป
Daniel R Hicks

หากคุณดูที่กราฟด้านบนของคุณคุณจะเห็นว่ามีข้อมูลค่อนข้างใกล้ด้านบนและมีวงอื่นที่อยู่ตรงกลาง และวงดนตรีเหล่านี้มีเสียงรบกวนจากการแข่งขันน้อยกว่ามาก แบบแผนปัจจุบันของฉันแบ่งคลื่นความถี่และพยายามประเมิน SNR ของแต่ละชิ้นจากนั้นให้น้ำหนักตามนั้น
Daniel R Hicks

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

นั่นเป็นสิ่งที่ฉันกำลังทำอยู่โดยไม่มี PCA
Daniel R Hicks

9

เพียงแค่โยนสิ่งนี้ลงในที่นี่เพื่อครอบคลุมความเป็นไปได้ทั้งหมดคุณอาจจะสามารถใช้เอนโทรปีได้ฉันไม่รู้ว่าระดับการนอนกรนและการพูดของเอนโทรปีนั้นคืออะไร แต่ถ้ามันแตกต่างกันพอ http://www.ee.columbia.edu/~dpwe/papers/ShenHL98-endpoint.pdf


ฉันไม่เข้าใจเลยว่าฉันกำลังทำอะไรอยู่ (ทฤษฎีสารสนเทศทำให้หัวของฉันระเบิด) แต่ฉันใช้การคำนวณเอนโทรปีอย่างหยาบ ๆ โยนลงมาในรูปแบบที่ไม่ใช่เชิงทฤษฎีโดยสิ้นเชิงและดูเหมือนว่าจะทำงานได้ เพลงและเสียงมีเอนโทรปีต่ำ (ลบ) ในขณะที่กรนจะสูงขึ้นอย่างมีนัยสำคัญ และเสียงพื้นหลังโดยทั่วไปดูเหมือนว่าจะลดค่า (ลบ) ดังนั้นมันจึงเป็นรูปบุญที่ค่อนข้างดี จำเป็นต้องทำการทดลองเพิ่มเติม
Daniel R Hicks

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

ใช่ฉันกำลังต่อสู้กับเสียงเป็นประจำและมีวิธีที่ดีในการแยกวัดออกจากกัน เมื่อเสียงดังเกินระดับที่กำหนดฉันถ่อ (มันยากที่น่าอัศจรรย์ใจจริงในการวัดเสียง.)
แดเนียลฮิกส์ R

อนิจจาฉันได้ค้นพบว่าสิ่งที่ฉันวัดด้วยการคำนวณเอนโทรปีของฉันเป็นสิ่งประดิษฐ์ของการคำนวณ (เนื่องจากศูนย์ในข้อมูลการทดสอบ) มันใช้งานได้ดีสำหรับความต้องการของฉัน แต่ไม่ใช่อย่างที่ฉันคิดไว้ก่อน
Daniel R Hicks

การติดตามผล: ฉันแทนที่ FFT แบบคงที่ / ลอยฉันจะใช้กับจุดลอยตัวเต็มหนึ่ง (ที่ไม่ได้สร้างศูนย์เมื่อระดับต่ำ) และประโยชน์ของเอนโทรปีก็ลงไปในหลอด - ไม่ ดูเหมือนจะให้สิ่งที่มีประโยชน์อย่างยิ่ง
Daniel R Hicks

3

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


สถิติโดเมนเวลาพื้นฐานไม่สามารถแยกความแตกต่างได้ อย่างไรก็ตามมันเป็นจุดที่ดีที่ฉันสามารถดูความแปรปรวนในระยะสั้น กำลังมองหา "การตีกลับ" ระหว่างคลื่นความถี่เป็นความคิดที่ดี ... ฉันกำลังแบ่งออกเป็น 5 แบนด์และปฏิเสธแบนด์ที่มี S / N ต่ำ
Daniel R Hicks

@DanielRHicks ฉันเห็นวิธีการคำนวณซองเซปทรัลที่อื่น แต่บางทีคุณสามารถใช้มันเพื่อวัดความแปรปรวนทางสเปกตรัมของคุณแทนที่จะเป็นสเปกตรัมบริสุทธิ์ซึ่งจะเป็น 'เสียงรบกวน / ความไม่เป็นระเบียบ' มากขึ้นในขณะที่เซพสตรัมมีแนวโน้มที่ราบรื่น . ฉันเคยได้ยินว่ามีการใช้Mel-Frequency cepstrumในการสร้างเสียงใหม่และเสียงนี้อาจจะเป็นประโยชน์กับคุณ
Spacey

@DanielRHicks: แยกไม่ออกโดยวิธีการใด? พวกเขาแตกต่างกับฉันอย่างแน่นอน
endolith

@endolith - แยกไม่ออกเนื่องจากตัวชี้วัดปัจจุบันของฉัน - "ความแตกต่างของสเปกตรัม" บวกกับระดับพลังงานโดยรวม แต่พวกเขาจะกรองต่ำผ่านกับค่าคงที่เวลาประมาณ 0.5 วินาที ฉันคิดว่าฉันจะลองดูข้อมูลที่ไม่มีการกรองสักหน่อย
Daniel R Hicks

ฉันไปจับสถิติเวลาสั้น ๆ "คำใบ้" บางอย่าง แต่ไม่มีอะไรชัดเจน
Daniel R Hicks

1

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

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


ปัญหาคือการกรนนั้นซับซ้อน / สุ่มอย่างน่าอัศจรรย์และขาดคุณสมบัติที่แตกต่างกันมากเมื่อตรวจสอบสเปกตรัมของมัน
Daniel R Hicks

มันจะเป็นข้อมูลที่น่าสนใจถ้าคนที่นอนหลับก่อตัวเป็นตัวกรองเสียงสระและเสียงสระต่าง ๆ มากมาย (และ digraphs และ trigraphs อย่างหนาแน่นตลอดเวลา) และการผันเสียงแหลม (ฯลฯ ) ในขณะนอนหลับเมื่อตื่นและพูด
hotpaw2

การขาดคุณสมบัติสามารถเป็นคุณสมบัติที่สำคัญ เสียงพูดมีคุณสมบัติ
hotpaw2

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