Ciao 访客, welcome back to old school! :p
fft.forward(jingle.mix); for(int i = 0; i < fft.specSize(); i++) { // draw the line for frequency band i, scaling it by 4 so we can see it a bit better line(i, height, i, height - fft.getBand(i)*4); }
声音并不是单个频率的,它在不同频率上都有幅度fft.getBand(i)返回的是第i个频率段的幅度值这里的宾语是band,因为通常都是几个频率组成在一起成为一个频率段下面的代码来自forward FFT的例子程序代码 fft.forward(jingle.mix); for(int i = 0; i < fft.specSize(); i++) { // draw the line for frequency band i, scaling it by 4 so we can see it a bit better line(i, height, i, height - fft.getBand(i)*4); }fft.specSize()决定了有多少个频率段关于minim中的FFT这里还有个文档http://code.compartmental.net/minim/javadoc/ddf/minim/analysis/FourierTransform.html你要做的是将当前的声音的所有频率段的幅度值 与 你要检测的音色的 所有频率段的幅度值 进行比较。找到其中差值最小的,如果把声音看做是一个点,那么就是找距离最接近的点。如果你要检测的音色比较标准,只在某一个频率上有幅度值,那么可以做些简化。只要当前声音的最大幅度频率段中包含这个频率,就认为匹配了。
没看明白你要的效果,不妨先解释下你的代码可以先println(fft.specSize()); 看看大小是多少这个官方的例子你可以多跑跑,对不同声音下显示的不同线段找点感觉
ArrayList new_range = new ArrayList();//放置你想截取的区域int start = 100;//从100开始int end = 200;//到200截止 for(int i = start ; i < end ; i++) { new_range.add(fft.getBand(i));//依次添加 }