สารบัญ:

วิธีทำการทดสอบการได้ยินของผู้ใหญ่โดยใช้ MATLAB: 6 ขั้นตอน
วิธีทำการทดสอบการได้ยินของผู้ใหญ่โดยใช้ MATLAB: 6 ขั้นตอน

วีดีโอ: วิธีทำการทดสอบการได้ยินของผู้ใหญ่โดยใช้ MATLAB: 6 ขั้นตอน

วีดีโอ: วิธีทำการทดสอบการได้ยินของผู้ใหญ่โดยใช้ MATLAB: 6 ขั้นตอน
วีดีโอ: Curve Fitting 1 2024, กรกฎาคม
Anonim
วิธีการทำแบบทดสอบการได้ยินของผู้ใหญ่โดยใช้ MATLAB
วิธีการทำแบบทดสอบการได้ยินของผู้ใหญ่โดยใช้ MATLAB

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

กลุ่มของเราทำการทดสอบการได้ยินโดยใช้วัสดุที่เรามีอยู่แล้ว การทดสอบของเรามีไว้สำหรับผู้ใหญ่และวัยรุ่นเท่านั้น เพราะการได้ยินของเด็กเล็กมีหลากหลายช่วง และควรวัดโดยผู้เชี่ยวชาญเท่านั้น

โปรเจ็กต์นี้ได้รับแรงบันดาลใจขณะทำงานในคลาส BME MATLAB และเล่นกับเสียงที่เกิดจากคลื่นไซน์ เราสนใจวิธีที่จะเปลี่ยนคลื่นไซน์ให้เล่นเสียงในระดับเสียงต่างๆ

ทั้งหมดที่เราต้องการสำหรับโครงการนี้คือคอมพิวเตอร์ที่ใช้ MATLAB R2018b และเอียร์บัดหนึ่งคู่ เราได้รวมตัวละครดั้งเดิมอย่าง Frances ไว้เป็นมาสคอตเพื่อทำให้รายการมีอารมณ์ขันมากขึ้น

ขั้นตอนที่ 1: สร้างอินพุตของผู้ใช้เพื่อวิเคราะห์อายุของผู้ใช้

สร้างอินพุตของผู้ใช้เพื่อวิเคราะห์อายุของผู้ใช้
สร้างอินพุตของผู้ใช้เพื่อวิเคราะห์อายุของผู้ใช้
สร้างอินพุตของผู้ใช้เพื่อวิเคราะห์อายุของผู้ใช้
สร้างอินพุตของผู้ใช้เพื่อวิเคราะห์อายุของผู้ใช้

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

Dir = 'C:\Users\phoeb\OneDrive\Documents\MATLAB\Frances Drawings';GetDir = 'C:\Users\phoeb\OneDrive\Documents\MATLAB\Frances Drawings\*.jpg';

เพื่อนำเสนอกล่องข้อความและรูปภาพขนาดใหญ่ของภาพวาด เราใช้วิธีสนุกๆ นี้ในการแสดง Frances ให้คุณดู เพียงอิมเมจรูปภาพที่คุณเลือกด้วยรูปแบบ: variable = imread('nameofpicture.jpg');

จากนั้นดำเนินการแสดงโดยใช้ imshow(ตัวแปร); จากนั้นจะปรากฏเป็นตัวเลขใน MatLab ของคุณเมื่อคุณเรียกใช้!

ถัดมาเป็นกล่องข้อความที่ใช้ตลอดทั้งโค้ด uiwait() เป็นฟังก์ชันที่โค้ดหยุดทำงานจนกว่าฟังก์ชันที่เลือกสำหรับ uiwait จะเสร็จสิ้น ฟังก์ชันที่เลือกนี้คือ msgbox('message', 'title', 'icon')!

คุณสามารถเปลี่ยนข้อความที่ฟรานเซสพูดได้ตามสบายตราบเท่าที่คุณทำตามรูปแบบ msgbox() ด้านบน หากคุณต้องการใช้รูปภาพของ Frances ให้ติดป้ายกำกับ 'ไอคอน' เป็น 'กำหนดเอง' และดำเนินการด้วยเครื่องหมายจุลภาคและตัวแปรของอิมเมจของรูปภาพที่คุณเลือก! คุณยังสามารถใช้ประเภท 'ไอคอน' ที่ตั้งไว้ล่วงหน้าได้เช่นกัน ควรมีลักษณะดังนี้:

สวัสดี = imread('Regular.jpg'); % อ่านรูปภาพจากไฟล์ uploadedimshow(hi); uiwait(msgbox('สวัสดีและขอขอบคุณที่เลือกการทดสอบการได้ยินของเรา นี่คือ Frances และเขาจะช่วยคุณในการทดสอบในวันนี้!', 'ยินดีต้อนรับ!', 'กำหนดเอง', สวัสดี));

