资料介绍
描述
问题:
由于内存和处理能力有限,很难在 Arduino 上从音频信号中检测音符。检测精度因仪器而异。有些乐器(如钢琴)在有限的范围内是准确的,而有些乐器(如口琴)则准确度较低。
此代码使用了以前开发的称为 EasyFFT 的 FFT 代码。链接:https ://create.arduino.cc/projecthub/abhilashpatel121/easyfft-fast-fourier-transform-fft-for-arduino-9d2677
音符检测算法
如上一步所述,由于音频样本中存在多个频率,因此检测很困难。
该程序按以下流程工作:
1、数据采集:
- 本部分从音频数据中提取 128 个样本,两个样本之间的间隔(采样频率)取决于感兴趣的频率。在这种情况下,我们使用两个样本之间的间距来应用 Hann 窗函数以及振幅/RMS 计算。此代码还通过从 analogread 值中减去 500 来进行粗调归零。如果需要,可以更改此值。对于典型情况,这些值运行良好。此外,需要添加一些延迟以获得大约 1200Hz 的采样频率。在1200Hz采样频率的情况下最大可以检测到600HZ的频率。
for(int i=0;i<128;i++)
{
a=analogRead(Mic_pin)-500; //rough zero shift
sum1=sum1+a; //to average value
sum2=sum2+a*a; // to RMS value
a=a*(sin(i*3.14/128)*sin(i*3.14/128)); // Hann window
in[i]=4*a; // scaling for float to int conversion
delayMicroseconds(195); // based on operation frequency range
}
2.快速傅里叶变换:
数据准备就绪后,将使用EasyFFT执行 FFT 。此 EasyFFT 函数已修改为固定 128 个样本的 FFT。还修改了代码以减少内存消耗。原来的 EasyFFT 函数设计为最多 1028 个样本(使用兼容板),而我们只需要 128 个样本。与原始 EasyFFT 函数相比,此代码减少了大约 20% 的内存消耗。
FFT 完成后,代码会返回前 5 个最主要的频率峰值以供进一步分析。该频率按振幅降序排列。
3.音符检测:对于每个峰,代码检测可能与之关联的音符。此代码最多只能扫描 1200 Hz。不必注意与最大幅度相同的频率。
所有频率都映射在 0 到 255 之间,
这里检测到第一个八度,例如,65.4 Hz 到 130.8 代表一个八度,130.8 Hz 到 261.6 Hz 代表另一个。对于每个八度音程,频率从 0 映射到 255。这里映射从 C 开始到 C'。
if(f_peaks[i]>1040){f_peaks[i]=0;}
if(f_peaks[i]>=65.4 && f_peaks[i]<=130.8) {f_peaks[i]=255*((f_peaks[i]/65.4)-1);}
if(f_peaks[i]>=130.8 && f_peaks[i]<=261.6) {f_peaks[i]=255*((f_peaks[i]/130.8)-1);}
if(f_peaks[i]>=261.6 && f_peaks[i]<=523.25){f_peaks[i]=255*((f_peaks[i]/261.6)-1);}
if(f_peaks[i]>=523.25 && f_peaks[i]<=1046) {f_peaks[i]=255*((f_peaks[i]/523.25)-1);}
if(f_peaks[i]>=1046 && f_peaks[i]<=2093) {f_peaks[i]=255*((f_peaks[i]/1046)-1);}
NoteV 数组值用于将音符分配给检测到的频率。
byte NoteV[13]={8,23,40,57,76,96,116,138,162,187,213,241,255};
一种。注检测:
4. 在为每个频率计算音符后,可能存在多个暗示相同音符的频率。要有准确的输出代码还要考虑重复。该代码根据振幅顺序和重复次数将所有频率值相加,并以最大振幅使音符达到峰值。
B:和弦检测:
for (int i=0;i<12;i++)
{
in[20+i]=in[i]*in[i+4]*in[i+7];
in[32+i]=in[i]*in[i+3]*in[i+7]; //all chord check
}
此部分通过根据主要和次要代码组合将音符值相互相乘来检查所有和弦。本节还使用相同的输入数组进行数据存储。
此外,选择显示具有最大可能性(最大乘法)的和弦。
应用
使用代码很简单,但是,在使用时也需要牢记多个限制。代码可以复制,因为它用于纸币检测。使用它时需要考虑以下几点。
1. 引脚分配:
根据所附的引脚分配需要修改。对于我的实验,我将其保留在interwetten与威廉的赔率体系 引脚 7 上,
void setup()
{Serial.begin(250000);
Mic_pin = A7;
}
2.麦克风灵敏度:
需要修改麦克风灵敏度,这样可以生成具有良好振幅的波形。大多数情况下,麦克风模块带有灵敏度设置。选择适当的灵敏度,使信号既不会太小,也不会因振幅较高而被削掉。
3.振幅阈值:
仅当信号幅度足够高时,此代码才会激活。此设置需要由用户手动设置。该值取决于麦克风灵敏度和应用。
if(sum2-sum1>5){
.
.
在上面的代码中,sum2 给出 RMS 值,而 sum 1 给出平均值。所以这两个值之间的差异给出了声音信号的幅度。在我的例子中,它在 5 左右的振幅值下正常工作。
4. 默认情况下,此代码将打印检测到的注释。但是,如果您打算将票据用于其他目的,则应使用直接指定的号码。例如 C=0;C#=1,D=2,D#=3 及以后。
5. 如果仪器有更高的频率,代码可能会给出错误的输出。最大频率受采样频率限制。所以你可以在延迟值以下进行调整以获得最佳输出。在下面的代码延迟 195 微秒。可以对其进行调整以获得最佳输出。这将影响整体执行时间。
{ a=analogRead(Mic_pin)-500; //rough zero shift
sum1=sum1+a; //to average value
sum2=sum2+a*a; // to RMS value
a=a*(sin(i*3.14/128)*sin(i*3.14/128)); // Hann window
in[i]=4*a; // scaling for float to int conversion
delayMicroseconds(195); // based on operation frequency range
}
6. 此代码只能工作到 2000Hz 频率。通过消除采样之间的延迟,可以获得大约 3-4 kHz 的采样频率。
防范措施:
- 正如 EasyFFT 教程中提到的,FFT 会占用 Arduino 的大量内存。因此,如果您有一个需要存储一些值的程序,建议使用具有更高内存的板。
- 此代码可能适用于一种乐器/歌手,但不适用于另一种乐器/歌手。由于计算限制,实时准确检测是不可能的。
夏日的
音符检测是一项计算密集型工作,获得实时输出非常困难,尤其是在 Arduino 上。此代码可以提供大约 6.6 个样本/秒(添加 195 微秒延迟)。此代码适用于钢琴和其他一些乐器。
我希望这段代码和教程对您与音乐相关的项目有所帮助。如有任何疑问或建议,请随时沟通。
- 带LCD的Arduino EMF鬼检测器
- 使用Arduino和雨滴传感器的雨量检测器
- ARDUINO LPG气体泄漏检测器 0次下载
- Arduino使用KY-003或KY-035的磁场检测器
- 使用arduino UNO的轴检测器
- Arduino Uno掉电检测器和记录器
- Arduino Light Clapper使用声音检测器
- 和弦Netduino音乐播放器开源分享
- 一种基于检测器集层次聚类的否定选择算法 13次下载
- NDIR气体检测器解决方案和PID气体检测器解决方案
- 使用Arduino制作检测PM2.5检测器的程序详细资料免费下载 9次下载
- 电阻式温度检测器(RTD)基础知识及参考设计
- 车辆检测器的低功耗设计 13次下载
- 基于Arduino的PM2_5和温湿度实时检测器设计_叶金晶 17次下载
- 和弦音乐+语音报号+七彩背光+彩屏动画电路
- 电路检测器和电流检测器的区别 319次阅读
- 手机检测器电路图 手机检测器的功能和应用 652次阅读
- 简单的检测器电路图分享 1652次阅读
- 基于Arduino的音乐创作系统设计 962次阅读
- 什么是过零检测器 过零检测器的原理 2755次阅读
- 过零检测器的原理 3669次阅读
- 采用Arduino开发板、火焰传感器和蜂鸣器构建火感检测器系统 2384次阅读
- 基于555的声光数字电平检测器电路 2856次阅读
- 荧光检测器工作原理及特点 4.9w次阅读
- 地磁车辆检测器的应用领域_地磁车辆检测器与其他车辆检测威廉希尔官方网站 的优劣对比 4517次阅读
- 地磁车辆检测器主要组成部分 4833次阅读
- 微波运动检测器 4085次阅读
- 酸雨检测器 1.6w次阅读
- 过零检测器电路图2 4386次阅读
- 过零检测器电路图1 5060次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多