【问题标题】:Strange output from FFT-function with NAudio带有 NAudio 的 FFT 函数的奇怪输出
【发布时间】:2014-09-05 22:53:02
【问题描述】:

我一直在尝试在我的音乐程序中实现 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";
        }));
}

是的,就是这样。

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

谢谢。

哦,还有:我在聚合器中添加样本时,如何同时馈送左右声道?

【问题讨论】:

  • -0.01171875Hz 值表明所有幅度都是 NaN/-Inf/MinValue,因此 max_index==-1。这可能是由于输入或SampleAggregator 有问题。也许this answer 可以提供帮助
  • 我从您提到的问题中复制了 SampleAggregator-class,并添加了一个答案。感谢您的帮助。

标签: c# signal-processing naudio


【解决方案1】:

我将 sampleaggregator-class 更改为另一个(链接在第一篇文章的 cmets 中)。

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

我还没有检查它发生的原因,但如果我发现问题,我会发布它。谢谢各位。

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2020-12-25
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多