
สารบัญ:
- ขั้นตอนที่ 1: รายการอุปกรณ์ (ถ่ายรูปบอร์ดและคอมพ์ของ Kevin)
- ขั้นตอนที่ 2: ภาพรวม
- ขั้นตอนที่ 3: ไฟล์ Wav
- ขั้นตอนที่ 4: Python- การใช้ Pylab และ Scipy
- ขั้นตอนที่ 5: การสุ่มตัวอย่าง Python และ FFT (แสดงรหัสและผลลัพธ์)
- ขั้นตอนที่ 6: Vivado (ตัวเปรียบเทียบ)
- ขั้นตอนที่ 7: ภาพของบอร์ดพื้นฐาน 3
- ขั้นตอนที่ 8: Vivado (ตัวถอดรหัสเซ็กเมนต์ 7 ส่วนพร้อมมัลติเพล็กซ์)
- ขั้นตอนที่ 9: Vivado (การรวมส่วนประกอบ)
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-23 15:12



โปรเจ็กต์นี้ออกแบบมาเพื่อสร้างจูนเนอร์กีต้าร์โดยใช้ Vivado และจอแสดงผล 7 ส่วน เมื่อจูนเนอร์พบความถี่ของเสียงที่ป้อนเข้ามา จูนเนอร์จะเปรียบเทียบค่านั้นกับรายการค่าที่ฮาร์ดโค้ดสำหรับความถี่ที่แน่นอนซึ่งเรียกว่าความถี่มาตรฐานสำหรับระดับเสียงที่ถูกต้องของโน้ต จากนั้นจูนเนอร์จะแสดงว่าเสียงที่คุณป้อนนั้นอยู่ใกล้หรือไกลจากโน้ตที่คุณต้องการ สิ่งที่น่าสนใจคือคลื่นเสียงเป็นการผสมผสานระหว่างรูปคลื่นไซน์หลายรูปที่มีส่วนประกอบจริงและองค์ประกอบจินตภาพ แม้ว่าสิ่งนี้อาจดูยากสำหรับผู้ที่ไม่คุ้นเคย แต่ก็มีบางวิธีที่เราสามารถวิเคราะห์คลื่นด้วยค่าจริงและค่าจินตภาพได้
การสาธิต:
ขั้นตอนที่ 1: รายการอุปกรณ์ (ถ่ายรูปบอร์ดและคอมพ์ของ Kevin)
อันดับแรก เราต้องการบอร์ด Basys 3 และคอมพิวเตอร์ที่รองรับโปรแกรมต่อไปนี้ Garageband/Audacity หรือ DAW อื่น - เพื่อบันทึกผ่านไมโครโฟนและส่งออกไฟล์ wavfiles
Python - สามารถใช้ pylab และ scipy สำหรับการสุ่มตัวอย่างและ fft
Vivado - เพื่อเชื่อมต่อกับบอร์ด Basys 3 และดูผลลัพธ์ด้วยสายตา
ขั้นตอนที่ 2: ภาพรวม

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

ในขั้นตอนนี้ เราจะนำไฟล์ wav ของ pitch และพยายามแสดงความถี่ของ pitch นั้น
ก่อนอื่นคุณต้องมีไฟล์ wav ของโน้ต ในตัวอย่างนี้ เราจะใช้ไฟล์สเตอริโอ wav 16 บิตที่มีอัตราการสุ่มตัวอย่าง 44.1kHz สามารถสร้างได้ใน DAW เช่น Garageband หรือดาวน์โหลด สำหรับตัวอย่างนี้ คลื่นไซน์ขนาด A4 440Hz ที่เราสร้างขึ้นบน Garageband สามารถดาวน์โหลดได้ที่นี่
ขั้นตอนที่ 4: Python- การใช้ Pylab และ Scipy

เราใช้ไลบรารี Python ในการทำ "Fast Fourier transform" แหล่งข้อมูลออนไลน์ทำให้เราเลียนแบบและดูว่าอะไรมีประโยชน์ใน pylab และ scipy
1. หากคุณยังไม่ได้ติดตั้ง pylab หรือ scipy คุณต้องติดตั้ง หรือ Pycharm มีคุณสมบัติที่ดีมาก เมื่อพยายามนำเข้า pylab หรือ scipy มีการขีดเส้นใต้ที่บอกคุณว่าคุณยังไม่ได้ติดตั้งไลบรารี่ จากนั้นคุณสามารถติดตั้งได้โดยตรงโดยกดที่หลอดไฟสีแดง (จะปรากฏขึ้นเมื่อคุณวางเคอร์เซอร์ไว้ใกล้กับเส้นใต้ที่หยักศก)
2. ใช้ฟังก์ชัน scipy.io.wavfile.read อ่านและดึงข้อมูลจากไฟล์ wav ตัวอย่าง เรียกใช้ข้อมูลโดย pylab.fft มันจะแสดงรายการขนาดของพลังให้คุณ
3. จากนั้นหาค่าสูงสุดของพลังงานที่ปล่อยออกมาจากรายการ มองหาดัชนีรายการที่มีกำลังสูงสุดเนื่องจากวิธีที่รวดเร็วกว่าในการค้นหาความถี่ที่เชื่อมโยงกับกำลังนั้น สุดท้ายส่งคืนความถี่สูงสุด เนื่องจากเราจำเป็นต้องป้อนสัญญาณความถี่ไบนารีลงในโค้ด VHDL ในภายหลัง เราจึงสามารถแปลงความถี่ในโฟลตเป็นไบนารีและส่งคืนได้
ขั้นตอนที่ 5: การสุ่มตัวอย่าง Python และ FFT (แสดงรหัสและผลลัพธ์)
ในขั้นตอนนี้ เครดิตแบบเต็มไปที่ลิงค์ด้านล่างสำหรับการสุ่มตัวอย่างและ FFT
samcarcagno.altervista.org/blog/basic-sound…รหัสของเรา:
หลังจากติดตั้ง pylab และ scipy แล้ว ไฟล์ wav จะสามารถนำเข้าและอ่านได้
จากการนำเข้า pylab* จาก scipy.io นำเข้า wavfile
sampFreq, snd = wavfile.read('440_sine.wav')
จากนั้น snd.shape จะแสดงจุดตัวอย่างและจำนวนช่องสัญญาณ ในกรณีของเรา จุดตัวอย่างขึ้นอยู่กับความยาวของ wavfile และ # ของช่องคือ 2 เนื่องจากเป็นสเตอริโอ
จากนั้น snd = snd / (2.**15)…… xlabel('Time (ms)')
จัดระเบียบสัญญาณเวลาเป็นอาร์เรย์
จากนั้น FFT จะสร้างอาร์เรย์ในความถี่และขนาด (กำลัง)
จากนั้นชั่วขณะหนึ่งจะวนรอบขนาดสูงสุดและความถี่ที่เกี่ยวข้อง ความถี่/2 นั้นแทนระดับเสียงของ wavfile
จากนั้นใช้รหัสของเราเอง จำนวนเต็มที่แทนความถี่จะถูกแปลงเป็นเลขฐานสอง 12 บิต และไฟล์ข้อความถูกสร้างขึ้นด้วยตัวเลขนั้น
ขั้นตอนที่ 6: Vivado (ตัวเปรียบเทียบ)

ในส่วนนี้ของกระบวนการ เราจำเป็นต้องมีตัวเปรียบเทียบเพื่อเปรียบเทียบความถี่อินพุตสองแบบ
1. สร้างตัวเปรียบเทียบเพื่อเปรียบเทียบว่าความถี่อินพุต (ตัวรับ) สูงกว่า ต่ำกว่า หรืออยู่ในช่วงระยะขอบ 2 Hz ที่กำหนดไว้ (จูนเนอร์กีต้าร์ทั่วไปมีตั้งแต่ e2 ถึง g5, 82 Hz ถึง 784 Hz)
2. เมื่อสร้างมาร์จิ้น 2 Hz เราใช้ RCA เพื่อเพิ่ม “00000000000010” ให้กับความถี่ของตัวรับ และตรวจสอบว่ามันยังคงต่ำเกินไปสำหรับอินพุตของผู้ใช้ หากเป็นกรณีนี้ สัญญาณบิตเดียว "สูง" <= '0', "ต่ำ" <= '1' จากนั้นเราเพิ่ม “00000000000010” ให้กับอินพุตของผู้ใช้ ดูว่าอินพุตของตัวรับสูงกว่านั้นหรือไม่ หากเป็นกรณีนี้ "สูง" <= '1', "ต่ำ" <= '0' ทั้งสองกรณีจะไม่ส่งคืน '0'
3. เนื่องจากส่วนถัดไปของโมดูลต้องการข้อมูล 4 บิตเฉพาะเพื่อบอกว่าบันทึกผู้รับคืออะไร ไม่เพียงแต่ส่งคืนผลลัพธ์เปรียบเทียบ 2 รายการ (ต่ำและสูง) เราจำเป็นต้องส่งคืนรหัสที่เกี่ยวข้องเพื่อบันทึก ซึ่งเชื่อมโยงกับ ความถี่ โปรดดูแผนภูมิด้านล่าง:
ค | 0011
C# | 1011
ด | 0100
D# | 1100
อี | 0101
F | 0110
F# | 1110
G | 0111
G# | 1111
A | 0001
A# | 1001
ข | 0010
ใช้ if หลายคำสั่งเพื่อจัดหมวดหมู่เป็นบันทึกย่อและเข้ารหัสเป็นสิ่งที่จำเป็นสำหรับตัวถอดรหัสเซ็กเมนต์เจ็ดส่วน
ขั้นตอนที่ 7: ภาพของบอร์ดพื้นฐาน 3

