Android音频FFT显示基频

2023-12-12

我已经在一个 Android 项目上工作了一段时间,该项目显示输入信号的基频(充当调谐器)。我已经成功实现了 AudioRecord 类并正在从中获取数据。但是,我很难对此数据执行 FFT 来获取输入信号的基频。我一直在看帖子here,并且正在使用Java 中的 FFT and 复杂类随它去。

我已成功使用 Java 中的 FFT 中的 FFT 函数,但我不确定是否获得了正确的结果。对于 FFT 的幅度 (sqrt[rere+imim])我得到的值开始很高,大约 15000 Hz,然后慢慢减小到大约 300 Hz。似乎不对。

另外,就麦克风的原始数据而言,数据似乎很好,除了前 50 个值左右始终是数字 3,除非我仍在应用程序中再次按下调谐按钮,然后我只能得到大约15.这正常吗?

这是我的一些代码。

首先,我使用以下代码将短数据(从麦克风获得)转换为双精度数据:我一直在看的帖子。这段代码我不完全理解,但我认为它有效。

//Conversion from short to double
double[] micBufferData = new double[bufferSizeInBytes];//size may need to change
final int bytesPerSample = 2; // As it is 16bit PCM
final double amplification = 1.0; // choose a number as you like
for (int index = 0, floatIndex = 0; index < bufferSizeInBytes - bytesPerSample + 1; index += bytesPerSample, floatIndex++) {
    double sample = 0;
    for (int b = 0; b < bytesPerSample; b++) {
        int v = audioData[index + b];
        if (b < bytesPerSample - 1 || bytesPerSample == 1) {
            v &= 0xFF;
        }
        sample += v << (b * 8);
    }
    double sample32 = amplification * (sample / 32768.0);
    micBufferData[floatIndex] = sample32;
}

然后代码继续如下:

//Create Complex array for use in FFT
Complex[] fftTempArray = new Complex[bufferSizeInBytes];
for (int i=0; i<bufferSizeInBytes; i++)
{
    fftTempArray[i] = new Complex(micBufferData[i], 0);
}

//Obtain array of FFT data
final Complex[] fftArray = FFT.fft(fftTempArray);
final Complex[] fftInverse = FFT.ifft(fftTempArray);

//Create an array of magnitude of fftArray
double[] magnitude = new double[fftArray.length];
for (int i=0; i<fftArray.length; i++){
    magnitude[i]= fftArray[i].abs();
}


fft.setTextColor(Color.GREEN);
fft.setText("fftArray is "+ fftArray[500] +" and fftTempArray is "+fftTempArray[500] + " and fftInverse is "+fftInverse[500]+" and audioData is "+audioData[500]+ " and magnitude is "+ magnitude[1] + ", "+magnitude[500]+", "+magnitude[1000]+" Good job!");
for(int i = 2; i < samples; i++){
    fft.append(" " + magnitude[i] + " Hz");
}

最后一点只是为了检查我得到的值(并让我保持理智!)。在上面提到的帖子中,它谈到了需要采样频率并给出了以下代码:

private double ComputeFrequency(int arrayIndex) {
    return ((1.0 * sampleRate) / (1.0 * fftOutWindowSize)) * arrayIndex;
}

我该如何实现这段代码?我真的不明白 fftOutWindowSize 和数组 Index 来自哪里?

任何帮助是极大的赞赏!

Dustin


最近我正在做一个需要几乎相同的项目。也许你不再需要任何帮助,但无论如何我都会给出我的想法。也许将来有人需要这个。

  1. 我不确定短到双功能是否有效,我也不理解该代码片段。它是为字节到双精度转换而编写的。
  2. 在代码中:"double[] micBufferData = new double[bufferSizeInBytes];"我认为尺寸为micBufferData应该 ”bufferSizeInBytes / 2“,因为每个样本占用两个字节,并且大小micBufferData应该是样本号。
  3. FFT 算法确实需要 FFT 窗口大小,并且它必须是 2 的幂的数字。然而,许多算法可以接收任意数字作为输入,然后它将完成其余的工作。在那些算法的文档中应该有输入的要求。在您的情况下,Complex 数组的大小可以是 FFT 算法的输入。我真的不知道FFT算法的细节,但我认为不需要逆算法。
  4. 要使用您最后给出的代码,您应该首先在样本数组中找到峰值索引。我使用双数组作为输入而不是复杂,所以在我的例子中它是这样的:double maxVal = -1;int maxIndex = -1;

    for( int j=0; j < mFftSize / 2; ++j ) {
        double v = fftResult[2*j] * fftResult[2*j] + fftResult[2*j+1] * fftResult[2*j+1];
        if( v > maxVal ) {
            maxVal = v;
            maxIndex = j;
        }
    }
    

    2*j 是实部,2*j+1 是虚部。maxIndex是您想要的峰值幅度的索引(更多详细信息here),并将其用作ComputeFrequency功能。返回值是你想要的样本数组的频率。

