最好的电子音响科技diy制作网站

haoDIY_音响电子电脑科技DIY小制作发明

Raspberry Pi的吉他调谐器

时间:2017-05-18 09:27来源:未知 作者:admin 点击:
这个项目的目的是通过使用Raspberry Pi的创建一个吉他调音器。 为什么不买一个吉他调音器? 因为买吉他调音器不提供任何功能角度对频率和音调之间的差异。 这个项目的目的是学习如何从每个吉他弦检测特定的频率,并允许用户与调谐器通过软件,我们用Python写
 Raspberry Pi的吉他调谐器

这个项目的目的是通过使用Raspberry Pi的创建一个吉他调音器。为什么不买一个吉他调音器?因为买吉他调音器不提供任何功能角度对频率和音调之间的差异。这个项目的目的是学习如何从每个吉他弦检测特定的频率,并允许用户与调谐器通过软件,我们用Python写的互动。程序将显示的注意,被用户播放,包括是否注意的是尖锐的或平。就像一个商店买了吉他调音器,用户能够玩吉他不断检查他们是否在调吉他。

最大的障碍,防止爱好者从建设自己已经理解的振动和频率之间的差异,以及如何让软件识别差异。在这方面我们会用麦克风来测量<em>物理</em>方面的声音频率签证VI。然而,在音乐方面也有一个方面的音调,这通常是一个<em>感知</em>方面的声音。通常,在一定的频率播放声音的音调将调整为球场上是双重的,一样的,或一半的参考声的音调。这很重要,因为大多数时候,距是一个音的频率成正比,但是如果一个音的响度增加超过一定点,然后音高检测需要通过调整来补偿声音的强度更高。

如果你看看波形上面,你可以看到一系列的弹奏吉他弦产生的频率。注意上图是E2,这是82赫兹。然而,在声音最激烈的,最高的频率大约是240赫兹,在三倍的基本频率。这是一个<em>谐波</em>的频率。因此,一个简单的检测频率不会工作,因为它会检测最强烈的频率,240赫兹。到<strong>基频</strong>(真实频率的注意我们扮演)我们要有点创意。

步骤1:部分:你需要什么

 Raspberry Pi的吉他调谐器

不是有很多的工具,这个项目需要。它看起来那么简单。下面假设你有一个PI已经设置(WiFi /操作系统/等)<strong>和连接显示</strong>。显示可以在网络或HDMI电缆连接到一个显示器/电视一个SSH连接。

该项目使用了Raspberry Pi的2像素通过HDMI连接戴尔的显示器使用杰西OS。

零件清单:

1)2面包板

2)4个电阻(1K欧姆)

3)Raspberry Pi的2或更高

4)RGB LED

5)canakit带状电缆和GPIO接口

6)几种连接线

7)USB麦克风

如果你想尝试另外的7段:

8)sn74ls47n芯片

9)7电阻(470欧姆)

10)9V电池连接器

11)9伏电池

12)七段显示

注意,下面的7部分是不完整的,并在Raspberry Pi的GPIO实验。

步骤2:搭建电路

 Raspberry Pi的吉他调谐器

首先,我们需要建立LED电路。注意,我们使用LED,共有4针。每个LED需要一个电阻1000欧姆电阻每个引脚的LED。还注意到,一出LED的四引脚比其他三长,接地最长的带状电缆的Raspberry Pi的GPIO用色线之间的连接引脚26上的GPIO端口和最长的LED引脚。LED的三引脚应该连接到引脚5,6,16因此,如下:“红丝”引脚5,“蓝线”和“绿色引脚6,引脚16线”。

步骤3:代码

让你的Raspberry Pi Python的运行,你需要连接到你的PI与HDMI线看它的显示,或使用SSH的PI打开终端。

曾经在一个终端或命令行环境的PI,执行下面的代码:

  • sudo apt-get install Python NumPy
  • sudo apt-get install python opencv
  • sudo apt-get install Python SciPy
  • sudo apt-get install Python pyaudio Python3 pyaudio

这些命令将你的PI,允许你编辑和部署Python代码安装NumPy、SciPy环境。

所有的代码,你将需要运行这个项目可以在GitHub上的项目发现:

https://github.com/katrinamo/rpipitch

它包含GPIO测试文件,以确保你的Raspberry Pi的GPIO是一起工作的一个程序来测试MATLAB的绘图功能。matlab绘制主要用于调试和开发的基音检测。<em>它是可选的安装</em>。你真的只需要上面的包使它工作。

也可以将代码复制并粘贴以下:

#THIS CODE IS HEAVILY BASED ON: <br># <a href="https://benchodroff.com/2017/02/18/using-a-raspberry-pi-with-a-microphone-to-hear-an-audio-alarm-using-fft-in-python/" rel="nofollow">  https://benchodroff.com/2017/02/18/using-a-raspbe...>
#/usr/bin/env python
import pyaudio
from numpy import zeros,linspace,short,fromstring,hstack,transpose,log2, log
from scipy import fft, signal
from time import sleep
from scipy.signal import hamming, convolve
import matplotlib.pyplot as plt
import RPi.GPIO as GPIO
import sys
#from findfundfreq import *
#Volume Sensitivity, 0.05: Extremely Sensitive, may give false alarms
#             0.1: Probably Ideal volume
#             1: Poorly sensitive, will only go off for relatively loud
SENSITIVITY= 1.0
#Bandwidth for detection (i.e., detect frequencies within this margin of error of the TONE)
BANDWIDTH = 1
# Show the most intense frequency detected (useful for configuration)
frequencyoutput=True #notes in cents
Note_E = 5
Note_A = 0
Note_D = 7
Note_G = 2
Note_B = 10
Note_E4= 5 #holds previous frequency
prevFreq = 0
z1 = 10
z2 = 0
z0 = 0
MIN_FREQUENCY = 60
MAX_FREQUENCY = 500
#Max & Min cent value we care about
MAX_CENT = 11
MIN_CENT = 0
RELATIVE_FREQ = 440.0
if len(sys.argv) > 1:
	if (sys.argv[1] >= 415.0 and sys.argv[1] <= 445.0):
		RELATIVE_FREQ = sys.argv[1]#GPIO set up for the Red Green and Blue colors
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT)
GPIO.setup(6, GPIO.OUT)
GPIO.setup(13, GPIO.OUT) #Set up audio sampler - 
NUM_SAMPLES = 2048
SAMPLING_RATE = 48000
pa = pyaudio.PyAudio()
_stream = pa.open(format=pyaudio.paInt16,
                  channels=1, rate=SAMPLING_RATE,
                  input=True,
                  frames_per_buffer=NUM_SAMPLES)
