当前位置: 首页 > news >正文

基于Android乐音识别(2)

目录

  1. 傅里叶变换

  2. matlab代码实现&&仿真

  3. 基频提取比对

傅里叶变换

距离上一次更新博客,已经好久了,相信看了我上一篇文章的,现在对我的这篇文章可能比较期待了,这个更新晚的原因一个是由于最近课程比较紧,所以对于乐音识别的研究搁置了一段时间,再就是其中也出现了一些问题,导致我们改变了一下自己的策略。

进入正题,学过高数的同学,对傅里叶变化这个概念应该都不会陌生,但是具体是做什么的呢?知乎上之前看到一篇文章,关于傅里叶变换的,讲的非常详细,附带个地址。傅里叶分析之掐死教程(完整版)对于我们之前的信号,我们的分析都是在时域上的,对于在时域上的信号
只是根据我们的量化程度,对于幅度所采取的一个表示方式,但是对于我们确定它具体是哪一个音阶是无法实现的,所以需要我们对其进行傅里叶变化,将其从时域信号图转化到我们的频域上来,然后根据相关的频域参数来确定我们其具体是属于哪一个音阶。在做傅里叶变化的时候遇到了一个小坑,导致在这上面纠结了很久,一个是因为对于matlab不是很熟悉,再就是本身现在在做的事情就是点歪的一个技能点。通过对声音进行傅里叶变化,我们也可以做一些很有趣的事情,比如根据电话按键的声音对于相应的按键的监听,因为在电话出现时,没有数字信号这回事,所以也就不存在一些数字处理器,所以对于电话的按键,是对于电话按键的声音的模拟信号进行监听来确定的,每一个按键都是由两个不同的频率进行叠加来得到的,所以我们可以对电话的按键音,进行一个切割,将有声段拿出来之后,做一个傅里叶变化得到其中的两个频率,然后和相依的频率表进行一个比对,这也是之前新闻上说的某少年获取周鸿祎手机号的方法。

Matlab的实现和仿真

[y, Fs] = audioread('/Users/chenjensen/Desktop/record.mp3');
plot(abs(fft(y)))

通过audioread来读取我们的音频文件,这里的y是关于音频的数字信号序列,Fs是我们的采样频率,通过利用fft得到如下图
图片描述
我们之前讲过通过傅里叶变化,我们可以得到这个声音的频率,似乎我们的事情已经结束了,得到一个接近1600的值,这也是之前犯得一个错误,这里提供的声音是我们中音D,其频率523.25,但是这里得到确实这么大,公式也是没有错的,开始这让我怀疑我才去这种提取基频的方式不对,最终被同学发现了错误,就是x轴单位的问题,我们通过fft变化,x轴的最大范围是我们的采样频率,而其每个单位确并不是1,而是我们的采样频率/采样点数,按照这种思路再来做一个计算

z=44100/length(y)

z = 0.3300

通过对原图形进行放大,最后发现该值接近于1590
计算我们的这两个值的乘积:1590*0.3300=524.7000
和我们的原始数据523.25非常接近了,我们通过这个大概可以估计出我们的音阶了。
当然这里还存在的一个疑问是我们得到的一个口琴的音,不可能只是单纯的存在一个频率的,一个声音肯定是由多个音叠加而成的,只是在该音阶,该种频率表达的更为充分,然后我们可以利用这个频率来表示这个音阶,我们要取的频率是其在y轴上的值最大的。同时对于傅里叶的变化我们得到图形是对称的,我们只需要取其前面一部分。

基频提取和比对

通过对于基频的提取和比对,我们可以得到我们的当前的音阶。

该文只是单纯针对傅里叶变化展开,连接上篇文章,我们提取出来有声段之后,就可以对这些有声段进行一个傅里叶变化来获取其频率值,而不是像对其全部进行傅里叶变化。

具体的实现细节,将会在后续文章更新,欢迎各位一起交流提升。

下篇更新Android中java代码的具体实现,项目也会在github开源。

相关文章:

  • FormData在IE下上传文件报unexpected end of stream的一种解法
  • 实现strstr函数
  • js日期格式化的方法
  • iOS之库
  • Android Fragment生命周期图以及Activity与Fragment生命周期对照图
  • 基于.NET 的WebSocket 的简单实例 --- 数据格式
  • c#进程间通信(Inter-Process Communication)
  • vim简单的文本编辑命令
  • 【BZOJ】2879: [Noi2012]美食节
  • gulp 教程
  • 虚拟化之vmx配置文件
  • 致北京
  • 二进制方式快速安装MySQL数据库
  • 沙盒 文件操作
  • PHP上传(单个)文件示例
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 2019.2.20 c++ 知识梳理
  • Flex布局到底解决了什么问题
  • LintCode 31. partitionArray 数组划分
  • log4j2输出到kafka
  • Vue.js源码(2):初探List Rendering
  • VuePress 静态网站生成
  • 大整数乘法-表格法
  • 服务器之间,相同帐号,实现免密钥登录
  • 说说动画卡顿的解决方案
  • 微信公众号开发小记——5.python微信红包
  • 小李飞刀:SQL题目刷起来!
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 数据库巡检项
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (libusb) usb口自动刷新
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (原創) 未来三学期想要修的课 (日記)
  • (转)LINQ之路
  • (转)linux 命令大全
  • **PHP分步表单提交思路(分页表单提交)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Web项目创建比较不错的参考文章
  • .Net小白的大学四年,内含面经
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Android]通过PhoneLookup读取所有电话号码
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [bzoj1912]异象石(set)
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [CodeForces-759D]Bacterial Melee
  • [CTO札记]如何测试用户接受度?
  • [Deepin 15] 编译安装 MySQL-5.6.35