java - 使用 FFT 计算频率时的错误值

标签 java audio signal-processing fft

我得到错误的频率,我不明白为什么我得到错误的值。因为我已经按照指令计算,然后是 stackoverflow。 我用过 FFT http://introcs.cs.princeton.edu/java/97data/FFT.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 之间频谱的精确镜像(我发现 this nice background explanation )。因此,对于每个频率,存在两个振幅几乎相同的峰值。我写“几乎”是因为由于机器精度有限,它们不一定完全相同。因此,您可以在频谱的前半部分随机找到包含低于奈奎斯特频率 (=Fs/2) 的频率的峰值,或者在包含高于奈奎斯特频率的频率的频谱的后半部分找到峰值。

如果您想自己更正错误,请停止阅读此处。否则继续:

只是替换

for(int j=0;j<bufferSize;j++){

for(int j=0;j<=bufferSize/2;j++){

在您提供的源代码中。

P.S.:通常情况下,最好将窗函数应用于分析缓冲区(例如汉明窗),但对于您的峰值拾取应用,它不会对结果产生太大影响。

关于java - 使用 FFT 计算频率时的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21853063/

相关文章:

java - 如何在 Robot 类 KeyEvent 参数中放置一个 String 变量?

java - 如何在JSF中 "hide"文本的最后一部分

java - 如何在静音时创建声音剪辑?

image-processing - 如何确定高斯滤波器的窗口大小

c# - 在 Windows 中对 'live' 文件使用 grep

java - 如何验证所有实现的抽象方法的参数?

python - 为python安装最新版本的aubio

ios - 如何检测iPhone是否处于静音模式

matlab - 如何在MATLAB中制作多陷波滤波器?

algorithm - 音高等级检测音频库