Flutter/Java绘制Mp3频率强度图

5
我不太清楚如何准确地解释我要实现的东西。我需要追踪mp3文件中某些频率强度在一定次数内的变化,在Android(Java)上(或如果可能在Dart(Flutter)上)。下面是一张解释图片:

我使用Blender制作了这张截图,使用的是Bake Sound to f-Curve Modifier,这正是我要实现的内容,但它是用C++编写的,所以我尝试从源代码中获取一些线索,但我找不到任何有用的信息。

如您所见,它不是实时的,而是一个特定频率(这种情况下是80-255Hz的频率范围)在一段时间内的值

放大版本 您可以看到它只是一个表明该频率随时间变化的强度图形。在本例中,X轴上的“divisions”大约为180秒/ 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;

}

我该如何做到这一点?

这是可能的吗?如果可能,安卓系统也能实现吗?


如果你真的想要理解这些东西,包括如何窗口采样,FFT 的工作原理等等...我强烈推荐从 Coursera 学习这门音频信号处理课程。价格=免费。 - zipzit
Fabrizio,你找到你要找的东西了吗?我正在尝试实现这个 https://stackoverflow.com/questions/62538540/flutter-change-audio-frequency 如果你能看一下。 - FilipeOS
1个回答

2
离散傅里叶变换(DFT)是你需要的,FFT是最常用的算法。它将把你的时域采样映射到频率域。假设你有一段时间内的声音采样和采样频率,你就能实现你的目标,无论实时与否都没有关系。
第二步是处理FFT结果,这将产生样本中存在的频率的振幅。
尝试在Github上寻找基于Java的FFT实现https://github.com/search?q=java+fft,你很可能也会在那里找到一些示例。

据我所见和理解,FFT DFT 都需要浮点数或复数输入。我的问题也是如何从 mp3 文件中获取这些值。我该怎么做? - Fabrizio
1
你需要将你的mp3文件解码成wav文件或者其他等效格式。从那里,你可以对信号进行归一化处理以获得浮点值(但是对于FFT来说并不重要)。 - nabulator
我该如何解码mp3文件?您能否在答案中添加代码?或者至少指出一些起点? - Fabrizio
看看这个线程:https://dev59.com/qWXWa4cB1Zd3GeqPMWAd,同时也可以参考https://en.wikipedia.org/wiki/MP3更好地理解这个现象。 - Eddie Lopez
通过这些链接,我发现您可以使用MediaCodec实际解码MP3而无需任何第三方插件,但我找不到任何示例。 - Fabrizio
如果您可以的话,能否请提供一个链接? - Fabrizio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接