Matlab - лучше понять БПФ и найти шаг

Я знаю, что есть множество тем по поиску высоты тона в FFT, и я получил приличное понимание всего процесса от преобразования выборок данных из временной области -> частотной области, но есть еще некоторые области (возможно, более продвинутые) что я немного застрял на.

Я собираюсь шаг за шагом пройти через мой текущий процесс, и, надеюсь, кто-то может помочь мне понять, где я иду не так!

Прежде чем начать, пример, который я здесь использую, представляет собой Wav-файл, который я создал в Logic. Это просто предустановка фортепиано в шкале A, начинающаяся с клавиши A4, и она просто перемещается вверх по шкале (A4, B4, C#). 5, D5...) каждые полбары в общей сложности 4 секунды при 120 ударов в минуту. Вот ссылка на wav, если это поможет: [a https://www.dropbox.com/s/zq1u9aylh5cwlmm/PianoA4_120.wav?dl=0%5D

Шаг 1: Я анализирую метаданные и фактические данные образца. Метаданные: channels => 2, sample_rate => 44100, byte_rate => 176400, bits_per_sample => 16, data_chunk_size => 705600, data => ...

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

Шаг 3: Теперь мне нужно найти максимальную величину каждого БПФ. Я делаю это, находя все величины реальных / сложных результатов, а затем нахожу максимальное значение. Я использую Matlab, чтобы помочь мне, поэтому я бегу max(abs(fft(data))), Значения, которые я получил от нахождения максимума каждого БПФ, были 1275,6 и 1084,0.

Шаг 4: Найти индекс этих максимальных значений из их соответствующих БПФ, а затем найти частоту в этом индексе отображенных значений частотной области. Это дало мне 1177,0 Гц и 1177,5 Гц.

Это где я запутался! Я построил график временного интервала и увидел, что шаг определяется как А4, просто взглянув на Период и зная, что такое период А4, но я пытаюсь понять, как я могу прийти к такому же выводу через FFT. Любая помощь / места, чтобы указать мне, будет очень признателен!

1 ответ

A4 обычно 440 Гц. Я предполагаю, что вы обнаружили 3-ю гармонику 440 Гц, и у вас возникла ошибка "один за другим".

Вот некоторые замечания о шагах, которые вы используете:

Шаг 2:

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

Шаг 3:

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

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

Шаг 4:

Вы находите центральную частоту бункера FFT с самой высокой энергией. Поскольку музыкальная шкала - логарифмическая основа-2, это разумно приблизительно для более высокой частоты, но на низкой частоте не будет работать, даже если вы используете большие БПФ (в этом случае вы сжигаете много циклов ЦП и теряете временное разрешение).

Чтобы добиться большего, чем это, вы можете использовать Кратковременное преобразование Фурье и использовать i) фазу (Phi) из последовательных окон данных FFT ii) и что F = dPhi/dt

Из этого вы можете получить довольно точные результаты.

Другие вопросы по тегам