ขั้นตอนที่ 8: Vivado (ตัวถอดรหัสเซ็กเมนต์ 7 ส่วนพร้อมมัลติเพล็กซ์)

ทุกอย่างต้องการจอแสดงผล เป็นปัจจัยสำคัญที่กำหนดมูลค่าของการออกแบบ ดังนั้น เราจำเป็นต้องสร้างจอแสดงผลโดยใช้ตัวถอดรหัสเจ็ดส่วน ซึ่งจะทำให้เราสามารถแสดงความสามารถของเราในการออกแบบเครื่องรับสัญญาณบนบอร์ด B นอกจากนี้ยังช่วยเราในการทดสอบและแก้ไขจุดบกพร่อง
ตัวถอดรหัสเจ็ดส่วนประกอบด้วยอินพุตชื่อ Note, ต่ำ, สูงและ CLK ในขณะที่ส่งออก SSEG, AN และ Fiz_Hz มีรูปภาพของบล็อกไดอะแกรมด้านบนเพื่อช่วยให้เราเข้าใจการออกแบบ
จุดประสงค์ของการมีอินพุตต่ำและสูงสองช่องแยกกันคือเพื่อให้ผู้ออกแบบเครื่องเปรียบเทียบมีอิสระในการจัดการว่าความถี่เสียง (คลื่น) สูงหรือต่ำกว่าความถี่อินพุต (Fix_Hz) ที่ผู้ใช้ต้องการเปรียบเทียบ นอกจากนี้ SSEG ที่ส่งออกยังแสดงถึงการแสดงผลเจ็ดส่วนและจุดถัดไปในขณะที่ AN แสดงถึงขั้วบวกที่ชุดของเจ็ดส่วนจะแสดงขึ้น
ในตัวถอดรหัสเจ็ดส่วนนี้ นาฬิกา (CLK) มีบทบาทสำคัญในการแสดงค่าที่แตกต่างกันสองค่าบนแอโนดที่แตกต่างกันตั้งแต่สองค่าขึ้นไป เนื่องจากบอร์ดไม่อนุญาตให้เราแสดงค่าที่แตกต่างกันสองค่าพร้อมกัน เราจึงต้องใช้มัลติเพล็กซ์เพื่อแสดงค่าทีละค่า ในขณะที่เปลี่ยนเป็นค่าอื่นได้เร็วพอที่สายตาของเราไม่สามารถจับได้ นี่คือจุดที่อินพุต CLK เข้ามาเล่น
สำหรับข้อมูลเพิ่มเติม โปรดดูที่ซอร์สโค้ด
ขั้นตอนที่ 9: Vivado (การรวมส่วนประกอบ)
เมื่อทุกโมดูล (ตัวรับหลาม ตัวเปรียบเทียบ ตัวถอดรหัสเจ็ดส่วน ฯลฯ) เสร็จสมบูรณ์ เราจะรวมเข้าด้วยกันโดยใช้โมดูลที่ใหญ่กว่า เช่นเดียวกับรูปภาพในส่วน "ภาพรวม" ที่แสดง เราเชื่อมต่อแต่ละสัญญาณตามลำดับ สำหรับการอ้างอิง โปรดตรวจสอบซอร์สโค้ดของเรา "SW_Hz.vhd"
ขอขอบคุณ. หวังว่าคุณจะสนุก.
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน

การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน

การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน

วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน

การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน

เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง