2014-09-05 4 views
1

Я пытался внедрить 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"; 
     })); 
} 

Да, это все.

Я предполагаю, что я, должно быть, совершил ошибку новобранец, но я действительно не знаю, что. Поэтому любая помощь будет оценена по достоинству.

спасибо.

О, также: где я добавляю образцы в агрегатор, как я могу одновременно подать левый и правый каналы?

+2

Значение -0.01171875Hz означает, что все величины являются либо NaN/-Inf/MinValue, так и 'max_index == - 1'. Это может быть связано с проблемой ввода или с «SampleAggregator». Возможно, [этот ответ] (http://stackoverflow.com/a/20414331/2994596) может помочь – SleuthEye

+0

Я скопировал класс SampleAggregator из вопроса, на который вы ссылались, и добавил ответ. Спасибо за помощь. – Tokfrans

ответ

0

Я изменил класс sampleaggregator на другой (связанный в комментариях первого сообщения).

Теперь я получаю законные результаты при прослушивании тона. Так что это была проблема с этим.

Я еще не проверял, почему это произошло, но я отправлю его, если найду проблемы. Спасибо вам, ребята.

Смежные вопросы