我正在编写一个程序来检测给定wav文件(最好是歌曲)中的频率。我需要将wav文件分成多个块,以将其馈送到FFT,但是我不知道如何执行此分离。我相信这些被称为框架,但是对于所有这些我都是新手。
我不知道从哪里真正开始-我只是在网上看而未找到我想要的。我有一个预感,这与将FileInputStream分成多个块有关,但是我不知道如何做到这一点。
FileInputStream input = new FileInputStream(filelocation);
//Number of samples to take (higher number more accurate but slower
int numsamples = Constants.numsamples;
//Sample rate of the file (total frequency range is 1/samplerate)
int samplerate = Constants.samplerate;
//Puts the audio file into something readable by the FFT
WaveDecoder decoder = new WaveDecoder(input);
//Contains all the samples within the entire file
ArrayList<Float> allSamples = new ArrayList<Float>( );
//Contains the aformentioned samples, but in a format that FFT will take
float[] samples = new float[numsamples];
//Actual instance of the transform
FFT fft = new FFT(numsamples, samplerate );
//number of samples = 441000/filelength
//Copies the contents of the WaveDecoder into an array
while( decoder.readSamples( samples ) > 0 )
{
for( int i = 0; i < samples.length; i++ )
allSamples.add( samples[i] );
}
这是我正在使用的FFT库的链接:
https://github.com/Uriopass/audio-analysis
最理想的是,将代码分成多个块(无论是在WaveDecoder阶段还是之前,将其分离)以馈入FFT。我需要某种方法来告知数据块到音频文件的距离(以秒为单位),以便我可以知道每个特定频率的播放时间。
最后,此FFT将是程序的后端,该程序提供音频文件中正在播放的内容的图形表示;如果有任何一种更简单的方法来对这种类型的程序进行频率检测,那么我将不胜枚举。这是一个高中项目,因此对过多的评论表示歉意。