В настоящее время я создаю приложение 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 в соответствии с рекомендациями на этой странице, у меня были некоторые другие проблемы в моем коде, которые мешали возврату фактических результатов изначально.
Однако файл, который записывается на диск, очень изменчив, я уверен, что это проблема с моим ноутбуком и количеством процессов, которые пытаются выполнить, может ли кто-нибудь проконсультироваться по этой проблеме?
'BitConverter.ToSingle (buffer, index)' - вы уверены, что ваш буфер содержит образцы Float32? (не Int16 или Int32) –
Если ваш буфер действительно содержит образцы 'float', также возможно, что' sampleAggregator', который вы используете, является проблематичным. В последнем случае вы можете попробовать [этот ответ] (http://stackoverflow.com/a/20414331/2994596). – SleuthEye
Буфер возвращает массив байтов, хотя у меня не было проблемы с этим при использовании ASIO, также пример, предоставленный @SleuthEye, - это код, на котором я основываюсь на :) – JBrian30221