【问题标题】:FFT Fundamental frequency calculation from LomontFFT来自 LomontFFT 的 FFT 基频计算
【发布时间】:2015-06-04 15:06:57
【问题描述】:

我正在使用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 也不匹配,但这是可能的,因为有多种解决方案,但频率应该相同。该算法已被证明多年,所以它绝对没有错。我在调用代码时做错了吗?

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

【问题讨论】:

  • 请重新格式化代码
  • 抱歉,我的手机中的空格和未格式化的代码出错了。但它现在固定了。

标签: c# algorithm signal-processing fft


【解决方案1】:

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

您还需要对 FFT 箱进行插值以获得单个峰的准确结果。

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

【讨论】:

  • 感谢您的解释。但是值系列中的最大量级应该代表基频,如果不准确的话,我应该得到一些接近的东西。 fft 的算法也是非常标准的算法。
  • 错了!添加 0.5*100Hz + 0.9*200Hz + 1.5*300Hz。音高 = 100 Hz,最高分量 = 300 Hz。
  • 感谢您的回答,但是否可以稍微解释一下。对于任何类型的信号,音高是否固定为 100Hz? 05,0.9和1.5的因子是怎么得到的?
  • 这是一个例子。如果您的信号由多个如上所述的分量组成,您会发现音高为 100Hz,最大的 FFT 分量为 300Hz。甚至可能有一个音高为 100Hz 且根本没有 100Hz 分量的信号
猜你喜欢
  • 2021-03-09
  • 2011-02-05
  • 1970-01-01
  • 2020-05-22
  • 2020-10-14
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
相关资源
最近更新 更多