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

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

Raspberry Pi的吉他调谐器

时间:2017-05-18 09:27来源:未知 作者:admin 点击:
步骤4:在代码的深度阐释 要运行的代码,只需运行Python freqdetect .py终端后,导航到你的代码中的目录。 停止程序,使用Ctrl+C组合键。 代码也改变了默认的一个,你可以收听一个选项。 当调整,通常音乐家使用440
Raspberry Pi的吉他调谐器

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

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

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

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

部分:你需要什么

不是有很多的工具,这个项目需要。它看起来那么简单。下面假设你有一个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:搭建电路

搭建电路

首先,我们需要建立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() 
 
#p#分页标题#e#

步骤4:在代码的深度阐释

要运行的代码,只需运行“Python freqdetect .py”终端后,导航到你的代码中的目录。停止程序,使用Ctrl+C组合键。

代码也改变了默认的一个,你可以收听一个选项。当调整,通常音乐家使用440赫兹的调整。然而,不同风格的音乐可以定义一个不同的调整的结果,我们的程序允许你对任何一个在415赫兹到445赫兹的曲调。指定优化,运行:

Python freqdetect.py <一>一些频率

如果你没有代码的细节感兴趣,你可以跳到下一步!这是所有你需要的指导让它运行。

如果房间里很安静,你会看到很多的调试信息,随着“检测频率。按Ctrl-C退出。”然后,演唱或演奏一个E,A,G,D,B!你应该看到一股“你扮演的是一个__!”或“你__!”LED应把绿色调,红色和蓝色的锐利,平。

频率检测:

而真正的:
而_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 
 #使用二次插值在最大
 adjfreq =!= 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 >

这一部分是修改后的版本中发现的原源

这是频率检测的主要部分。我们可以用pyaudio,样品流的音频是由USB麦克风捕获。这是分配给audio_data,这是一个系列的16位数字。然而,16位数字是艰苦的工作,所以它是标准的漂浮物(主要是小数位)。

然后用<em>快速傅立叶变换</em>(<strong>FFT</strong>)来转换数据的样本空间。然后用汉明窗函数的卷积来隔离我们的样本(2048)。

一旦我们在样本空间的数据,我们寻找最大值在所有的样品和使用插值计算赫兹的频率。然后,这个值是检查是否高于我们的笔记我们想检测阈值(50赫兹,在这种情况下)。如果是的话,那价值传递到下一节。否则,我们输出一个可能的值作为一个标志。

分转换:

#美分转换
如果(adjfreq!= 9999):
 adjfreq = 1200 * log2(relative_freq / adjfreq)/ 100 
 adjfreq = adjfreq % 12 <BR>

如果值是有意义的(不是9999赫兹)将频率分。最后一节,我们检测到的频率数据的最高点。<trans data-src="If you were thinking, " wait="" a="" sec,="" doesn't="" that="" mean="" we="" might="" get="" harmonic="" as="" our="" frequency="" which="" was="" specifically="" mentioned="" in="" step="">如果你在想,“等一等,并不意味着我们可以为我们的频率是第一步特别提到得到调和吗?”你是<strong>绝对正确的</strong>。这就是仙来。

仙是一个计量单位,线性笔记就调谐频率,在我们的情况下,任何一个我们所选择的频率。一切都是那么的调谐频率relative_freq步骤一些整数的数量来衡量的。然而,这并不能完全解决我们的问题,作为一个低E2依然会迷路。较低的E2是29,而高E4是5。

为了解决这个问题,我们采取<em>模</em>这一步的距离相对于一个倍频程(12注)。这给了我们一个纯净的音符,不管它是因为我们线性数据距离从A.,所有的笔记可以用一个整数表示。全音阶的E可以减少距离,半步半步,走的是从(这恰好是5:E,F,G,G F #,#,A)。关于谐波的思维,他们都是一些整数倍的根本。因此,乘以整数不会改变的距离,由模产生的余数是相同的。整洁的!

这分转换通过案例陈述。

案例陈述:

<P> #案例陈述<BR>如果ABS(adjfreq - note_e4)<1:
 
 #调E 
如果ABS(adjfreq - note_e4)<0.1:
打印(“你扮演一个E
 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。低)< /

现在的分值与它的距离理想的分值。如果是在0.1从理想的注意,我们把它调。连接到绿色引脚上的LED的GPIO引脚设置为高。

否则,如果分值低于理想,从而更接近,我们说这是锋利的。连接到红销LED设置为高,其他所有GPIO引脚是低的,我们没有得到一个组合的RGB。

最后,如果该值大于理想的距离,越来越远了,它是平的。连接到LED蓝腿的GPIO引脚设置为高,LED变成蓝色。

如果你想得到更多或更少的宽容是在调整,调整0.1在每个case语句的敏感性都适合您的需要。

步骤5:参考资料与演示

这里提供的是:

  • 该芯片14引脚和7段显示参考表和引脚布局。
  • 文件说明如何确定频率和音调算法代码。
  • 链接到项目日志:https://storify.com/fouriers_cat

还包括我们的代码演示视频和电路工作。

 
  • sa03-11ewa.pdfsa03-11ewa.pdf
    下载
  • 47.pdf47.pdf
    下载
  • yin_algorithm.pdfyin_algorithm.pdf
    下载
  • mpm_pitch.pdfmpm_pitch.pdf
    下载

步骤6:(未来实现):七段显示器的电路

(未来实现):七段显示器的电路

本节是一个不完整的实现。我们有问题是,PI无法到7段提供5V,9V电池,使用包括使用一个分压器,增加了复杂的电路。风险自负,记住,<strong>永远尊重电流限制。</strong>

在你想插你的七段显示器的电路。你必须确保每一丝被送入七段显示器是通过电阻(470欧姆),第一次喂,七段显示不超载。你也需要一个驱动芯片(sn74ls47n)让您输入的代码将被翻译成正确的硬件。无论是芯片和七段显示器将由5V电源供电(电池),将接地以附加文件的硬件。当你插入电线从芯片到七段显示确认通知信的芯片的数据表进行匹配与字母在七段显示图。堵这两个设备连接在一起的结果应该允许硬件跟随电路的输出功能。确保插头输入可编程逻辑为驱动芯片或将有显示无输出。输入要插入芯片作为代码指令。

 
  • sa03-11ewa.pdfsa03-11ewa.pdf

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