利用傅里叶变换求得音频数据的频率,根据音高频率对照表,可测试出吉他每根弦与标准音的差值,实现调音器效果。

目录

  • 程序效果
  • 实现过程
  • 样例代码
  • 测试用例
  • 参考资料

程序效果

截图1:程序效果

输入需要调整的弦,即开始录音,弹对应的弦即可,录音时间大约10秒,10秒后短暂计算处理后会显示结果。

实现过程

截图2:流程图

主要步骤如上,需要注意的细节有:

1.如何获取有效的4096个采样数据点

截图3:有效数据前的杂音及静音数据

本程序强行跳过前8000个采样数据点,并且用600进行边界判定,从第一个大于600的点开始采集。这要求使用的环境很安静才行,如果有其他声音干扰,对结果有较大影响。

2.6弦的特殊情况 :1-5弦使用正常时,6弦的频率值一直为正常值的2倍,无法定位问题情况下,强行将结果除以2,保证功能可以正常使用。

样例代码

1.下载链接:https://download.csdn.net/download/u013025955/11190369

部分主要代码

//傅里叶变换
void getFFTEnergy(double *data)
{double pr[DATASIZE], pi[DATASIZE], fr[DATASIZE], fi[DATASIZE];int i=0;//原始数据作为实部,虚部填0.0for (i=0; i<DATASIZE; i++){pr[i] = *(data+i);pi[i] = 0.0;}/*入参解释:pr:采样数据的实部,对应PCM数据,返回傅里叶变换的模(能量)pi:采样数据的虚部,填0.0,返回傅里叶变换的幅角,本程序不使用DATASIZE:采样点数,这里对应409612:采样点数4096对应是2的12次方fr:傅里叶变换后的实部fi:傅里叶变换后的虚部0:使用傅里叶变换功能,1为逆变换1:计算模和幅角,0的话不会计算,这里要注意*///调用FFT快速离散傅里叶变换函数kfft(pr, pi, DATASIZE, 12, fr, fi, 0, 1);//模(能量)返回for (i=0; i<DATASIZE; i++){*(data+i) = pr[i];}
}//换算频率
double getFrequence(double *data, int chooseStr)
{int locate; //能量值对应的横坐标int i;double frequence; //频率double max; //能量最大值max = *data;//求能量最大值对应的横坐标for (i=0; i<(DATASIZE/2); i++){if (*(data+i) > max){max = *(data+i);locate = i;}}//计算频率,频率=横坐标*(采样率/采样点数)frequence = locate*(8000.0/DATASIZE); //6弦的特殊处理,除以2if (chooseStr == 6){frequence = frequence/2.0;}return frequence;
}

测试用例

截图4:测试用例

参考资料

1.《常用算法程序集(C语言描述)》FFT快速离散傅里叶变换例程

2.深入浅出解释FFT(一)——用fft求频谱

https://blog.csdn.net/wordwarwordwar/article/details/68951388

3.fseek()用法 设定文件的当前读写位置

https://blog.csdn.net/Tian_fourpieces/article/details/79970098

