Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频。

1、AudioSystem获取音频

奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频率,我们的采样速率必须是人类听觉范围的两倍。人类能听到的声音频率范围大约在20Hz到20000Hz之间,所以在录制音频的时候采样率大多是44100Hz。这是大多数标准MPEG-1 的采样率。44100这个值最初来源于索尼,因为它可以允许音频在修改过的视频设备上以25帧(PAL)或者30帧( NTSC)每秒进行录制,而且也覆盖了专业录音设备的20000Hz带宽。所以当你在选择录音的频率时,选择44100Hz就好了。

定义音频格式:

public static float sampleRate = 44100;

public static int sampleSizeInBits = 16;

public static int channels = 2; // double

public static boolean signed = true; // Indicates whether the data is signed or unsigned

public static boolean bigEndian = true; // Indicates whether the audio data is stored in big-endian or little-endian order

public AudioFormat getFormat() {

return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,

bigEndian);

}

调用麦克风获取音频,保存到out中

public static ByteArrayOutputStream out = new ByteArrayOutputStream();1

try {

AudioFormat format = smartAuto.getFormat(); // Fill AudioFormat with the settings

DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

startTime = new Date().getTime();

System.out.println(startTime);

SmartAuto.line = (TargetDataLine) AudioSystem.getLine(info);

SmartAuto.line.open(format);

SmartAuto.line.start();

new FileAnalysis().getDataToOut("");

while (smartAuto.running) {

checkTime(startTime);

}

SmartAuto.line.stop();

SmartAuto.line.close();

} catch (Throwable e) {

e.printStackTrace();

}

获取到的out数据需要通过傅里叶变换,从时域信号转换为频域信号。

傅里叶变换

public Complex[] fft(Complex[] x) {

int n = x.length;

// 因为exp(-2i*n*PI)=1,n=1时递归原点

if (n == 1){

return x;

}

// 如果信号数为奇数,使用dft计算

if (n % 2 != 0) {

return dft(x);

}

// 提取下标为偶数的原始信号值进行递归fft计算

Complex[] even = new Complex[n / 2];

for (int k = 0; k < n / 2; k++) {

even[k] = x[2 * k];

}

Complex[] evenValue = fft(even);

// 提取下标为奇数的原始信号值进行fft计算

// 节约内存

Complex[] odd = even;

for (int k = 0; k < n / 2; k++) {

odd[k] = x[2 * k + 1];

}

Complex[] oddValue = fft(odd);

// 偶数+奇数

Complex[] result = new Complex[n];

for (int k = 0; k < n / 2; k++) {

// 使用欧拉公式e^(-i*2pi*k/N) = cos(-2pi*k/N) + i*sin(-2pi*k/N)

double p = -2 * k * Math.PI / n;

Complex m = new Complex(Math.cos(p), Math.sin(p));

result[k] = evenValue[k].add(m.multiply(oddValue[k]));

// exp(-2*(k+n/2)*PI/n) 相当于 -exp(-2*k*PI/n),其中exp(-n*PI)=-1(欧拉公式);

result[k + n / 2] = evenValue[k].subtract(m.multiply(oddValue[k]));

}

return result;

}

计算out的频域值

private void setFFTResult(){

byte audio[] = SmartAuto.out.toByteArray();

final int totalSize = audio.length;

System.out.println("totalSize = " + totalSize);

int chenkSize = 4;

int amountPossible = totalSize/chenkSize;

//When turning into frequency domain we'll need complex numbers:

SmartAuto.results = new Complex[amountPossible][];

DftOperate dfaOperate = new DftOperate();

//For all the chunks:

for(int times = 0;times < amountPossible; times++) {

Complex[] complex = new Complex[chenkSize];

for(int i = 0;i < chenkSize;i++) {

//Put the time domain data into a complex number with imaginary part as 0:

complex[i] = new Complex(audio[(times*chenkSize)+i], 0);

}

//Perform FFT analysis on the chunk:

SmartAuto.results[times] = dfaOperate.fft(complex);

}

System.out.println("results = " + SmartAuto.results.toString());

}

