Преобразование FFT к spectogram

Для делания TDD много раз я использовал 'друга' ключевое слово в C++.
друг может знать все обо мне?

нет, ее единственное один путь дружба: '(

12
задан Luc Touraille 7 May 2012 в 07:47
поделиться

4 ответа

Обычно для того, чтобы получить весь БПФ видимым, является логарифм величины.

Итак, позиция выходного буфера сообщает вам, какая частота была обнаружена. Величина (норма L2) комплексного числа говорит вам, насколько сильной была обнаруженная частота, а фаза (арктангенс) дает вам информацию, которая намного важнее в пространстве изображения, чем в пространстве звука. Поскольку БПФ дискретное, частоты варьируются от 0 до частоты Найквиста. В изображениях первый член (DC) обычно самый большой, поэтому он является хорошим кандидатом для использования при нормализации, если это ваша цель. Не знаю, верно ли это и для аудио (сомневаюсь)

11
ответ дан 2 December 2019 в 05:04
поделиться

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

Прямая FT будет иметь тенденцию давать большие числа на выходе, чем на входе. Вы можете думать об этом как о том, что вся интенсивность с определенной частотой отображается в одном месте, а не распределяется по набору данных. Это имеет значение? Вероятно, не потому, что вы всегда можете масштабировать данные в соответствии со своими потребностями. Однажды я написал пару БПФ / ОБПФ на основе целых чисел, и каждый проход требовал масштабирования, чтобы предотвратить переполнение целых чисел.

Реальные данные, которые вы вводите, преобразуются во что-то почти сложное. Как оказалось, buffer [0] и buffer [n / 2] действительны и независимы. Это хорошее обсуждение здесь .

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

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

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

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

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

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

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

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

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

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

Это просто зависит от того, что вы делаете. Вычисление

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

Это просто зависит от того, что вы делаете. Вычисление

const float value = sqrt((realValue * realValue) + (imagValue * imagValue));

извлекает информацию об интенсивности, но отбрасывает информацию о фазе. Логарифм по существу просто смягчает большие пики.

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

5
ответ дан 2 December 2019 в 05:04
поделиться

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

Для проверки работоспособности я бы предложил создать образцы данных с известными характеристиками, например Fs / 2, Fs / 4 (Fs = частота дискретизации) и сравните результат процедуры БПФ с ожидаемым. Попробуйте создать синус и косинус на одной и той же частоте, так как они должны иметь одинаковую величину в спектре, но иметь разные фазы (т.е. realValue / imagValue будет отличаться, но сумма квадратов должна быть одинаковой.

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

1
ответ дан 2 December 2019 в 05:04
поделиться

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

mag
 /\
 |
 |      !         !
 |      !    !    !
 +--!---!----!----!---!--> freq
 0          Fs/2      Fs

Теперь нам нужно выяснить частоты.

Поскольку входной сигнал имеет действительные значения, БПФ симметрично относительно середины (компонента Найквиста) с первый член - составляющая постоянного тока. Зная частоту дискретизации сигнала Fs , частота Найквиста равна Fs / 2. И поэтому для индекса k соответствующая частота равна k * Fs / 512

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

7
ответ дан 2 December 2019 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: