来自LomontFFT的FFT基频计算

时间:2015-06-04 15:06:57

标签: c# algorithm signal-processing fft

我使用http://www.lomont.org/Software/Misc/FFT/LomontFFT.html中的LomontFFT从信号的采样值中获取基频。为了测试基频是否正确确定,我使用了一些过去的样本(具有已知的基频)。

下面是我编写的用于调用LomontFFT算法并确定FFT的代码:

private void buttonFFT_Click(object sender, EventArgs e)
    {
        //double fftavg = 0;
        double fftmax = 0;
        var fftData = new byte[512];
        double[] fftValues = Enumerable.Repeat(0.0, 512).ToArray();

                           Array.Copy(sapmledDoubleValuesADC1, fftValues, sapmledDoubleValuesADC1.Length);
var fftMethod = new Lomont.LomontFFT();
        fftMethod.RealFFT(fftValues, true);

        for (int i = 0; i < 512; i += 2)
        {
            double fftmag = Math.Sqrt((fftValues[i] * fftValues[i]) + (fftValues[i + 1] * fftValues[i + 1]));
            if (fftmag > fftmax)
                fftmax = fftmag;
            //fftavg += fftmag;
            //fftData[i] = (byte)fftmag;
            //fftData[i + 1] = fftData[i];
        }
        textBoxFundaFreq.Text = "Frey = " + fftmax.ToString();
        for (int x = 1; x < 512; x++)
        {
            this.chart2.Series[0].Points.AddXY(x, fftValues[x]);
        }
    }

但问题是频率的大小是错误的。 FFT也不匹配,但这是可能的,因为有多个解决方案,但频率应该相同。算法已被证明多年,所以它绝对没有错。我在调用代码时做错了吗?

(我在采样数据中只有实数值)

1 个答案:

答案 0 :(得分:0)

基频提取/音调检测不是一种简单的算法。对于大多数输入信号(除单个正弦/余弦波以外的任何信号),FFT将显示几个峰值,通常更好地估计这些峰值之间的距离

此外,您需要插入FFT区间以获得单个峰值的精确结果。

对于大多数应用程序,最好还是计算自相关函数(ACF)。