Объясните мне FFT

Я хочу взять данные аудио PCM и найти в нем пики. В частности, я хочу вернуть частоту и время, в которые происходит пик.

мое понимание этого заключается в том, что я должен взять данные PCM и сбросить их в массив, установив его как реальные значения со сложными частями, установленными в 0. Затем я беру БПФ, и я получаю массив обратно. Если каждое число в массиве является значением величины, как получить частоту, связанную с каждым из них? Кроме того, я беру величину реальная и сложная часть или просто отбросить сложные значения?

наконец, если бы я хотел найти вершины в одной песне, я просто установил небольшое окно для FFT и сдвинул его по всему аудио? Есть предложения, насколько большим должно быть это окно?

3 ответов


возможно, вы действительно ищете спектрограммы, что в основном является БПФ данных в маленьком окне, которое скользит по временной оси. Если у вас есть программное обеспечение, которое реализует это, это может сэкономить вам некоторые усилия. Это то, что обычно используется для анализа изменяющихся во времени акустических сигналов, и это очень полезный способ взглянуть на звуки. Кроме того, есть некоторые трюки, например, с оконными данными для FFS, что спектрограмма, вероятно, будет права, но будет сложнее (хотя и не очень трудный) для вас, чтобы сделать правильно.


Если дискретизация ваших данных PCM равна F, то самая высокая частотная составляющая в FFT равна F/2. Предположим, что ваши данные PCM были отобраны на 44100Hz, тогда ваши значения FFT будут работать от 0Hz (DC) до 22050Hz. Если вы начинаете с N выборок (N-степень 2), то FFT может возвращать N/2 значений, представляющих все положительные частоты от 0 до F/2, или он может возвращать N значений, которые также включают отрицательные частоты от-F/2 до 0. Вы должны проверить спецификацию своего алгоритма FFT на узнайте, на какую частоту сопоставляется каждый элемент массива.

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

предположим, что ваш БПФ из N образцов PCM возвращает N / 2 комплексных значений, представляющих положительные частоты. Расстояние между 2 сложных образцов Ф/2я Гц. С образцами F=44100Hz и N=1024 это будет 21.5 Hz. Это ваше частотное разрешение. Если вам нужно чтобы найти более низкие частоты ударов, окно FFT необходимо будет расширить.


хорошо, Необработанный массив размером 512 комплексных чисел, выражающий входную волну, при обработке БПФ мы заменим мнимые части нулем (по назначению), оставив реальные части, затем передадим массив БПФ с частотой дискретизации : 8192 Гц.

теперь у нас есть массив 512 ffted реальных значений, каждое значение является иррациональным числом, каждое иррациональное число выражает несколько полезных значений.

чтобы получить основную частоту надо делить частота дискретизации по размеру буфера:

8192/512 = 32;

32 разрешение значений БПФ означает, что мы узнаем частоты высокой амплитуды вблизи чисел, кратных 32.

как если бы у нас была волна

частота : 3 48 23 128 Амплитуда: 10 5 12 8 дБ (ref = 1)

после БПФ получаем:

частота : 0 32 64 128 Амплитуда : 9 8 2 8

FFT означает частотную область оно аранжирует согласно частоте Время-домен на другой стороне означает организацию по времени мы слушаем музыку от второго нуля до второго N.

БПФ может слушать только тогда, когда он организован по частоте от частоты 0 до частоты N.

таким образом, он упорядочивает частоты в порядке возрастания, так как он не взял все фактические образцы из аудио (которые приближаются к бесконечности), как принимая каждую наносекунду и меньше к БПФ, к счастью, это не происходит БПФ берет образцы из аудио, берет образец Каждый (1 / частота дискретизации) второй. эти образцы буферизуются (в нашем случае : 512), каждые 512 образцов буферизуются в БПФ, выход составляет 512 значений БПФ.

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

частоты показаны на регулярной основе, которая является фундаментальной частоте дискретизации, деленной на размер буфера, который в нашем случае 8192/512 = 32.

Так, частоты питания показаны каждые 32 частоты, мощность ближайшей частоты показана в зависимости от того, насколько частота мощности близка к индексу.

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

чтобы показать частоты, мы печатаем индекс по возрастанию, соответствующий амплитуде.

амплитуда = 20log10 (выход/ref)

амплитуды напечатанные рядом с каждым индексом показывают силу частоты & получают более точным по точности разрешения.

заключение, FFT производит индекс амплитуд, каждая амплитуда выражает силу своего соответствуя индекса (частоты).