ถัดไปสร้างอินพุตที่ถามอายุของผู้ใช้เช่นนั้น!

UserAge = input('ก่อนที่เราจะเริ่มต้นการทดสอบนี้ คุณอายุเท่าไหร่ (ปี) (เช่น 32, 56, …)\n', 's');

หมายเหตุ: หากตัวเลขนั้นแปลกและมีจำนวนมากเกินไป ให้ใช้ close all เพื่อลบตัวเลขก่อนหน้าในขณะที่โค้ดของคุณทำงาน

จากนั้นสร้างโครงสร้างเคสสวิตช์! จำไว้ว่าอินพุตของผู้ใช้เป็นสตริง และคุณต้องแปลงค่านั้นเป็นค่าตัวเลข ดังนั้นให้ใช้ str2double(UserAge) แต่ละกรณีควรมีช่วงอายุเช่น 4 ถึง 6 หรือ 18 ถึง 40 เพื่อให้ตัวแปรตรวจสอบว่าเป็นจริงสำหรับกรณีใดกรณีหนึ่งให้ใช้ num2cell(array) ดังนี้:

switch str2double(UserAge) % เปลี่ยนตัวแปรจากสตริงเป็นค่าตัวเลข case num2cell(0:3)

ฟรานเซส = imread('Egg.jpg');

imshow(ฟรานซ์);

uiwait(msgbox('You are a fetus! Frances คิดว่าคุณควรทำการทดสอบการได้ยินกับแพทย์แทน!', 'Test Denied!', 'custom', frances));

กลับ

ควรส่งคืนกลุ่มก่อนหน้านี้เพื่อป้องกันไม่ให้ผู้ใช้ดำเนินการกับรหัส

อย่าลืมปิดโครงสร้างเคสและปิดตัวเลขทั้งหมด

ขั้นตอนที่ 2: ทดสอบเสียงสำหรับผู้ใช้

ทดสอบเสียงสำหรับผู้ใช้
ทดสอบเสียงสำหรับผู้ใช้

ส่วนนี้มีอยู่เพื่อให้แน่ใจว่าเสียงของผู้เข้าร่วมบนอุปกรณ์ของตนไม่ดังเกินไปหรือดังเกินไป

เพื่อให้ผู้ใช้มีกล่องข้อความปรากฏขึ้นและรอการยืนยันจากผู้ใช้ก่อนที่จะดำเนินการต่อด้วยเสียง: uiwait(msgbox('ก่อนการทดสอบเริ่มต้น เราต้องการทดสอบเสียงเพื่อให้แน่ใจว่าระดับเสียงของคุณ ถูกต้องไหม พร้อมหรือยัง', 'เดี๋ยวก่อน!', 'ช่วยเหลือ'));

คลื่นไซน์เล่นด้วยแอมพลิจูด 1 และอัตราการสุ่มตัวอย่าง 1,000 Hz: T = [0:1/SampleRate:2]; y = 1*บาป(2*pi*200*T); เสียง (y, SampleRate);

จากนั้นผู้ใช้จะถูกถามคำถามโดยป้อนคำตอบโดยผู้ใช้: Q = input('คุณได้ยินเสียงหรือไม่ [y/n] n', 's');

จากนั้นจะมีเวลามองหาเมื่อ Q == 'n' หากเป็นจริงเสียงจะทำซ้ำและถามผู้ใช้อีกครั้งจนกว่าคำตอบจะเปลี่ยนจาก 'n' เป็น 'y': while Q == 'n' if strcmp(Q, 'n') disp('ปรับระดับเสียงของคอมพิวเตอร์ให้ดังขึ้น'); รอ_เสียง; หยุดชั่วคราว(2); Q = input('คุณได้ยินเสียงตอนนี้หรือไม่ [y/n] n', 's'); ปลาย ปลาย

จากนั้นรอสักครู่ก่อนที่จะดำเนินการตรวจสอบส่วนที่แท้จริงของรหัส

ขั้นตอนที่ 3: ทำการทดสอบ Audiometry สำหรับหูข้างขวา

ทำการทดสอบ Audiometry สำหรับหูข้างขวา
ทำการทดสอบ Audiometry สำหรับหูข้างขวา

ในโค้ดนี้ ลูปจะทำงานซ้ำ 6 ครั้งโดยมีความถี่และระดับเสียงต่างกันสำหรับหูแต่ละข้าง ขึ้นอยู่กับหูที่คุณต้องการทดสอบ ตัวแปร Out จะมีเสียงในแถวหนึ่งและศูนย์ในอีกแถวหนึ่ง

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

