FFT频谱中的毛刺

问题描述

我的FFT在某种程度上起作用。我通过一些频率扫描对其进行了测试,我可以清楚地看到峰值,但是在整个频谱上都出现了一些奇怪的毛刺和强烈的噪声。信号上下跳动,有时一些条形消失。我试图读取值并有时获得NaN。我在这里做什么错了?

    void FFTLive()
{
    int sampleCount = 8192;

    NAudio.Dsp.Complex[] complex = new NAudio.Dsp.Complex[sampleCount];

    float[] dat = new float[sampleCount];
    source.clip.GetData(dat,source.timeSamples);
    for (int i = 0; i < sampleCount; i++)
    {
        complex[i].X = dat[i];
        complex[i].Y = 0;
    }

    NAudio.Dsp.FastFourierTransform.FFT(false,(int)Mathf.Log(sampleCount,2),complex);

    for (int i = 0; i < sampleCount; i++)
    {
        float value = 10 * Mathf.Abs(Mathf.Log10((complex[i].X * complex[i].X + complex[i].Y * complex[i].Y)));
        Debug.DrawLine(new Vector3(-10 + (float)(i / 20),-16 + value,40),new Vector3(-9 + (float)(i / 20),Color.green,0.002f);

    }

}

更新添加了窗口并检查了0,但看起来似乎仍然有很多杂音。

 for (int i = 0; i < sampleCount; i++)
    {
        complex[i].X = dat[i]*(float)NAudio.Dsp.FastFourierTransform.BlackmannHarrisWindow(i,sampleCount);
        complex[i].Y = 0;
    }
    


    NAudio.Dsp.FastFourierTransform.FFT(false,complex);


    for (int i = 0; i < sampleCount / 4; i++)
    {
        float value = 0;
        if (complex[i].X + complex[i].Y != 0)
            value = 10 * Mathf.Abs(Mathf.Log10(100 * (complex[i].X * complex[i].X + complex[i].Y * complex[i].Y)));
        Debug.DrawLine(new Vector3(-10 + (float)(i / 20),-16,0.0002f);

    }

更新2

解决了。我忘记了采样数据是2个通道,所以我将这两个通道混合在一起导致了所有故障。因此,我将数据数组分为两半,每隔一个条目只能取一个通道。

解决方法

至少有两个问题。

您无需检查输入到最后一个Log10()的幅度是否为零。那会导致NaNs。

在FFT之前,您没有使用非矩形窗函数来消除开窗伪像(从FFT孔径的两端到起点之间不连续的非整数周期波形中)。尝试使用Von Hann或Hamming窗口。