2016-12-19 19 views
0

Предполагается, что это приложение для Android, поэтому данный язык, очевидно, является Java. Я пытаюсь записать некоторый звук и получить доминирующую частоту. Это очень специфическая цель, и частоты, которые мне нужно обнаружить, - это чистые звуки, сделанные другим устройством. У меня есть часть записи, поэтому единственное, что мне нужно сделать, это рассчитать частоту из создаваемого буфера.Как применить FFT к записи звука, чтобы получить частоту?

Я знаю, что я должен использовать то, что называется FFT, так что я положил их в свой проект: http://introcs.cs.princeton.edu/java/97data/FFT.java и http://introcs.cs.princeton.edu/java/97data/Complex.java.html

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

Кто-нибудь знает, как это сделать, и объясните это относительно простым способом?

+0

См. [Этот вопрос] (http://stackoverflow.com/q/6627288/253056). –

ответ

1

Как правило, реализация DFT (FFT включена) будет принимать N отсчетов во временной области (ваша запись) и производить комплексные значения N/2 в частотной области. Угол комплексного значения представляет собой фазу, а ее абсолютная величина представляет собой амплитуду. Обычно вывод значений будет упорядочен с самой низкой частоты до самой высокой частоты.

Некоторые реализации могут выводить N комплексных значений, но дополнительные значения являются избыточными, если только ваш ввод содержит сложные значения. Это не должно быть в вашем случае. Вот почему многие реализации вводят реальные значения и выводят N/2 комплексные значения, поскольку это наиболее частое использование FFT.

Итак, вам нужно будет рассчитать абсолютное значение выхода, так как амплитуда - это то, что вас интересует. Абсолютное значение комплексного числа является квадратным корнем из суммы квадрата его реального и квадрата его сложного компонента.

Точные частоты каждого значения будут зависеть от количества выборок ввода и интервала между образцами. Частота значения в позиции i (при условии, что i идет от 0 до N/2 - 1) будет i * (частота дискретизации)/N.

Это предполагает, что ваш N равен, а не пытается объяснить случай из N является нечетным Я рекомендую вам держать N даже для простоты. Для случая FFT N всегда будет сила двух, поэтому N всегда будет даже в любом случае.

Если вы ищете тон в течение минимального времени T, я бы также рекомендовал обрабатывать входные данные в блоках размера T/2.

+0

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

+0

@superchampionoftheworld Вам нужно будет посмотреть документацию по реализации FFT, которую вы используете, чтобы определить, какой вклад он ожидает. Я использовал библиотеку до того, как у нее есть одна функция, которая ожидает комплексные числа для ввода и другую функцию, которая ожидает действительные числа для ввода. Если для ввода функции требуются комплексные номера, вы должны отправить ее своим значениям, если мнимая составляющая равна нулю. –

+0

Я только что проверил вашу ссылку. Да, для этой реализации вы захотите преобразовать свои входы в сложные числа. Установите реальный компонент на ваш вход, а мнимый компонент - на ноль. –

1

Преобразование Фурье - это математическая техника, которая позволяет вам перемещаться между временными и частотными областями для зависящих от времени сигналов.

FFT - это компьютерный алгоритм для быстрого и эффективного вычисления дискретных преобразований.

Вы возьмете образец своего сигнала времени и примените FFT к нему, чтобы получить амплитуду в зависимости от частоты для образца.

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

Если у вас нет этого фона, приложите все усилия, чтобы обработать библиотечную функцию FFT как черный ящик и использовать то, что он возвращает.