希望它可以帮助某人。

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

Android音频FFT显示基频 的相关文章

  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • Android应用程序组件销毁和重新创建的详细信息

    有人可以向我提供一些具体的 值得信赖的 最好是简洁的 信息 内容如下 系统销毁和 如果适用 重新创建组件的顺序 片段 活动 活动的线程 异步任务 计时器 静态数据 类何时卸载 其他类中的线程 异步任务 定时器 主机 TabActivity
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • Dialog.setTitle 不显示标题

    我正在尝试向我的对话框添加自定义标题 但是每当我运行我的应用程序时 它都不会显示标题 我创建对话框的代码是 final Dialog passwordDialog new Dialog this passwordDialog setCont
  • ExoPlayer2 - 如何使 HTTP 301 重定向工作?

    我开始使用 ExoPlayer 来传输一些音频 一切都很顺利 直到我遇到一个带有 301 永久移动 重定向的 URL ExoPlayer2 默认情况下不处理该问题 我已经看过这个线程 https github com google ExoP
  • Android Studio 与本地网络共享上的项目文件

    这是我的设置 Android Studio 项目文件位于 Ubuntu 14 10 盒子上的共享文件夹中 尝试在 Windows 8 机器上运行 Android Studio 1 0 2 并将 U 驱动器映射到包含项目文件的 Ubuntu
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • WorkManager 或 AlarmManager 用于日常请求然后通知工作?

    这是用例 用户设置具有特定时间的每日通知 在指定时间 发出网络请求以获取一些数据 然后使用检索到的数据显示通知 我不确定是否应该使用 AlarmManager 还是 WorkManager 来实现这个用例 据我了解 AlarmManager
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android 中的处理程序与异步调用

    目前我正在使用处理程序来调用 Web 服务方法以使其在后台运行 问题是它需要更多的时间来给出响应 在性能方面似乎更昂贵 现在我计划使用异步调用 哪一个是最好的 Android 中的处理程序和异步调用有什么区别 请帮我想出一个最好的解决方案
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一

