【问题标题】:Flutter/Java Plot Mp3 Frequency intensityFlutter/Java Plot Mp3 频率强度
【发布时间】:2018-08-30 21:29:11
【问题描述】:

我真的不知道如何解释我正在实现的确切目标。我需要从 mp3 文件中跟踪某些频率的强度一定次数在 android (Java) 上(或者如果它可能在 Dart (Flutter) 上)。这是一张解释我的意思的图片:

我在 Blender 中使用 Bake Sound to f-Curve Modifier 制作了这个屏幕截图,这正是我想要实现的,但它是用 C++ 编写的,所以我做的第一件事就是尝试从源代码中获得一些提示,但我找不到任何东西。

如您所见它不是实时的,而是某个频率(在本例中为频率范围:80-255Hz)随时间变化的值

放大版 如您所见,它只是该频率随时间变化的强度图表。 在这种情况下,X 轴上的“divions”约为 180s/600 帧。

关于文件格式的问题: 输入文件是 mp3 或 wav。

关注语言

我的主要目标是在 java 中实现这一点,但如果可能的话,最好在 Flutter(所以 Dart)中完成。我问的是两者之一。如果 Flutter 不可能或太难,那么 java 实现还是不错的,我在应用程序上使用了平台通道,所以问题不大。

我在网上查过,但我能找到的唯一教程是使用 FFT 的实时示例。

更好地解释我需要什么: 我有很多帧:假设是 300。 我需要一个类似这样的函数:

List<Integer> calculateFrequencies(int number_of_frames, double freq_low, 
freq_high, String FilePath){
List<Integer> result = new ArrayList<>();
double length = //Here I need to obtain the length of the song in units as small as possible, for example, milliseconds or nanoseconds

for(int v = 0, v < number_of_frames; v++){

    double currFrame = lenght/300 * v;
    double intensity = get_intensity(currFrame, freq_low, freq_high) //How Could I do this?? 


    result.add(intensity);
 }

return result;

}

我该怎么做?

这可能吗?如果是的话,在android中也可以吗?

【问题讨论】:

标签: java android audio dart flutter


【解决方案1】:

离散傅里叶变换(FFT 是最常用的算法)正是您所需要的,因为它将您的时域样本映射到频域。假设您有一段时间内的声音样本和采样频率,您将能够实现您的目标,是否实时并不重要。

第二步是处理 FFT 的结果,这将产生样本中存在的频率的幅度。

尝试使用 Github 获取基于 Java 的 FFT 实现 https://github.com/search?q=java+fft,您可能还会在那里找到一些示例。

【讨论】:

  • 据我所见和了解,FFT DFT 都采用浮点数或复数输入。我的问题也是从 mp3 文件中获取该值。我该怎么做?
  • 您需要将您的 mp3 文件解码为 wav 文件或类似文件。您可以从那里规范化信号以获得浮点值(但对于 FFT 而言并不重要)
  • 如何解码 mp3?您能否将代码添加到答案中?或者至少指出一些起点?
  • 查看此线程:stackoverflow.com/questions/11191246/… 并查看en.wikipedia.org/wiki/MP3 以更好地了解这一现象。
  • 按照这些链接,我发现您实际上可以在没有任何第三方插件的情况下使用 MediaCodec 解码 MP3,但我找不到任何示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2014-05-23
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多