使用 java [重复] 确定给定一个字节 [] 记录的音频数据的频率

Posted

技术标签:

【中文标题】使用 java [重复] 确定给定一个字节 [] 记录的音频数据的频率【英文标题】:determine frequency given a byte[] of recorded audio data using java [duplicate] 【发布时间】:2013-09-09 04:06:55 【问题描述】:

我一直在研究如何确定原始音频的频率。似乎有很多关于它的信息,但我一直无法找到使用java的简单实现。我想要做的是将具有 44.1K 元素的字节数组划分为大小为 44 的样本(丢弃剩余部分),并确定每个样本中是否有超过 18KHz 的音调(我试图找到音调录制过程中播放的声音被麦克风拾取)。如果需要,我可以使用更大的样本,但每个样本 44 个元素将是理想的。我知道我可能需要使用 FFT,但数学对我来说有点沉重。我曾尝试使用 goertzel 算法分析阵列,但无法得到确凿的结果。然后我的问题是我如何将具有 44.1K 元素的字节数组划分为 1002 个样本,确定每个样本的频率(或检测样本的频率是否超过 18KHz),以及如何实现这个示例.请给出代码或伪代码。我已经阅读了很多文档,我只需要查看一个示例。

【问题讨论】:

你真的应该坚持使用 Goertzel 方法而不是 FFT,因为我在回复 your previous question 时给出的原因。 【参考方案1】:

关于java中的FFT,看看Reliable and fast FFT in Java

其他一切都只是一个循环:

for (int i=0; i<sampleArray.length; i+=44) 
    if (findOver18KHz(sampleArray, i, i++44)) 
        // found tone over 18KHz
    


/**
 * Check for a tone over 18KHz
 */
boolean findOver18KHz(int[] samples, start, end) 
  // call the FFT stuff
  // make sure you don't get an ArrayOutOfBoundsException for samples.

【讨论】:

以上是关于使用 java [重复] 确定给定一个字节 [] 记录的音频数据的频率的主要内容,如果未能解决你的问题,请参考以下文章

面经字节Java工程师(123+HR面)

如何检查字节数组是不是包含 Java 中的 Unicode 字符串?

如何检查字节数组是否包含Java中的Unicode字符串?

使用字节[]的Java下载文件[重复]

通过使用 BCEL 解析 Java 字节码来确定 LCOM4(方法中缺乏内聚)

Java常量池基本概念