要运行的代码,只需运行“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语句的敏感性都适合您的需要。