java 音色识别_Java实现Shazam声音识别算法相关推荐

  1. java 音色识别_Java实现Shazam声音识别算法的实例代码

    Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理告诉我们,为了能捕获人类能听到的声音频 ...

  2. Java实现Shazam声音识别算法

    Java实现Shazam声音识别算法 Shazam算法采用傅里叶变换将时域信号转换为频域信号,并获得音频指纹,最后匹配指纹契合度来识别音频. 1.AudioSystem获取音频 奈奎斯特-香农采样定理 ...

  3. java 加密工具包_Java加密和解密算法调用工具包

    软件架构及说明 1.本工具包基于纯java编写而成: 2.部分算法密钥对基于bcprov-jdk16的调用生成. 3.部分加密与解密算法来自网上公开的源码,并在此基础上进行整理和优化而来: 4.本加密 ...

  4. java 图片识别_JAVA识别图片中的文字

    最近在需求上有一个识别图片中的文字功能,查询了不少资料,发现可以使用tess4j识别图像文字:话不多说现在开始: 首先创建Spring Boot项目:导入以下依赖 net.sourceforge.te ...

  5. java动物识别_java编写的专家系统(人工智能)动物识别

    import java.awt.*; //包含用于建立用户界面和绘制图形图像的全部类 import java.awt.event.*;   //提供处理由 AWT 组件所激发的各种事件的接口和类人工智 ...

  6. java 屏幕识别_Java课程设计:捕获图片以及识别图中的文字

    package屏幕捕捉以及识别;importjava.awt.Color;importjava.awt.FlowLayout;import java.awt.event.*;importjava.aw ...

  7. java 下载限速_Java 文件下载限流算法

    在做文件下载功能时,为了避免下载功能将服务器的带宽打满,从而影响服务器的其他服务.我们可以设计一个限流器来限制下载的速率,从而限制下载服务所占用的带宽. 一.算法思路 定义一个数据块chunk(单位 ...

  8. java实现分而治之_java中的分而治之算法

    我必須用Java編寫一個使用分治法的 算法.給定一個數組V,其中n個int元素 該算法應該計算兩個連續出現的次數.java中的分而治之算法 例如:如果V = [3, 0, 0, 1, 0, 1, 3, ...

  9. java 二分查找_JAVA 实现二分查找算法。我知道你会,但没你想象的那么简单

    二分查找算法定义:二分查找(binary search),也称折半搜索,是一种在 有序数组 中 查找某一特定元素 的搜索算法.搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结 ...

最新文章

  1. 中兴再夺PCT国际专利申请榜首:连续7年位居前三
  2. 基于jQuery带图标的多级下拉菜单
  3. 【python毕业设计】Django框架实现学生信息管理系统
  4. 一定要多读多记FreeEIM
  5. DataSet 添加数据集、行、列、主键和外键等操作示例
  6. c语言程序设计第一课作业,C语言程序设计第一课答案.doc
  7. 东大OJ 2SAT 异或
  8. Beta冲刺Day4
  9. word中的总页数不包括封面、目录
  10. 四、 vSphere 6.7 U1(四):部署VCSA
  11. 管家婆仓库管理软件到底选哪个好?
  12. 蓝图出炉:大家将能够利用英伟达技术打造自己的自动驾驶车辆
  13. Word转换pdf文件之好用的pdf虚拟打印机
  14. 【Python入门教程】第04篇 Hello World程序
  15. sonyxz2刷机教程,日版au刷欧版
  16. unity 使物体跟随路径点自动移动位置 插值旋转
  17. 360校招失败的慘痛经历
  18. for /f 用法详解
  19. Kerberos原理
  20. 云起实验室:零基础入门Serverless:一键部署红白机小游戏

热门文章

  1. 如何变得更聪明?看这46招
  2. 初识BoTNet:视觉识别的Bottleneck Transformers
  3. 电脑网络能用,但是无法访问网页问题
  4. HTML+CSS:设计一个网站登录页面 学起来很简单
  5. 思想的四个组成部分及分类
  6. git commit 报错fatal: unable to access
  7. 莱斯特大学计算机科学,莱斯特大学高级计算机科学研究生语言及申请要求-费用-课程设置...
  8. MATLAB: 用MATLAB发送邮件(以163邮箱为例)
  9. GAMP_INS 从零开始实现PPP/INS紧组合(一)
  10. 什么是版权,怎么申请