ส่วนนี้อยู่ในดัชนีสำหรับการวนซ้ำสำหรับเสียงที่คุณต้องการเล่นหากคุณต้องการสุ่มความถี่ที่เล่นและแอมพลิจูด

F คือความถี่: r = (rand*10000); Fs = 250 + r; (ฟังก์ชัน rand คือการสร้างความถี่ที่สร้างขึ้นแบบสุ่ม) t คือระยะเวลาที่กำหนดซึ่งกำหนดโดย: t = linspace(0, Fs*2, Fs*2); s คือคลื่นไซน์: s = sin(2*pi*t*1000); (สามารถคูณด้วยตัวแปรสุ่ม w เพื่อสร้างค่าแอมพลิจูด/เดซิเบลแบบสุ่มสำหรับฟังก์ชันเสียง: w = rand;)

เอาต์พุตสำหรับหูข้างขวาคือ: Out = [zeros(size(t)); NS]';

เอาต์พุตจะเล่นผ่านรหัส: เสียง (ออก, Fs)

ขั้นตอนต่อไปคือการสร้างส่วนต่อประสานกับผู้ใช้ด้วยรหัสที่บันทึกว่าผู้ใช้ได้ยินเสียงหรือไม่

ขั้นแรกคุณต้องสร้างร่างและกำหนดตำแหน่งที่ร่างนั้นจะปรากฏขึ้น: gcbf = figure('pos', [30 800 350 150]);

***หากปุ่มไม่ปรากฏขึ้นสำหรับคุณ ตำแหน่งของรูปดังที่แสดงในอาร์เรย์ด้านบนอาจอยู่ในตำแหน่งที่ไม่ถูกต้องสำหรับคอมพิวเตอร์ของคุณ ในการแก้ปัญหานี้ ให้เปลี่ยนค่า 30 และ 800 เป็นตำแหน่งใดก็ได้ที่คุณต้องการ ตัวอย่างเช่น การมี [0 0 350 150] จะสร้างปุ่ม gui ที่ด้านล่างซ้ายของจอภาพ***

ปุ่มสลับถูกสร้างขึ้นมาเพื่อบันทึกเมื่อผู้ใช้ได้ยินเสียง และตำแหน่งและการแสดงผลสามารถปรับแต่งได้: tb = uicontrol('Style', 'togglebutton', 'String', 'Pres the button when you hear a sound', ' แท็ก', 'togglebutton1', 'Position', [30 60 300 40], 'Callback', 'uiresume(gcbf); freq_right = [freq_right, F]; amp_right = [amp_right, w]; close(gcbf);'); รหัสเฉพาะนี้มีรหัสดำเนินการต่อและเวกเตอร์ว่างจะเพิ่มค่าหากกดปุ่ม

จากนั้นสร้างฟังก์ชั่นรอเพื่อรับการตอบสนองของปุ่มและเปิดใช้งานรหัสในปุ่มเมื่อกด: h = randi([4, 7]); uiwait(gcbf, ชั่วโมง); (เราทำตัวแปรสุ่ม h เพื่อให้ผู้เข้าร่วมไม่สามารถโกงและกำหนดจำนวนวินาทีที่จำเป็นในการตอบสนองได้)

หลังจากวนซ้ำเสร็จแล้ว ให้เก็บตัวแปรเอาท์พุตความถี่ (freq_right) เป็น Hz เอาไว้ จากนั้นแปลงตัวแปร dB_right จากแอมป์เป็นเดซิเบลโดยใช้สมการ: dB_right = mag2db(amp_right)*(-1);

จากนั้นเพิ่มฟังก์ชัน: ปิดทั้งหมด สิ่งนี้จะออกจากตัวเลขที่ไม่จำเป็นที่อาจปรากฏขึ้น

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

ขั้นตอนที่ 4: สร้างรหัสเดียวกันสำหรับหูข้างซ้าย

สร้างรหัสเดียวกันสำหรับหูข้างซ้าย
สร้างรหัสเดียวกันสำหรับหูข้างซ้าย

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

ออก = [s; ศูนย์(ขนาด(t))]';

โดยการทำเช่นนี้จะไม่มีเสียงออกจากช่องสัญญาณขวา แต่ช่องซ้ายแทน!

ขั้นตอนที่ 5: สร้างภาพเคียงข้างกันเพื่อเปรียบเทียบข้อมูล

สร้างภาพเคียงข้างกันเพื่อเปรียบเทียบข้อมูล
สร้างภาพเคียงข้างกันเพื่อเปรียบเทียบข้อมูล
สร้างภาพเคียงข้างกันเพื่อเปรียบเทียบข้อมูล
สร้างภาพเคียงข้างกันเพื่อเปรียบเทียบข้อมูล

