Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FFT频谱中的小故障_C#_Unity3d_Fft_Naudio - Fatal编程技术网

C# FFT频谱中的小故障

C# FFT频谱中的小故障,c#,unity3d,fft,naudio,C#,Unity3d,Fft,Naudio,我的FFT在某种程度上起作用。我对它进行了一些频率扫描测试,我可以清楚地看到峰值,但在整个频谱中我发现了一些奇怪的小故障和强噪声。信号忽上忽下,有时一些信号条消失了。我试着读懂这些值,有时会得到NaN。我做错了什么 void FFTLive() { int sampleCount = 8192; NAudio.Dsp.Complex[] complex = new NAudio.Dsp.Complex[sampleCount]; float[] dat = n

我的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), -16 + value, 40), Color.green, 0.002f);

    }

}
void FFTLive()
{
int-sampleCount=8192;
NAudio.Dsp.Complex[]Complex=新的NAudio.Dsp.Complex[sampleCount];
float[]dat=新的float[sampleCount];
source.clip.GetData(dat、source.timeSamples);
对于(int i=0;i
更新 我添加了窗口并检查了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, (int)Mathf.Log(sampleCount, 2), 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, 40), new Vector3(-9 + (float)(i / 20), -16 + value, 40), Color.green, 0.0002f);

    }
for(int i=0;i
更新2

解决了。我忘了采样数据是两个通道,所以我把这两个通道混在一起,导致了所有的故障。因此,我将数据数组一分为二,每秒钟只取一个条目,该条目应该来自一个通道。

至少有两个问题

您不会检查最后一个Log10()的幅值输入是否为零。这将导致南斯


在FFT之前,您没有使用非矩形窗函数来消除加窗伪影(从FFT光圈结束和开始之间不连续的非整数周期波形中)。尝试使用Von Hann或Hamming窗口。

因此,我添加了更新#1中的窗口,并检查值何时变为0,但仍然不起作用。看起来噪音很大,但我直接从音频文件中获取数据。我用相同的数据绘制波形,结果很好。