Я пытался внедрить FFT в свою музыкальную программу. Я думал, что все прошло отлично, пока я не закончил и не увидел результаты ...Странный выход из FFT-функции с NAudio
Чтобы попробовать в первый раз, я отобразил синусоидальную волну в примечании C5 (523,25 Гц), также посмотрим, верну ли я правильные результаты из программы. Но нет, у меня очень странная частота: -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». Возможно, [этот ответ] (http://stackoverflow.com/a/20414331/2994596) может помочь – SleuthEye
Я скопировал класс SampleAggregator из вопроса, на который вы ссылались, и добавил ответ. Спасибо за помощь. – Tokfrans