Как получить детальную спектрограмму с выхода Фурье? - PullRequest
1 голос
/ 30 января 2020

Я разрабатываю небольшое приложение в Visual Studio 2010 для C# для рисования спектрограммы (частотная «тепловая карта»).

Я уже выполнил основы c:

  • Вырезать прямоугольный angular оконный массив из массива входных сигналов
  • Подать этот массив в БПФ, который возвращает комплексные значения
  • Сохранить значения величин в массиве (спектр для это окно)
  • Пошаговое окно и сохранение новых значений в других массивах, что приводит к появлению зубчатого массива, который содержит каждый шаг управления окнами и их спектры
  • Нарисуйте их в графическом объекте в цвет, который использует глобальные минимальные / максимальные значения тепловой карты как относительные холодные и горячие

В левой части скриншота показано мое приложение, а справа - спектрограмма для того же входа ( Длина 512 выборок) и то же самое прямоугольное angular окно размером 32 из программы «PAST - анализ временных рядов» (https://folk.uio.no/ohammer/past/index.html). Мой массив из 512 длинных выборок состоит только из целочисленных элементов в диапазоне от 100 до 1400. (Примечание: голубая полоса справа от спектрограммы PAST только потому, что я случайно оставил ненужный элемент «0» в конце этого списка). входной массив. В остальном они одинаковые.)

Ссылка на скриншот: https://drive.google.com/open?id=1UbJ4GyqmS6zaHoYZCLN9c0JhWONlrbe3

Но я столкнулся здесь с несколькими проблемами:

  1. Спектрограмма, кажется, очень не детализирована, связана с другой, которую я сделал в «Анализе временных рядов PAST» для справки, и она выглядит чрезвычайно детальной. Это почему? Я знаю, что для длинного временного окна, например, 32, БПФ возвращает 32 элемента, элемент 0 здесь не нужен, следующие 32/2 элемента имеют значения амплитуды, которые мне нужны. Но это означает, что частота «разрешение» на выходе для длинного окна 32 равна 16. Это именно то, что использует моя программа. Но программа «ПРОШЛОЕ» показывает гораздо больше деталей. Если вы посмотрите на узкие линии на синем фоне, вы увидите, что они показывают хороший рисунок на оси частот, но на моей спектрограмме эта информация остается невидимой. Почему?
  2. В начальной (windowSize / 2) широкой полосе пошаговой полосы и конечной (windowSize / 2) полосовой полосе меньше значений для FFT-ввода, следовательно, меньше выходной сигнал или просто меньше точность. Но в программе «ПРОШЛОЕ» эти части также кажутся относительно детальными, а не просто растянутыми полосами, как у меня. Как я могу улучшить это?
  3. Элемент 0. возвращаемого массива FFT (так называемый элемент "D C") - это огромное число, которое намного больше среднего значения выборки, или даже его сумма. Почему это так?
  4. Почему мои значения (например, максимум, который вы видите возле цветовой шкалы) так велики? Это просто значение величины из вывода FFT. Почему в программе PAST разные значения? Какую коррекцию я должен использовать на выходе FFT, чтобы получить эти значения?

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Чтобы получить больше сглаживания по вертикальной оси, обнулите БПФ, чтобы на выходе было больше (интерполированных) частотных бинов. Например, добавьте в ноль 32 точки данных, чтобы вы могли использовать БПФ с 256 или более точками.

Чтобы получить больше сглаживания по горизонтальной оси, перекрывайте вход FFT windows (перекрытие 75% или больше ).

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

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

Вы также можете использовать несколько разных БПФ на точку XY графика и решить, какие раскрасить с учетом местных свойств.

0 голосов
/ 31 января 2020

Здравствуйте, LimeAndConconut,

Несмотря на то, что я не знаю о PAST, я могу предоставить вам некоторую общую информацию о FFT. Вот ответ для каждой из ваших точек

1 - Вы правы, БПФ, выполненное на 32 элементах, возвращает 32 частоты (нулевую частоту, положительную и отрицательную составляющие). Это означает, что у вас уже есть вся информация в ваших данных, и PAST не может получить больше информации с тем же окном размером 32. Вот почему я подозреваю, что данные будут интерполированы для построения графика, но это только визуально. Еще раз, PAST не может создать больше информации, чем та, которая у вас есть в ваших данных.

2- Еще раз я согласен с вами. На границах у вас есть доступ к менее частотным компонентам. Вы можете выбрать разные стратегии: не показывать данные на границах или расширять эти данные с помощью нуля или циклического дополнения

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

4- Еще раз проверить нормализацию БПФ. Поскольку цветовой индикатор PAST показывает отрицательные значения, он представляется в виде логарифмической шкалы c. Это обычное использование логарифма для построения графиков с высокой динамикой для улучшения детализации.

...