电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>Arduino音乐:音符和和弦检测器

Arduino音乐:音符和和弦检测器

2023-06-26 | zip | 0.01 MB | 次下载 | 免费

资料介绍

描述

问题:

由于内存和处理能力有限,很难在 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. 引脚分配:

根据所附的引脚分配需要修改。对于我的实验,我将其保留在模拟引脚 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 微秒延迟)。此代码适用于钢琴和其他一些乐器。

我希望这段代码和教程对您与音乐相关的项目有所帮助。如有任何疑问或建议,请随时沟通。


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费