【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现相关推荐

  1. 吉他调音器的使用方法(一分钟学会)

    吉他调音器的使用方法(一分钟学会) | 浏览:5488 | 更新:2015-03-12 16:07 | 标签:音乐 1 2 3 4 5 6 7 有人朋友说看了好多调音器的使用方法,搞的有点烦不胜烦,于 ...

  2. 基于matlab的吉他调音器APP(提供附件下载)

    这篇文章是DSP实验课的期末大作业,我做的内容太简单了,就搬运一下同学,写的比较详细,也有matlab app,附件以积分下载 附件下载地址 目录 1.功能介绍: 2.使用介绍: 3.文件构成: 4. ...

  3. 基于Arduino开发板的吉他调音器

    嗨,大家好,在过去几周里,我一直在努力重新拾起对吉他的热爱.弹奏吉他是我几年前在弹奏萨克斯管之前选择放松的方式.回到吉他上,经过3年很少弹奏和弦之后,我发现不再知道每根琴弦应该如何发声,用我朋友的话说 ...

  4. Android吉他调音器,GuitarTuna

    GuitarTuna吉他调音器是一款在全世界的范围内都非常受欢迎的软件,众多吉他手倾力推荐,简单.快捷.方便是这款软件的标签,让你在吉他调音的时候不再受到器材的限制,如果你也玩吉他的话,那么久赶快来下 ...

  5. 本科生尝试安卓APP开发:手机调音器节拍器(音乐学习者使用)

    目录 写在前面 本项目的灵感来源 作品完成度 项目介绍 APP的名字:沐尘调音器 APP功能介绍 调音器 节拍器 实际测试 调音器测试 节拍器测试 项目内容 开发环境 APP功能原理 1.调音器-编程 ...

  6. Android 调音器开发

    什么是调音器? 是一种乐器的辅助工具,用于各种弦乐器的调音,包括吉他调音器,贝斯调音器,钢琴调音器,古筝调音器,尤克里里调音器等.可根据乐音的频率判断所处的音符,从而校准改弦是否需要拧紧或者放松. T ...

  7. 微信小程序开发语言的选择

    微信使用的开发语言和文件很「特殊」. 小程序所使用的程序文件类型大致分为以下几种: ①WXML(WeiXin Mark Language,微信标记语言) ②WXSS(WeiXin Style Shee ...

  8. 微信小程序 #开发者工具 无法 在 资源管理器中 #右键 #新建page 的问题。

    微信小程序 #开发者工具 无法 在 资源管理器中 #右键 #新建page 的问题. 初学者怎么解决呢,建议尝试在设置(setting)_通用设置 _中更改语言,一般有"系统语言". ...

  9. 微信小程序开发语言(微信小程序开发教程)详细步骤

    微信小程序开发语言 开发微信小程序用什么语言 1.微信小程序开发所需要的语言比较特别,首先介绍一下需要使用到的文件类型大致分为:WXML(WeiXin Mark Language 微信标记语言).WX ...

最新文章

  1. 阿里云:国际化是云计算技术能力的照妖镜
  2. 【RocketMQ工作原理】offset管理
  3. MVC把随机产生的字符串转换为图片
  4. 前端一HTML:十七:背景
  5. SD-WAN和虚拟专用网之间有什么区别?虚拟专用网会被替代吗?
  6. P1903 [国家集训队]数颜色 / 维护队列
  7. 交换机的一些常见网络命令
  8. propertysource注解 找不到文件_WinXP系统电脑开机提示windows找不到null文件的解决方法...
  9. Scala教程之:Scala基础
  10. 【转载】C#中可使用string.Empty代表空字符
  11. 为什么要在WebAssembly中使用Rust?
  12. android sharedpre,android 数据存储一SharedPrenference存储简单数据
  13. Data Pump failed with ORA-04031/ORA-4030?
  14. composer安装及artisan运行问题【小记】
  15. 推荐几个SQL在线学习网站
  16. 无线路由器和无线网卡的普及知识贴及选择(2019.05更新802.11AX网卡,3T3R wave2路由器推荐)
  17. 调用百度api 生成短网址
  18. 手机点餐系统概述_廖师兄 微信点餐系统 springcloud学习笔记
  19. linux下下载fnl数据,使用python直接提取fnl再分析资料的气象因子数据
  20. 表格中自动布局注意和使用自动计算行高

热门文章

  1. php 接入海康平台
  2. 计量经济学 分布滞后模型案例
  3. 2021年防爆电气考试报名及防爆电气新版试题
  4. 杰卡德相似度(Jaccard)详解及在UserCF中的应用
  5. debiansamba文件服务器,Debian安装Samba服务器
  6. STM32单片机下载调试解决方案 e-link32
  7. todesk显示已登录在_ToDesk
  8. 【Gazebo仿真·一】Gazebo + Moveit + ur5e机械臂仿真
  9. {} == {}和{} === {}都是fasle
  10. 夏普SH6310C使用小结