我真的不知道如何解释我正在实现的确切事情。我需要在android(Java)上跟踪mp3文件中某些频率的强度一定次数(或者如果在Dart(Flutter)上可能的话)。这是一个解释我的意思的图像:
我在Blender中使用Bake Sound到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中也有可能吗?
离散傅里叶变换(FFT是最常用的算法)正是您所需要的,因为它会将您的时域采样映射到频域。假设你有一段时间内的声音样本和采样的频率,你将能够实现你的目标,如果是实时的话,这并不重要。
第二步是处理FFT的结果,这将产生样本中存在的频率幅度。
尝试使用Github基于Java的FFT实现https://github.com/search?q=java+fft,你可能会在那里找到一些例子。