NAudio FFT函数的奇怪输出

本文关键字:输出 FFT 函数 NAudio | 更新日期: 2023-09-27 18:20:47

我一直在尝试将FFT实现到我的音乐程序中。我觉得一切都很顺利,直到我完成并看到结果。。。

为了第一次尝试它,我在C5音符(523.25Hz)中渲染了一个正弦波,也看看我是否从程序中得到了正确的结果。但没有,我得到了一个非常奇怪的频率:-0.01171875Hz

我一定做错了什么!但我不知道是什么。

以下是与整个FFT实现相关的一些功能:

// Initializing the whole playing-part
waveOut = new WaveOutEvent();
audioFileReader = new AudioFileReader(file);
nsp = new NotifyingSampleProvider(audioFileReader.ToSampleProvider());
nsp.Sample += nsp_Sample;
FadeInOut = new FadeInOutSampleProvider(nsp);
waveOut.Init(new SampleToWaveProvider(FadeInOut));
aggregator = new SampleAggregator();
aggregator.NotificationCount = audioFileReader.WaveFormat.SampleRate / 1000;
aggregator.PerformFFT = true;
aggregator.FftCalculated += (s, a) => OnFftCalculated(a);

PlaySource = Filetype.MP3;

我想我不必发布SampleAggregator类。但如果我这样做了,告诉我!

void nsp_Sample(object sender, SampleEventArgs e)
{
    aggregator.Add(e.Left); // Only tried with Left sample first.
}

这是FFT数据返回的地方,我开始处理它

protected virtual void OnFftCalculated(FftEventArgs e)
{
        float[] magnitudes = new float[data.Length / 2];
        for (int i = 0; i < data.Length / 2; i++)
            magnitudes[i] = ((float)Math.Sqrt((data[i].X * data[i].X) + (data[i].Y * data[i].Y)));

        float max_mag = float.MinValue;
        float max_index = -1;
        for (int i = 0; i < data.Length / 2; i++)
            if (magnitudes[i] > max_mag)
            {
                max_mag = magnitudes[i];
                max_index = i;
            }
        var frequency = max_index * CurrentSamplerate / 1024; // CurrentSamplerate gets set dynamically incase some tracks have a different samplerate.
        Dispatcher.Invoke(new Action(() =>
        {
            Plswork.Text = frequency.ToString() + "Hz";
        }));
}

是的,仅此而已。

我想我一定是犯了一些新手的错误,但我真的不知道是什么。因此,任何帮助都将不胜感激。

谢谢。

哦,还有:在我将样本添加到聚合器的地方,我如何同时馈送左通道和右通道?

NAudio FFT函数的奇怪输出

我将sampleaggregator类更改为另一个(链接在第一篇文章的评论中)。

我现在在听音调时得到了合法的结果。所以这一定是个问题。

我还没有检查为什么会发生这种情况,但如果我发现问题,我会发布它。谢谢大家。