สารบัญ:
- ขั้นตอนที่ 1: รายการอุปกรณ์ (ถ่ายรูปบอร์ดและคอมพ์ของ Kevin)
- ขั้นตอนที่ 2: ภาพรวม
- ขั้นตอนที่ 3: ไฟล์ Wav
- ขั้นตอนที่ 4: Python- การใช้ Pylab และ Scipy
- ขั้นตอนที่ 5: การสุ่มตัวอย่าง Python และ FFT (แสดงรหัสและผลลัพธ์)
- ขั้นตอนที่ 6: Vivado (ตัวเปรียบเทียบ)
- ขั้นตอนที่ 7: ภาพของบอร์ดพื้นฐาน 3
- ขั้นตอนที่ 8: Vivado (ตัวถอดรหัสเซ็กเมนต์ 7 ส่วนพร้อมมัลติเพล็กซ์)
- ขั้นตอนที่ 9: Vivado (การรวมส่วนประกอบ)
![จูนเนอร์: 9 ขั้นตอน จูนเนอร์: 9 ขั้นตอน](https://i.howwhatproduce.com/images/001/image-621-95-j.webp)
วีดีโอ: จูนเนอร์: 9 ขั้นตอน
![วีดีโอ: จูนเนอร์: 9 ขั้นตอน วีดีโอ: จูนเนอร์: 9 ขั้นตอน](https://i.ytimg.com/vi/cVlF3CjKjaQ/hqdefault.jpg)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
![Image Image](https://i.howwhatproduce.com/images/001/image-621-97-j.webp)
![](https://i.ytimg.com/vi/8dJtsDYa-jk/hqdefault.jpg)
![รายการอุปกรณ์ (ถ่ายรูปบอร์ดและคอมพ์ของเควิน) รายการอุปกรณ์ (ถ่ายรูปบอร์ดและคอมพ์ของเควิน)](https://i.howwhatproduce.com/images/001/image-621-98-j.webp)
โปรเจ็กต์นี้ออกแบบมาเพื่อสร้างจูนเนอร์กีต้าร์โดยใช้ Vivado และจอแสดงผล 7 ส่วน เมื่อจูนเนอร์พบความถี่ของเสียงที่ป้อนเข้ามา จูนเนอร์จะเปรียบเทียบค่านั้นกับรายการค่าที่ฮาร์ดโค้ดสำหรับความถี่ที่แน่นอนซึ่งเรียกว่าความถี่มาตรฐานสำหรับระดับเสียงที่ถูกต้องของโน้ต จากนั้นจูนเนอร์จะแสดงว่าเสียงที่คุณป้อนนั้นอยู่ใกล้หรือไกลจากโน้ตที่คุณต้องการ สิ่งที่น่าสนใจคือคลื่นเสียงเป็นการผสมผสานระหว่างรูปคลื่นไซน์หลายรูปที่มีส่วนประกอบจริงและองค์ประกอบจินตภาพ แม้ว่าสิ่งนี้อาจดูยากสำหรับผู้ที่ไม่คุ้นเคย แต่ก็มีบางวิธีที่เราสามารถวิเคราะห์คลื่นด้วยค่าจริงและค่าจินตภาพได้
การสาธิต:
ขั้นตอนที่ 1: รายการอุปกรณ์ (ถ่ายรูปบอร์ดและคอมพ์ของ Kevin)
อันดับแรก เราต้องการบอร์ด Basys 3 และคอมพิวเตอร์ที่รองรับโปรแกรมต่อไปนี้ Garageband/Audacity หรือ DAW อื่น - เพื่อบันทึกผ่านไมโครโฟนและส่งออกไฟล์ wavfiles
Python - สามารถใช้ pylab และ scipy สำหรับการสุ่มตัวอย่างและ fft
Vivado - เพื่อเชื่อมต่อกับบอร์ด Basys 3 และดูผลลัพธ์ด้วยสายตา
ขั้นตอนที่ 2: ภาพรวม
![ภาพรวม ภาพรวม](https://i.howwhatproduce.com/images/001/image-621-99-j.webp)
จูนเนอร์ประกอบด้วยส่วนประกอบสำคัญสองสามอย่าง ได้แก่ ไมโครโฟน แซมเพลอร์ FFT (การแปลงฟูเรียร์แบบเร็ว) ตัวเปรียบเทียบ ตัวถอดรหัส และจอแสดงผล จุดประสงค์ของไมโครโฟนคือการจับสัญญาณเข้า แซมเพลอร์รับสัญญาณเอาท์พุตของไมโครโฟนและใช้ FFT เพื่อแปลงสัญญาณเป็นเอาต์พุตที่มีขนาดเป็นความถี่ จากนั้นใช้เอาต์พุตของ FFT และค้นหาขนาดสูงสุดและความถี่ที่เกี่ยวข้องหารด้วย 2 ความถี่ที่สัมพันธ์กับระดับเสียงของรูปคลื่นจะพบได้ ค่านั้นสามารถเข้าไปในตัวเปรียบเทียบได้ จากนั้นจะเปรียบเทียบกับตารางค้นหาซึ่งได้ตั้งค่าความถี่สำหรับระดับเสียงที่สมบูรณ์แบบของโน้ตทั้งหมดแล้ว เครื่องเปรียบเทียบจะได้รับอินพุตสำหรับโน้ตที่ต้องการ ซึ่งสามารถจับคู่โน้ตที่ต้องการกับความถี่ที่ถูกต้องจากตารางค้นหาได้ จากนั้นตัวเปรียบเทียบจะเลือกโน้ตที่มีความถี่ใกล้เคียงที่สุดกับความถี่สูงสุด เครื่องเปรียบเทียบจะเปรียบเทียบค่าทั้งสองและดูค่าของความถี่ที่ใกล้เคียงกันกับค่าที่ต้องการแล้วจึงใส่ข้อมูลนั้นลงในสัญญาณ เครื่องเปรียบเทียบจะส่งสัญญาณนั้นไปยังตัวถอดรหัส โดยที่ตัวถอดรหัสจะเลือกอินพุตสำหรับแอโนดของจอแสดงผล 7 ส่วนเพื่อแสดงความถูกต้องของโน้ต
ขั้นตอนที่ 3: ไฟล์ Wav
![ไฟล์ Wav ไฟล์ Wav](https://i.howwhatproduce.com/images/001/image-621-100-j.webp)
ในขั้นตอนนี้ เราจะนำไฟล์ wav ของ pitch และพยายามแสดงความถี่ของ pitch นั้น
ก่อนอื่นคุณต้องมีไฟล์ wav ของโน้ต ในตัวอย่างนี้ เราจะใช้ไฟล์สเตอริโอ wav 16 บิตที่มีอัตราการสุ่มตัวอย่าง 44.1kHz สามารถสร้างได้ใน DAW เช่น Garageband หรือดาวน์โหลด สำหรับตัวอย่างนี้ คลื่นไซน์ขนาด A4 440Hz ที่เราสร้างขึ้นบน Garageband สามารถดาวน์โหลดได้ที่นี่
ขั้นตอนที่ 4: Python- การใช้ Pylab และ Scipy
![Python- การใช้ Pylab และ Scipy Python- การใช้ Pylab และ Scipy](https://i.howwhatproduce.com/images/001/image-621-101-j.webp)
เราใช้ไลบรารี 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 (ตัวเปรียบเทียบ)
![วิวาโด (ตัวเปรียบเทียบ) วิวาโด (ตัวเปรียบเทียบ)](https://i.howwhatproduce.com/images/001/image-621-102-j.webp)
ในส่วนนี้ของกระบวนการ เราจำเป็นต้องมีตัวเปรียบเทียบเพื่อเปรียบเทียบความถี่อินพุตสองแบบ
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
![ภาพของบอร์ด BASYS 3 ภาพของบอร์ด BASYS 3](https://i.howwhatproduce.com/images/001/image-621-103-j.webp)
ขั้นตอนที่ 8: Vivado (ตัวถอดรหัสเซ็กเมนต์ 7 ส่วนพร้อมมัลติเพล็กซ์)
![Vivado (ตัวถอดรหัสเซ็กเมนต์ 7 ส่วนพร้อมมัลติเพล็กซ์) Vivado (ตัวถอดรหัสเซ็กเมนต์ 7 ส่วนพร้อมมัลติเพล็กซ์)](https://i.howwhatproduce.com/images/001/image-621-104-j.webp)
ทุกอย่างต้องการจอแสดงผล เป็นปัจจัยสำคัญที่กำหนดมูลค่าของการออกแบบ ดังนั้น เราจำเป็นต้องสร้างจอแสดงผลโดยใช้ตัวถอดรหัสเจ็ดส่วน ซึ่งจะทำให้เราสามารถแสดงความสามารถของเราในการออกแบบเครื่องรับสัญญาณบนบอร์ด B นอกจากนี้ยังช่วยเราในการทดสอบและแก้ไขจุดบกพร่อง
ตัวถอดรหัสเจ็ดส่วนประกอบด้วยอินพุตชื่อ Note, ต่ำ, สูงและ CLK ในขณะที่ส่งออก SSEG, AN และ Fiz_Hz มีรูปภาพของบล็อกไดอะแกรมด้านบนเพื่อช่วยให้เราเข้าใจการออกแบบ
จุดประสงค์ของการมีอินพุตต่ำและสูงสองช่องแยกกันคือเพื่อให้ผู้ออกแบบเครื่องเปรียบเทียบมีอิสระในการจัดการว่าความถี่เสียง (คลื่น) สูงหรือต่ำกว่าความถี่อินพุต (Fix_Hz) ที่ผู้ใช้ต้องการเปรียบเทียบ นอกจากนี้ SSEG ที่ส่งออกยังแสดงถึงการแสดงผลเจ็ดส่วนและจุดถัดไปในขณะที่ AN แสดงถึงขั้วบวกที่ชุดของเจ็ดส่วนจะแสดงขึ้น
ในตัวถอดรหัสเจ็ดส่วนนี้ นาฬิกา (CLK) มีบทบาทสำคัญในการแสดงค่าที่แตกต่างกันสองค่าบนแอโนดที่แตกต่างกันตั้งแต่สองค่าขึ้นไป เนื่องจากบอร์ดไม่อนุญาตให้เราแสดงค่าที่แตกต่างกันสองค่าพร้อมกัน เราจึงต้องใช้มัลติเพล็กซ์เพื่อแสดงค่าทีละค่า ในขณะที่เปลี่ยนเป็นค่าอื่นได้เร็วพอที่สายตาของเราไม่สามารถจับได้ นี่คือจุดที่อินพุต CLK เข้ามาเล่น
สำหรับข้อมูลเพิ่มเติม โปรดดูที่ซอร์สโค้ด
ขั้นตอนที่ 9: Vivado (การรวมส่วนประกอบ)
เมื่อทุกโมดูล (ตัวรับหลาม ตัวเปรียบเทียบ ตัวถอดรหัสเจ็ดส่วน ฯลฯ) เสร็จสมบูรณ์ เราจะรวมเข้าด้วยกันโดยใช้โมดูลที่ใหญ่กว่า เช่นเดียวกับรูปภาพในส่วน "ภาพรวม" ที่แสดง เราเชื่อมต่อแต่ละสัญญาณตามลำดับ สำหรับการอ้างอิง โปรดตรวจสอบซอร์สโค้ดของเรา "SW_Hz.vhd"
ขอขอบคุณ. หวังว่าคุณจะสนุก.
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
![การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน](https://i.howwhatproduce.com/images/001/image-2360-j.webp)
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
![การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน](https://i.howwhatproduce.com/images/002/image-5374-j.webp)
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
![วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน](https://i.howwhatproduce.com/images/004/image-9009-j.webp)
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
![การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน](https://i.howwhatproduce.com/images/007/image-19534-j.webp)
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
![เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน](https://i.howwhatproduce.com/images/008/image-21644-j.webp)
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง