在java中记录音频并实时确定是否播放了x频率的音调如果是的话做一些事情

2023-12-07

我希望能够使用 java 检测预定频率的音调。我正在做的是播放一个音调(音调的频率根据用户输入而变化),并且我试图检测音调是否具有特定频率。如果是,我执行某种方法。根据我读到的内容,我需要 FFT,但我不确定如何在 java 中实现它。似乎有很多关于如何执行此操作的文档,但其中的文档涉及查看音频文件而不是实时分析。我不需要将音频保存到文件中,只需确定是否以及何时录制频率 x 的音调。

理想情况下,我希望以 44KHz 的采样率进行录制,并在确定是否检测到音调后,确定检测到音调的时间,精度为 +-3ms。然而,只要不荒谬(即+100ms),低于此的精度也是可以接受的。从我查到的内容中,我大致知道我需要做什么,但我需要帮助将它们整合在一起。使用伪代码,它看起来大致像这样(我认为)

请注意,我大致知道何时可以检测到满意频率的音调在 +-1 秒内

for(i = 0, i < 440000 * 2, i++){//*2 because of expected appearance interval;may change
    record sound sample
    fft(sound sample)
    if(frequencySoundSample > x){
        do something
        return
    }
}

播放音调时会有相当大的背景噪音。然而,音调将具有非常高的频率,例如 15-22KHz,因此我相信,通过简单地查找录音机何时检测到非常高的频率,我可以确定这是我的音调(而且音调也会以高振幅可能持续 0.5 秒或 1 秒)。我知道不会有其他高频声音作为背景噪音(我预计背景频率可能高达 5KHz)。

那我有两个问题。我提供的伪代码足以满足我想要做的事情吗?如果不是,或者有更好的方法,我完全赞成。其次,我如何在java中实现这个?我明白我需要做什么,但我很难将它们整合在一起。我对java很了解,但我不熟悉音频涉及的语法,而且我没有任何fft经验。请明确并给出带有注释的代码。我已经尝试解决这个问题有一段时间了,我只需要看到它们全部联系在一起。谢谢。

EDIT

我知道使用像我这样的 for 循环不会产生我想要的频率。更多的是粗略地展示我想要的东西。也就是说,随着时间的推移,同时记录、执行 fft 和测试频率。


如果您只是寻找特定频率,那么基于 FFT 的方法对于您的特定应用来说可能不是一个好的选择,原因有两个:

  1. 这是多余的——你计算整个频谱只是为了检测某一点的幅度

  2. 为了获得 3 ms 的起始检测分辨率,您需要连续 FFT 之间有很大的重叠,这比仅仅处理连续的样本块需要更多的 CPU 带宽

检测单个音调是否存在的更好选择是戈策尔算法(又名 Goertzel 过滤器)。它实际上是在单个频域仓上评估的 DFT,并广泛用于音调检测。它是much计算成本比 FFT 低,实现起来非常简单,并且您可以在每个样本上测试其输出,因此不存在分辨率问题(物理定律规定的问题除外)。您需要对输出的幅度进行低通滤波,然后使用某种阈值检测来确定音调的开始时间。

请注意,SO 上已经有许多关于音调检测和使用 Goertzel 算法的有用问题和答案(例如精确的音调开始/持续时间测量?) - 我建议阅读这些内容以及维基百科条目作为一个很好的起点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java中记录音频并实时确定是否播放了x频率的音调如果是的话做一些事情 的相关文章

  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • Javadoc 链接到其他类中的方法

    目前我正在使用以下 Javadoc 语法引用其他类中的方法 see link com my package Class method 据我从文档中了解到 这是执行此操作的正确方法 但现在到了有趣的部分 或者说令人沮丧的部分 当我生成这个 j
  • 在 libgdx 中批处理多维数据集时出现问题

    我正在尝试开发一款游戏 在屏幕上渲染多达 300 个立方体 为每个多维数据集创建新的 modelInstance 时 modelBatch 的性能非常糟糕 据我所知 没有 3d 批处理可以将所有立方体批处理到一次绘制调用 所以我拼命地尝试以
  • Google API - 重定向 URI 不匹配错误

    我正在我的网络应用程序上实现 google 登录 我通过参考this尝试过link https developers google com web signin server side flow 我的 google 登录按钮如下 div s
  • 从 Windows Batch (cmd.exe) 中的文件读取环境变量

    我正在尝试从批处理文件中读取变量 以便稍后在批处理脚本 Java 启动器 中使用 理想情况下 我希望所有平台 Unix Windows 上的设置文件都具有相同的格式 并且也是有效的 Java 属性文件 也就是说 它应该看起来像这样 sett
  • .NET 世界有 Maven 替代方案或端口吗?

    NET 世界有 Maven 替代方案或端口吗 我很想使用 Java 世界拥有的良好依赖管理系统 但我没有找到任何可与 NET 项目相媲美的系统 NMaven http incubator apache org nmaven 是第一个 官方努
  • 如何增加使用 SAX 解析 XML 文件的entityExpansionLimit

    我正在尝试使用 Java 中的 SAX 解析器解析一个 1 23 GB 的 XML 文件 我使用的是 Mac 操作系统和 JDK 1 7 0 51 不幸的是 我收到以下错误 The pasrser has encountered more
  • 将 Swing 集成到简单的文本冒险游戏中

    我对 Java 中的一些中级概念相当陌生 最近 我制作了一款名为 DazzleQuest 的文本冒险游戏 它完全在开发者控制台 终端中运行 它涉及到我的朋友作为角色 所以我想向他们展示它 并通过将命令行的功能和控制台的输出转移到一个简单的
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • 不带破折号的 CliBuilder 参数

    使用 Groovy CliBuilder 理想情况下我希望有一个命令行 如下所示 MyProgram groovy CommandName arg1 arg2 arg3 是否可以使用 CliBuilder 解析提取 CommandName
  • 异步不适用于控制器的抽象超类方法

    我有一个BaseRestControllerRest 控制器扩展的类 它有一个我想异步运行的方法 public abstract class BaseRestController Async someThreadPoolTaskExecut
  • CompletableFuture SupplyAsync

    我刚刚开始探索 Java 8 的一些并发特性 让我有点困惑的一件事是这两个静态方法 CompletableFuture
  • AVAudioPlayer 重置当前播放的声音并从头开始播放

    我在使用 AVAudioPlayer 时遇到问题 我想重置当前正在播放的播放器并再次播放 我尝试以下但没有运气 声音播放一次 但第二次我选择按钮时它会停止声音 第三次再次启动声音 Stop the player and restart it
  • 如何查找类路径中具有指定名称的所有资源?

    我想列出类路径中具有特定名称的所有文件 我预计会发生多次 因此Class getResource String 不管用 基本上 我必须识别类路径中任何位置具有特定名称 例如 xyz properties 的所有文件 然后累积读取其中的元数据
  • 如何使用 Java Streams API 将 Map 列表与列表值合并?

    我怎样才能减少Map
  • Android Studio错误的含义:未注释的参数覆盖@NonNull参数

    我正在尝试 Android Studio 创建新项目并添加默认值后onSaveInstanceState方法创建 MyActivity 类 当我尝试将代码提交到 Git 时 我收到一个我不明白的奇怪错误 代码是这样的 我得到的错误是这样的
  • 如何在 Windows 上使用 Java Hotspot JVM 禁用小型转储 (mdmp) 文件生成

    目前 我有一个已部署的可执行 jar 文件 该文件在崩溃时会创建大型 7 Gb 小型转储文件 我想要一个导致崩溃原因的文本表示 而不是 JVM 状态的二进制文件 我尝试使用中找到的信息这个 CodeRanch 帖子 http www cod
  • 如何使用现代.fxml和controller.java在javafx 2.x中制作自动完成组合框[重复]

    这个问题在这里已经有答案了 如何使用现代 fxml 和controller java 在 javafx 2 x 中制作一个类似的自动完成组合框 就像制作这个一样 http blog ngopal com np 2011 07 04 auto
  • 如何在不下载子项的情况下从 Firebase 获取子项密钥?

    我有一个 Firebase 数据库 其中的节点 items 有很多子项 我想导入子项键的列表 由于每个子项都包含相当多我对此不感兴趣的数据 因此我想仅下载子项密钥 以最大程度地减少传输的数据量 为了便于说明 假设我有以下数据结构 然后我想获
  • Java Media API:java media api 下载

    我在哪里可以找到javax media jar 文件 在sun站点它下载一个安装程序 有没有可用的java媒体jar 没有 javax media 具体是 jar 文件 该包位于 jmf jar 文件中 您需要运行安装程序并取出 jar 或

随机推荐