2016-02-29 9 views
0

Я пытаюсь написать музыкальное приложение, в котором обнаружение тональности является основой всего этого. Я видел решения этой проблемы, а также приложения в AppStore. Однако большинство из них довольно устарели, и я бы хотел сделать это, это Swift. Я рассматривал AVAudioEngine как способ сделать это, но я считаю, что документация не хватает или, может быть, я не выглядел достаточно сложно.Можно ли использовать AVAudioEngine для определения высоты тона в реальном времени?

То, что я обнаружил, что я могу нажать на автобус inputNode так:

self.audioEngine = AVAudioEngine() 
self.audioInputNode = self.audioEngine.inputNode! 
self.audioInputNode.installTapOnBus(0, bufferSize:256, format: audioInputNode.outputFormatForBus(0), block: {(buffer, time) in 
     self.analyzeBuffer(buffer) 
}) 

Автобус сливают 2-3 раза в секунду и буфер содержит более 16000 поплавки для каждого крана. Являются ли эти амплитудные выборки из микрофона?

Документах по крайней мере, утверждает, что это выход из узла: «Параметр буфер представляет собой буфер аудио захваченный с выхода на AVAudioNode

Можно ли использовать AVAudioEngine для обнаружения тона в реальном времени или я должен пойти по этому пути?

ответ

0

Я понимаю, что Hellium3 действительно дает мне информацию о том, пек, и если это хорошая идея делайте это со Свифт.

Первоначально мой вопрос касался того, что прослушивание шины PCM является способом получения входных сигналов от микрофона.

Спрашивая этот вопрос, я сделал именно это. Используйте данные, полученные путем нажатия на шину PCM и анализа окон буфера.

Он работает очень хорошо, и это было мое отсутствие понимания того, что такое шина PCM, частота буфера и частоты дискретизации, что заставило меня задать вопрос в первую очередь.

Зная эти три, стало легче видеть, что это правильно.

+0

Были ли вы реализованы в Swift? если возможно, вы можете поделиться созданным файлом для определения высоты тона или образца проекта? Я использую AVAudioRecorder для записи звука –

2

Несколько различных концепций здесь. AVAudioEngine - это всего лишь двигатель, который дает вам необработанные данные PCM, вы можете напрямую использовать Novocaine, Core-Audio или другие варианты.

Данные PCM представляют собой образцы с плавающей запятой из микрофона.

Что касается отслеживания высоты тона, существуют различные техники. Следует отметить, что обнаружение частоты отличается от обнаружения тона.

FFT который хорош, но не сможет обнаружить шаг сигналов с отсутствующими основами. Вам нужно будет запустить сигнал через фильтр нижних частот, чтобы уменьшить возможное сглаживание частот выше Nyquist Frequency, а затем window, прежде чем передавать его в БПФ, это должно уменьшить spectral leakage. БПФ выводит спектральное содержимое внутри серии ячеек, причем бит с наивысшим значением считается самой сильной частотой в сигнале.

Autocorrelation который может дать лучшие результаты. Это в основном сигнал, коррелированный с самим собой.

В конце концов, до того, что вы хотели бы обнаружить, необходимо учитывать несколько соображений. Такие вещи, как мужской голос и некоторые инструменты, могут давать неверные результаты с помощью обычного БПФ, работающего на буферах, которые не были предварительно обработаны.

Проверить это PITCH DETECTION METHODS REVIEW

Насколько идет Swift, это не очень хорошо подходит для реального времени, производительность сосредоточены системы. Вы можете проверить old benchmarks of Swift vs C++

enter image description here

реализация C++ FFT является более 24x быстрее

+2

Эти контрольные показатели более года. С тех пор Свифт очень долго двигался, поэтому я относился к ним скептически. – JeremyP

+0

справедливо, моя точка зрения все еще касалась производительности, и Swift не может заменить C++/C для обработки аудио кода – jarryd

+0

Благодарим вас за этот информативный пост. Я протестировал вышеприведенный код, предполагая, что буфер содержит выборочные амплитуды в течение всего времени с момента последнего нажатия. Я использовал Accelerate.framework для передачи буфера через FFT и принял среднее значение результата. Используя тональный генератор для создания A4, я проверил результат, и он действительно отображает ожидаемые 440 Гц + - e. Это означает, что это возможно. Интересно, однако, если есть лучший способ сделать это. Я еще не проверил AudioKit и не изучил последствия этой ошибки. Например. он показывает только 440 Гц, если я держу микрофон близко к динамику. – MdaG