我不太了解如何解释我要实现的目标。我需要在android(Java)上(或者在Dart(Flutter)上可能的情况下)跟踪mp3文件中特定频率的强度一定次数。这是一张图片,解释了我的意思:
我使用将声音烘焙到f曲线修改器在Blender中制作了此屏幕截图,这正是我要实现的目标,但是它是用C ++编写的,所以我做的第一件事就是尝试从源代码中获取一些提示,但是我什么也找不到。
您会看到这不是实时的,而是一段时间内某个频率的值(在这种情况下,频率范围为80-255Hz)。
缩放版本 如您所见,它只是该频率强度随时间变化的图形。 在这种情况下,X轴上的“分度”约为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中使用?
答案 0 :(得分:2)
离散傅里叶变换(FFT是最常用的算法)正是您需要的,因为它会将时域样本映射到频域。假设您有一段时间的声音采样和采样频率,则可以实现您的目标,无论是否实时,都没有关系。
第二步是处理FFT的结果,这将产生样本中出现的频率的幅度。
尝试使用Github进行基于Java的FFT实现https://github.com/search?q=java+fft,您可能还会在其中找到一些示例。