java - 我想知道如何使用用户选择的音乐文件,然后检测特定的声音频率。安卓

标签 java android

所以基本上我希望它获得 60 - 150 Hz 的范围,这是歌曲中低音的一般区域。每当它在这个范围内时,我希望它执行一个功能,并且只在范围内执行,我的问题是我试图查找这样做所需的功能但没有运气,如果有人可以在这里给我看或者一篇好文章或对此的解释会很棒!我感谢所有帮助,我将继续自己寻找。如果需要更多解释,我可以提供所需的任何信息!

奥斯汀。

更新:我在这里简化了一个算法:

  1. 用户选择他们想要的歌曲
  2. 歌曲加载到播放器上
  3. 函数扫描歌曲并在整首歌曲中找到较低的频率,输出是一个模式。

最佳答案

步骤 1) 进行快速傅立叶变换:http://en.wikipedia.org/wiki/Fast_Fourier_transform

FFT 获取一段声音并将其转换为频域/时域 - 例如,正在播放的频率以及声音的强度和持续时间。这是一种有用的数学运算,它依赖于所有声音,无论多么复杂,都可以从根本上由一个或多个不同频率和振幅的正弦波构成的特性。

如果您曾经看过频谱图,例如在 foobar2000 中,它是使用 FFT 实现的:

spectrogram from foobar2000 using fast fourier transform

我建议不要尝试自己实现 FFT,而是找一个经过良好测试且速度很快的库,例如 http://en.wikipedia.org/wiki/FFTW这是用C写的

第 2 步) 现在您已经对用户正在收听的声音部分进行了 FFT,您可以简单地检查频点并做任何您想做的事!尽管检测低音冲击并不像“这个频率仓值高吗?”那么简单。因为那样的话您可能会将低音线误认为是低音底鼓。您可能需要进行进一步的测试和研究才能使其正常工作。

编辑:Delyan 建议 http://www.clear.rice.edu/elec301/Projects01/beat_sync/beatalgo.html而且看起来还不错。

关于java - 我想知道如何使用用户选择的音乐文件,然后检测特定的声音频率。安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15422341/

相关文章:

java - 使用 Jetty maven 插件部署 war

java - 使用 WindowBuilder 与 SWT/JFace 进行数据绑定(bind)的资源

java - 如何使以下java代码异步任务

android - 无法启动接收器 com.google.firebase.iid.FirebaseInstanceIdInternalReceiver

java - picasso 未加载图像

java - 如何使用 Jsoup 从相对 HTML 链接中提取绝对 URL?

java - TextView 不会根据 SeekBar 进度自动更新

android - 如何在不进入无线设置页面的情况下启用移动数据或 WiFi

android - 使用 android.graphics.Movie 显示 .gif

javascript - 将架构协议(protocol)更改为 http ://in WebView Android