print("Detecting Frequencies. 按Ctrl-C退出。”)
去= 10 
 #而去> 0:
而真实:
而_stream。get_read_available() < num_samples:睡眠(0.01)
 audio_data = fromstring(_stream。读(
 _stream。get_read_available()),D =短)[:] num_samples 
 #每个数据点有符号的16位号码,所以我们可以规范分32×1024 
 normalized_data = audio_data / 32768 
 
 W =汉明(2048)
强度= ABS(W * FFT(normalized_data))[ 2 ]:num_samples / 
如果输出:
 =强度[ 1 ]。argmax() + 1 
 #使用二次插值在最大
!= Len(强度)1:
 Y0,Y1,Y2 = log(强度[ which-1:+ 2:])
 X1 =(Y2 - y0)* 5 /(2×y1 - y2 y0)
 #找到频率和输出:它
 thefreq =(+ X1)* sampling_rate / num_samples 
如果thefreq < min_frequency或thefreq > max_frequency:
 adjfreq = - 9999 
别的:
 thefreq =,* sampling_rate / num_samples 
如果thefreq > min_frequency:
 adjfreq = thefreq 
 # adjfreq = 140 
 #打印(“候选频率:”,candidate_freq,这
 #系统)。stdout。写(“频率:%d \r“%(adjfreq))
 #系统。flush() stdout!= 9999):
 #打印“原始频率:”,adjfreq 
 adjfreq = 1200 * log2(relative_freq / adjfreq)/ 100 
 adjfreq = adjfreq % 12 
 #打印adjfreq 
 #案例陈述
如果ABS(adjfreq - note_e4)<1:
 
 #调E 
如果ABS(adjfreq - note_e4)<0.1:
打印(“你了
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)#绿色
 #夏普E 
 elif(adjfreq - note_e4)<0:
打印(“你是锋利的
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。低)
 #平E 
 elif(adjfreq - note_e4)> 0:
打印(“你是平的
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 elif ABS(adjfreq - note_e)<1:
 
 #调E 
如果ABS(adjfreq - note_e)<0.1:
打印(“你
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)
 #夏普E 
 elif(adjfreq - note_e)<0:
打印(“你是
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。低)
 #平E 
 elif(adjfreq - note_e)> 0:
打印(“你是平的
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 elif ABS(adjfreq - note_b)<1:
 
 #调B 
如果ABS(adjfreq - note_b)<0.1:
打印(“你
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)
 #锋利的B 
 elif(adjfreq - note_b)<0:
打印(“你是夏普(
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。低)
 #平B 
 elif(adjfreq - note_b)> 0:
打印(“你是平的(B
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 elif ABS(adjfreq - note_g)<1:
 
 #调G 
如果ABS(adjfreq - note_g)<0.1:
打印(“你
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)#绿色
 #尖锐的G 
 elif(adjfreq - note_g)<0:
打印(“你是夏普(G
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。低)
 #平G 
 elif(adjfreq - note_g)> 0:
打印(“你是平的(G
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 
 elif ABS(adjfreq - note_d)<1:
 
 GPIO输出(5,GPIO。低
输出(GPIO)。6、GPIO。低)
 GPIO输出(13,GPIO。高)
 
 #调D 
如果ABS(adjfreq - note_d)<0.1:
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)#绿色
 #夏普D 
 elif(adjfreq - note_d)<0:
打印(“你是夏普(D
 GPIO输出(13,GPIO。低)
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 #平D 
 elif(adjfreq - note_d)> 0:
打印(“你是平的(D
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 elif ABS(adjfreq - note_a)<1:
 
 #合拍一
如果ABS(adjfreq - note_a)<0.2:
打印(“你
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)#绿色
 #夏普
 elif(adjfreq - note_a)<0:
打印(“你是锋利的
 GPIO输出(13,GPIO。低)
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 #平
 elif(adjfreq - note_a)> 0:
打印(“你是平的
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 elif ABS(adjfreq - 12)<1:
 
 #合拍一
如果ABS(adjfreq - 12)<0.2:
打印(“你
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。高)#绿色
 #夏普
 elif(adjfreq - 12)<0:
打印(“你是锋利的
 GPIO输出(13,GPIO。低)
 GPIO输出(5,GPIO。高)#红
 GPIO输出(6,GPIO。低)
 #平
 elif(adjfreq - 12)> 0:
打印(“你是平的
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。高)#蓝
 GPIO输出(13,GPIO。低)
 #全部关闭
别的:
 GPIO输出(5,GPIO。低)
 GPIO输出(6,GPIO。低)
 GPIO输出(13,GPIO。低)
 #系统里。写(“分:%s R“% adjfreq)
 #系统里。flush() 
 

      
      (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
相关文章
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片