随机推荐

  • JavaFX 超高清 (4K) 视频

    我想使用 JavaFX 2 MediaPlayer 播放超高清 4K 视频 但只得到黑屏 在 JRE 8 Windows 7 上运行 没有错误消息 有谁知道 JavaFX 是否可以播放超高清 4K 视频或者我可以在哪里找到这些信息 谢谢 我
  • 如何使用 Discord.js 检查消息作者是否具有管理员角色?

    我正在构建一个 Discord 机器人 我想要一个if仅当消息作者在公会中具有管理员角色时才会执行该语句 我尝试过拥有特定于角色的权限 但这意味着机器人所在的所有服务器上都必须有完全相同的名称角色 如何检查消息作者是否具有管理员角色 该角色
  • ASP.NET MVC - TempData - 好的或坏的实践

    我正在使用AcceptVerbsScott Gu 的 Preview 5 博客文章中详细介绍了处理 ASP NET MVC 中表单条目的方法 用户通过 GET 获取一个空表单 用户通过 POST 将填写的表单发布到同一操作 该操作验证数据
  • Parallel.ForEach 和 async-await [重复]

    这个问题在这里已经有答案了 我有这样的方法 public async Task
  • 如何使用Qt禁用窗口的关闭按钮?

    我想在操作开始时禁用窗口 主应用程序窗口 上的关闭按钮 以便用户无法退出应用程序并在操作完成时再次启用它 我怎样才能在 Qt 应用程序中做到这一点 我的平台是windows 7 或者 如果用户按下关闭按钮并退出应用程序 我可以显示一条消息
  • Symfony2获取位于security.yml中的access_control参数

    我试图获取位于 security yml 中的 access control 参数作为自定义服务中的数组 就像获取 role hierarchy 参数一样 我认为它可以使用以下代码 accessParameters this gt cont
  • 在 Woocommerce 档案页面上显示特定产品属性

    我想在每个产品的商店页面上显示我选择的一些特定产品属性 有必要显示属性的名称及其值 我开始编写代码 我想至少打印名称 但我只显示最后一个属性的名称 add action woocommerce after shop loop item ad
  • 全局、函数、静态类方法

    假设您有一个唯一的对象 并且它被所有其他类和函数使用 类似于 application 您将如何在函数中访问该对象 在每个函数中使用全局变量 global application application gt doStuff 创建一个函数 例
  • 如何调试 JavaScript 错误?

    如何使用 Firebug 调试 java 脚本错误 复制 如何在 Firebug 的外部 JS 脚本中设置断点 使用 FireBug 进行调试 只需检查发生错误的行 然后在该行之前编写一个 调试器 调用 debugger Will invo
  • 在asp.net中的标签中显示SQL查询结果

    我试图在标签中显示 SQL 查询结果 但它没有显示 这是我的代码 string result SELECT ACTIVE FROM dbo test WHERE ID ID Text SqlCommand showresult new Sq
  • ImportError:无法导入名称请求

    每当我使用终端 ubuntu 运行 py 代码时 我收到这个错误 Traceback most recent call last File twitterstream py line 15 in
  • 由于我们的 Sybase JDBC 驱动程序,Charset.availableCharsets 引发 NullPointerException

    我遇到了阻塞问题与我的安装 JDK 1 7 基本上我有以下NPE 10 19 17 548 main ERROR o s t w s TestDispatcherServlet Context initialization failed o
  • 运行 pyinstaller 应用程序时导入错误

    我编写了一个 Python 应用程序 它使用 from PIL import Image 我想分发此应用程序的打包版本 以便使用它的任何人都不需要安装所有依赖项 为此我用过pyinstaller 但没有取得太大成功 我跑 pyinstall
  • 获取弹出页面的公共变量

    我正在实例化另一个页面 并为其公共属性之一 SomeValue 分配一个值 如下所示 btnGotoOtherPage Clicked async sender e gt OtherPage otherpage new OtherPage
  • 是否不鼓励在同一字段上使用 @Spy 和 @InjectMocks ?

    在我现在正在进行的项目中 我经常看到 Spy and InjectMocks在田野上一起使用 我从未在任何教程或其他资源中看到过这种方式 我用谷歌搜索了这个特定的组合 但没有 在 GitHub 上找到除此线程之外的其他任何内容 https
  • 我们可以在 Swift 上重用 struct 吗?或者还有其他办法吗?

    所以我有一个用户 JSON 结构 如下所示 results meta users status 我想让用户这样User我实现的获取 JSON 的模型如下 struct Response Decodable let results Resul
  • 从 VBA 插入公式时出现不同语言问题

    我是否理解正确 如果我使用类似的命令 Set myRange formula ROW mySheet R12 我的宏会导致 NAME 如果在俄语 Excel 上运行 单元格中会出现错误 我的意思是在这种情况下 上面的公式应该是硬编码的 Se
  • Rails 中的简单 Javascript Joyride 插件

    我担心我的插件由于对 Rails 的误解而无法正常工作 我正在添加zurbs 欢乐之旅插件到索引页 我有以下内容vendor assets javascripts joyride joyride 2 0 3 js jquery cookie
  • Android 上服务的良好实践

    我目前在我的应用程序中使用 2 项服务 1 定位服务 基本上是尝试本地化用户 并旨在仅当应用程序位于前台时才保持活动状态 2 Xmpp服务 它初始化与 xmpp 服务器的连接 接收消息 发送消息 注销 并旨在保持活动状态直到用户注销 我已经
  • Android音频FFT显示基频

    我已经在一个 Android 项目上工作了一段时间 该项目显示输入信号的基频 充当调谐器 我已经成功实现了 AudioRecord 类并正在从中获取数据 但是 我很难对此数据执行 FFT 来获取输入信号的基频 我一直在看帖子here 并且正