【小程序】C语言吉他调音器-利用FFT傅里叶变换求频率实现
利用傅里叶变换求得音频数据的频率,根据音高频率对照表,可测试出吉他每根弦与标准音的差值,实现调音器效果。
目录
- 程序效果
- 实现过程
- 样例代码
- 测试用例
- 参考资料
程序效果
截图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傅里叶变换求频率实现相关推荐
- 吉他调音器的使用方法(一分钟学会)
吉他调音器的使用方法(一分钟学会) | 浏览:5488 | 更新:2015-03-12 16:07 | 标签:音乐 1 2 3 4 5 6 7 有人朋友说看了好多调音器的使用方法,搞的有点烦不胜烦,于 ...
- 基于matlab的吉他调音器APP(提供附件下载)
这篇文章是DSP实验课的期末大作业,我做的内容太简单了,就搬运一下同学,写的比较详细,也有matlab app,附件以积分下载 附件下载地址 目录 1.功能介绍: 2.使用介绍: 3.文件构成: 4. ...
- 基于Arduino开发板的吉他调音器
嗨,大家好,在过去几周里,我一直在努力重新拾起对吉他的热爱.弹奏吉他是我几年前在弹奏萨克斯管之前选择放松的方式.回到吉他上,经过3年很少弹奏和弦之后,我发现不再知道每根琴弦应该如何发声,用我朋友的话说 ...
- Android吉他调音器,GuitarTuna
GuitarTuna吉他调音器是一款在全世界的范围内都非常受欢迎的软件,众多吉他手倾力推荐,简单.快捷.方便是这款软件的标签,让你在吉他调音的时候不再受到器材的限制,如果你也玩吉他的话,那么久赶快来下 ...
- 本科生尝试安卓APP开发:手机调音器节拍器(音乐学习者使用)
目录 写在前面 本项目的灵感来源 作品完成度 项目介绍 APP的名字:沐尘调音器 APP功能介绍 调音器 节拍器 实际测试 调音器测试 节拍器测试 项目内容 开发环境 APP功能原理 1.调音器-编程 ...
- Android 调音器开发
什么是调音器? 是一种乐器的辅助工具,用于各种弦乐器的调音,包括吉他调音器,贝斯调音器,钢琴调音器,古筝调音器,尤克里里调音器等.可根据乐音的频率判断所处的音符,从而校准改弦是否需要拧紧或者放松. T ...
- 微信小程序开发语言的选择
微信使用的开发语言和文件很「特殊」. 小程序所使用的程序文件类型大致分为以下几种: ①WXML(WeiXin Mark Language,微信标记语言) ②WXSS(WeiXin Style Shee ...
- 微信小程序 #开发者工具 无法 在 资源管理器中 #右键 #新建page 的问题。
微信小程序 #开发者工具 无法 在 资源管理器中 #右键 #新建page 的问题. 初学者怎么解决呢,建议尝试在设置(setting)_通用设置 _中更改语言,一般有"系统语言". ...
- 微信小程序开发语言(微信小程序开发教程)详细步骤
微信小程序开发语言 开发微信小程序用什么语言 1.微信小程序开发所需要的语言比较特别,首先介绍一下需要使用到的文件类型大致分为:WXML(WeiXin Mark Language 微信标记语言).WX ...
最新文章
- 阿里云:国际化是云计算技术能力的照妖镜
- 【RocketMQ工作原理】offset管理
- MVC把随机产生的字符串转换为图片
- 前端一HTML:十七:背景
- SD-WAN和虚拟专用网之间有什么区别?虚拟专用网会被替代吗?
- P1903 [国家集训队]数颜色 / 维护队列
- 交换机的一些常见网络命令
- propertysource注解 找不到文件_WinXP系统电脑开机提示windows找不到null文件的解决方法...
- Scala教程之:Scala基础
- 【转载】C#中可使用string.Empty代表空字符
- 为什么要在WebAssembly中使用Rust?
- android sharedpre,android 数据存储一SharedPrenference存储简单数据
- Data Pump failed with ORA-04031/ORA-4030?
- composer安装及artisan运行问题【小记】
- 推荐几个SQL在线学习网站
- 无线路由器和无线网卡的普及知识贴及选择(2019.05更新802.11AX网卡,3T3R wave2路由器推荐)
- 调用百度api 生成短网址
- 手机点餐系统概述_廖师兄 微信点餐系统 springcloud学习笔记
- linux下下载fnl数据,使用python直接提取fnl再分析资料的气象因子数据
- 表格中自动布局注意和使用自动计算行高
热门文章
- php 接入海康平台
- 计量经济学 分布滞后模型案例
- 2021年防爆电气考试报名及防爆电气新版试题
- 杰卡德相似度(Jaccard)详解及在UserCF中的应用
- debiansamba文件服务器,Debian安装Samba服务器
- STM32单片机下载调试解决方案 e-link32
- todesk显示已登录在_ToDesk
- 【Gazebo仿真·一】Gazebo + Moveit + ur5e机械臂仿真
- {} == {}和{} === {}都是fasle
- 夏普SH6310C使用小结