我得到了错误的频率,我不明白为什么我得到了错误的值。因为我已经按照 stackoverflow 后面的指令进行了计算。
我用过FFThttp://introcs.cs.princeton.edu/java/97data/FFT.java.html http://introcs.cs.princeton.edu/java/97data/FFT.java.html和复杂的http://introcs.cs.princeton.edu/java/97data/Complex.java.html http://introcs.cs.princeton.edu/java/97data/Complex.java.html
audioRec.startRecording();
audioRec.read(bufferByte, 0,bufferSize);
for(int i=0;i<bufferSize;i++){
bufferDouble[i]=(double)bufferByte[i];
}
Complex[] fftArray = new Complex[bufferSize];
for(int i=0;i<bufferSize;i++){
fftArray[i]=new Complex(bufferDouble[i],0);
}
FFT.fft(fftArray);
double[] magnitude=new double[bufferSize];
for(int i=0;i<bufferSize;i++){
magnitude[i] = Math.sqrt((fftArray[i].re()*fftArray[i].re()) + (fftArray[i].im()*fftArray[i].im()));
}
double max = 0.0;
int index = -1;
for(int j=0;j<bufferSize;j++){
if(max < magnitude[j]){
max = magnitude[j];
index = j;
}
}
final int peak=index * sampleRate/bufferSize;
Log.v(TAG2, "Peak Frequency = " + index * sampleRate/bufferSize);
handler.post(new Runnable() {
public void run() {
textView.append("---"+peak+"---");
}
});
我得到的值如 21000,18976,40222,30283 等...
请帮我.....
谢谢..
你的源代码几乎没问题。唯一的问题是您要在整个光谱中搜索峰值,即从 0 通过 Fs/2 到 Fs。
对于任何实值输入信号(您拥有的),Fs/2 和 Fs(=采样频率)之间的频谱是 0 和 Fs/2 之间频谱的精确镜像(我发现这个很好的背景解释 https://dsp.stackexchange.com/a/4827)。因此,对于每个频率都存在两个峰值almost相同的幅度。我写“几乎”是因为由于机器精度有限,它们不一定exactly完全相同的。因此,您可以在包含低于奈奎斯特频率 (=Fs/2) 的频率的频谱前半部分或包含高于奈奎斯特频率的频率的频谱后半部分中随机找到峰值。
如果您想自己纠正错误,请停止阅读此处。否则继续:
只需更换
for(int j=0;j<bufferSize;j++){
with
for(int j=0;j<=bufferSize/2;j++){
在您提供的源代码中。
P.S.:通常,最好将窗函数应用于分析缓冲区(例如汉明窗),但对于峰值选取的应用,它不会对结果产生太大影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)