ตอนนี้สร้างกราฟเพื่อแสดงข้อมูล! คุณกำลังใส่กราฟสองกราฟเป็นตัวเลขเดียว ทำเช่นนี้!

รูปที่(1);แผนย่อย(1, 2, 1); *** แผนย่อย (1, 2, 2) สำหรับอีกอันหนึ่ง

สำหรับแต่ละแผนย่อย ให้เพิ่มแพทช์เหล่านี้ด้วยสีและพิกัดเฉพาะ ส่วนเหล่านี้ปิดกราฟขึ้นอยู่กับระดับการสูญเสียการได้ยินมากน้อยเพียงใด ชอบดังนั้น:

แพทช์([250 8000 8000 250], [25 25 -10 -10], [1.00, 0.89, 0.29]); %yellowhold บน % แผนย่อยจะเก็บแพทช์และ scatterplots ต่อไปนี้

ข้อความ(3173, 8, 'ปกติ');

แพทช์([250 8000 8000 250], [40 40 25 25], [0 0.75 0.25]); % เขียว

ข้อความ(3577, 33, 'ไม่รุนแรง');

แพทช์([250 8000 8000 250], [55 55 40 40], [0.16, 0.87, 0.87]); % สีฟ้า

ข้อความ (2870, 48, 'ปานกลาง');

แพทช์([250 8000 8000 250], [70 70 55 55], [0.22, 0.36, 0.94]); % สีฟ้า

text(1739, 62, 'ปานกลาง');

แพทช์([250 8000 8000 250], [90 90 70 70], [0.78, 0.24, 0.78]); % สีม่วง

ข้อความ(3142, 80, 'รุนแรง');

แพทช์([250 8000 8000 250], [120 120 90 90], [0.96, 0.24, 0.24]); % สีแดง

ข้อความ(3200, 103, 'ลึกซึ้ง')

จากนั้นเพิ่มแปลงกระจายซ้ายและขวา! เราสามารถให้ค่าเฉลี่ยระดับประเทศสำหรับคุณ! ที่นี่:

Nat_FreqL = [250 500 1000 2000 4000 8000]; % ค่า x, earNat_dBL ซ้าย = [10 3 10 15 10 15]; % ค่า y

Nat_FreqR = [250 500 1000 2000 4000 8000]; % หูขวา

Nat_dBR = [10 5 10 15 10 15];

แปลงกระจายควรแยกแยะจุดซ้ายและขวา คุณสามารถทำไม้กางเขนและวงกลมได้!

NL = กระจาย (Nat_FreqL, Nat_dBL, 'bx'); % แปลงจุดกากบาทสีน้ำเงินNR = กระจาย (Nat_FreqR, Nat_dBR, 'ro'); % แปลงวงกลมสีแดง

สร้างคำอธิบายแผนภูมิสำหรับกราฟระดับประเทศโดยกำหนดให้กับตัวแปรเฉพาะ: legend([NL NR], {'title1', 'title2'});

ตั้งค่าขีดจำกัด x ของคุณจาก 250 ถึง 8000 Hz และขีดจำกัด y ของคุณตั้งแต่ -10 ถึง 120 dB อย่าลืมเปลี่ยนขีดแนวตั้งของคุณด้วย yticks()

ติดป้ายกำกับแกน x ของคุณว่า "ความถี่ Hz" และแกน y ของคุณเป็น "ระดับเสียง dB"

ย้อนกลับแกน y โดยรวบรวมแกนด้วย ax = gca

จากนั้นผูกคุณสมบัติของทิศทาง y กับมันด้วย: ax. YDir = 'reverse

ตอนนี้รหัสสำหรับวินาทีนั้นใกล้เคียงกัน แต่ไม่มีคำอธิบายและสร้างกราฟให้กับ scatterplot ด้วยตัวแปรจากการทดสอบด้านซ้ายและขวา

หลังจากทั้งหมดนี้ เพิ่มฟังก์ชันหยุดชั่วคราวประมาณ 10 วินาที เพื่อให้ผู้ใช้ดูผลลัพธ์ได้

ขั้นตอนที่ 6: เพิ่มข้อความขอบคุณเล็กน้อยหากคุณต้องการ

เพิ่มข้อความขอบคุณเล็กน้อยหากคุณต้องการ!
เพิ่มข้อความขอบคุณเล็กน้อยหากคุณต้องการ!

นี่เป็นเพียงเพื่อความสนุกถ้าคุณต้องการ แต่เพิ่มอีก imread(), imshow() และ uiwait(msgbox()) เพื่อขอบคุณและลาก่อน! นอกจากนั้น อย่าลืมใส่ clf; ปิดทั้งหมด; ซีแอลซี; เพื่อที่จะปิดทุกอย่าง ทำได้ดีมาก คุณทำได้!

แนะนำ: