2016-03-25 1 views
0

В настоящее время я создаю приложение Winforms для Windows 8.1, я смог выполнить БПФ на входных данных с микрофона устройств используя ASIO Out, однако для использования ASIO на моей машине мне нужно было скачать ASIO4ALL,Использование Naudio WaveIn для выполнения преобразования FFT и записи на диск в режиме реального времени (NOT ASIO)

Это вызывает огромное количество обратной связи в микрофоне и приводит к очень неточным показаниям частоты (чтобы убедиться, что это был я сам написал копию на диск для воспроизведения),

Итак, чтобы обойти это, я пытался адаптировать свой код для работы с классом WaveIn от Naudio, однако это не возвращает ни данных, ни NaN для алгоритма FFT (хотя я могу сохранить запись на диск, который воспроизводится без проблем)

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

Ниже приведен код «OnDataAvailable» событие (где я 99% уверен, что я неправильно):

void OnDataAvailable(object sender, WaveInEventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.BeginInvoke(new EventHandler<WaveInEventArgs>(OnDataAvailable), sender, e); 
     } 
     else 
     { 
      byte[] buffer = e.Buffer; 
      int bytesRecorded = e.BytesRecorded; 
      int bufferIncrement = waveIn.WaveFormat.BlockAlign; 

      for (int index = 0; index < bytesRecorded; index += bufferIncrement) 
      { 
       float sample32 = BitConverter.ToSingle(buffer, index); 
       sampleAggregator.Add(sample32); 
      } 

      if (waveFile != null) 
      { 
      waveFile.Write(e.Buffer, 0, e.BytesRecorded); 
      waveFile.Flush(); 
      } 

     } 


    } 

Если какие-либо более подробной информации и/или код необходим, пожалуйста, дайте мне знать.

waveFile: Имя файла писателя

e.Buffer: Буфер, содержащий записанные данные

e.BytesRecorded: Общее количество байтов, записанных

Для справки ниже рабочий код при использовании класса ASIO:

void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e) 
    { 
     byte[] buf = new byte[e.SamplesPerBuffer * 4]; 

     for (int i = 0; i < e.InputBuffers.Length; i++) 
     { 
      Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer * 4);  
     } 

     for (int i = 0; i < e.SamplesPerBuffer * 4; i++) 
     { 
      float sample32 = Convert.ToSingle(buf[i]); 
      sampleAggregator.Add(sample32); 
     } 
    } 

EDIT: образцы, которые возвращаются теперь точны после изменения новообращенного STA tement до Int16 в соответствии с рекомендациями на этой странице, у меня были некоторые другие проблемы в моем коде, которые мешали возврату фактических результатов изначально.

Однако файл, который записывается на диск, очень изменчив, я уверен, что это проблема с моим ноутбуком и количеством процессов, которые пытаются выполнить, может ли кто-нибудь проконсультироваться по этой проблеме?

+1

'BitConverter.ToSingle (buffer, index)' - вы уверены, что ваш буфер содержит образцы Float32? (не Int16 или Int32) –

+0

Если ваш буфер действительно содержит образцы 'float', также возможно, что' sampleAggregator', который вы используете, является проблематичным. В последнем случае вы можете попробовать [этот ответ] (http://stackoverflow.com/a/20414331/2994596). – SleuthEye

+0

Буфер возвращает массив байтов, хотя у меня не было проблемы с этим при использовании ASIO, также пример, предоставленный @SleuthEye, - это код, на котором я основываюсь на :) – JBrian30221

ответ

0

В демонстрационном проекте NAudio WPF есть пример вычисления БПФ при воспроизведении с классом SampleAggregator, который хранит блоки с 1024 образцами и затем выполняет БПФ на них.

Похоже, вы пытаетесь сделать что-то похожее на это. Я подозреваю, что проблема заключается в том, что вы получаете 16-разрядные образцы, а не 32 бит. Попробуйте использовать BitConverter.ToShort для каждой пары байтов.

+0

Привет @Mark, я записываю в 24 которые я думаю, и «BitConverter.ToShort» не распознан, я попробовал Int16/32, но оба они случайно возвращали 0 и NaN, я посмотрел на демонстрационный проект, который вы предложили, если я смотрю на него правильно, это записывая волновой файл на диск, а затем передавая его обратно для преобразования FFT? – JBrian30221

+0

Я сомневаюсь, что вы с WaveIn. Проверьте WaveFormat –

+0

Извините, что это была моя ошибка, это действительно 16-разрядные сэмплы, теперь я получаю более точные частоты, однако сохраненный файл очень изменчив, я уверен, что это связано со скоростью моего ноутбука, обрабатывая оба процесса сразу же существует более эффективный способ достижения этого, о котором вы могли бы посоветовать? – JBrian30221