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";
}));
}
是的,仅此而已。
我想我一定是犯了一些新手的错误,但我真的不知道是什么。因此,任何帮助都将不胜感激。
谢谢。
哦,还有:在我将样本添加到聚合器的地方,我如何同时馈送左通道和右通道?
我将sampleaggregator类更改为另一个(链接在第一篇文章的评论中)。
我现在在听音调时得到了合法的结果。所以这一定是个问题。
我还没有检查为什么会发生这种情况,但如果我发现问题,我会发布它。谢谢大家。