【发布时间】: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