Как разработать анализатор спектра из аудио в реальном времени?

Я разрабатываю приложение, которое получает исходный звук с микрофона в реальном времени без хранения файлов. В основном я использую:

mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");

Как я могу сделать график спектра из этого звука в реальном времени без файлов?

Все сообщения, которые я читал, анализируют буферизованный файл.


person Víctor Martín    schedule 17.08.2013    source источник
comment
забавная опечатка в заголовке - сейчас исправлю ;)   -  person marko    schedule 19.08.2013
comment
Не нужно извиняться! Большое уважение за то, что вы задаете здесь вопросы на языке, который не является для вас первым.   -  person marko    schedule 19.08.2013
comment
Насколько мне известно, для этого нет API. Скорее всего, вы хотите создать буфер данных PCM разумного размера в ОЗУ и преобразовать его в частотную область с помощью библиотеки БПФ. См., например. stackoverflow.com/questions/4675457/ для получения дополнительной информации.   -  person Michael    schedule 19.08.2013


Ответы (3)


На Github есть анализатор спектра Android с открытым исходным кодом, который вычисляет БПФ по звуку с микрофона и отображает двумерную спектрограмму.

Проект Spectrum Analyzer находится в папке v2.x/Showcase. приложение

Видео в действии можно посмотреть на странице https://youtu.be/yU05fsgOYO4.

Видео с инструкциями по сборке можно посмотреть здесь: https://youtu.be/tVgn30uss2k?t=1m37s

введите описание изображения здесь

Диаграммы предоставляются библиотекой диаграмм SciChart для Android, которая является коммерческим элементом управления, но исходный код для прочитать микрофон, вычислить БПФ и спектрограмму можно бесплатно и с открытым исходным кодом под лицензией MIT.

Примечание: я технический руководитель проекта SciChart

person Dr. Andrew Burnett-Thompson    schedule 21.04.2017
comment
Первая ссылка не указывает на проект анализатора спектра. - person Mehdi Boukhechba; 08.08.2017
comment
Я обновил ответ, чтобы включить дополнительную информацию, в том числе прямую ссылку на проект Audio Analyzer и видео, показывающее, как его построить. Надеюсь, это поможет. - person Dr. Andrew Burnett-Thompson; 09.08.2017
comment
Привет @Dr.ABT У вас есть источники образца, которые мы можем увидеть в видео на Youtube? У меня есть аналогичная потребность в проекте Xamarin Android: записывать шум с микрофона и отображать соответствующую спектрограмму. - person Gold.strike; 09.06.2018
comment
Да, ссылка на исходники есть в моем ответе, где сказано: «Проект анализатора спектра находится по адресу…». - person Dr. Andrew Burnett-Thompson; 09.06.2018
comment
Привет @Dr.ABT, спасибо за ответ. Я также общаюсь с Джулией через вашу поддержку по электронной почте, но, возможно, вы могли бы помочь мне узнать, возможно ли добиться аналогичного результата (анализатор спектра) в проекте Xamarin для Android? Вы образцы Xamarin Android (весь код находится во фрагменте), вы не используете ту же архитектуру, что и ваши образцы Android (макеты .xml, фрагменты как представления, модели представления, классы привязки): поэтому я не уверен, что это можно сделать ... - person Gold.strike; 14.06.2018

Да, это может быть сделано.

Все, что вам нужно, это быстрый алгоритм БПФ!

Сначала определите желаемое частотное разрешение, например, вы можете установить частоту дискретизации с микрофона на 8000 Гц, а теперь выберите один размер фрагмента, например 1024 или 2048, для захвата с микрофона.

Если вы выберете 2048 точек и частоту дискретизации 8000, у вас будет разрешение по частоте = 3,9063 (8000/2048).

Примените одну оконную функцию к вашим 2048 точкам, затем примените БПФ и получите величину!

Помните о частоте дискретизации теоремы Найквиста = 8000/2 = 4000, теперь вы знаете, что ваше БПФ может получать частоты между 3,9063 Гц и 4000 Гц.

Бин FFT соответствующих частот:

1 -> 3,90625  hz    
2 -> 7,8125  hz    
3 -> 11,71875 hz    
...    
1024 -> 4000 hz    
...    
2048 - > 8000 hz

Для этого вам нужны только первые половины значений БПФ, в данном случае 1024.

Теперь, если вы построите эти данные из своего БПФ, у вас будет спектр!

ИЗМЕНИТЬ

Псевдокод:

#construct one hanning window Function
Chunk = 2048;
windowed = [Chunk];
hanning = [Chunk];
for i 1:Chunk:
      hanning[i] = ((1 - cos(i*2*pi/Chunk-1))/2)

#start capture from Mic
while true:

    #into values capture 2048 points from your mic
    values=dataFromMic(Chunk);
    #Apply Window hanning = multiply window function(hanning) over your 2048 points
    for i 1:Chunk:
            windowed[i] = values[i] * hanning[i]
    #Apply FFT 
    fftData=fft(windowed);
    #Get Magnitude (linear scale) of first half values
    Mag=abs(fftData(1:Chunk/2))
    # update/show results
    plot(Mag)

end
person ederwander    schedule 19.08.2013
comment
Этот вопрос содержит код Java для БПФ, который может быть полезен: stackoverflow.com/questions/9272232/fft-library-in-android-sdk - person japreiss; 19.08.2013
comment
Всем спасибо, я ничего не знаю о звуковом анализе, поэтому постараюсь прочитать и понять ваши комментарии. Спасибо, обязательно отпишусь позже. - person Víctor Martín; 19.08.2013
comment
ederwander, есть одна вещь, которую я не понимаю, как мне действовать дальше. Примените одну оконную функцию к вашим 2048 точкам, затем примените БПФ и получите величину! - person Víctor Martín; 20.08.2013
comment
Спасибо эдервандер. Еще вопрос, если не возражаете. Как я могу различать низкий и резкий звук, я хочу показать другие графики с каждым звуком этих типов. Извините, если я слишком надоедлив. - person Víctor Martín; 20.08.2013
comment
@Victor_J_Martin, для этого вы можете использовать экстрактор высоты тона, чтобы сказать вам в герцах, какова реальная частота вашего звука, и вы можете определить, насколько она низкая или высокая. - person ederwander; 20.08.2013
comment
Хорошо, дайте мне время узнать, что я могу сделать ^^ Спасибо @ederwander - person Víctor Martín; 20.08.2013
comment
вопрос: почему большинство анализаторов в магазине Google Play не измеряют частоты выше 20 кГц? есть ли аппаратное ограничение? Я хотел бы сделать приложение, которое генерирует/измеряет частоты выше 24K? возможно ли использовать лучшие Android-смартфоны? - person alexpfx; 07.01.2019

Я разработал анализатор спектра на основе БПФ с открытым исходным кодом. Пожалуйста, взгляните на

http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html.

Вы также можете получить исходный код из

https://github.com/sommukhopadhyay/FFTBasedSpectrumAnalyzer

Надеюсь, что это поможет вам.

person somenath mukhopadhyay    schedule 07.04.2014