Как получить подробную спектрограмму из вывода Фурье?

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

Я уже сделал основные вещи:

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

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

Ссылка на снимок экрана: https://drive.google.com/open?id=1UbJ4GyqmS6za/open? >

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

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

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

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


person LimeAndConconut    schedule 30.01.2020    source источник
comment
Если вам нужно большее разрешение по частоте в STFT (кратковременное преобразование Фурье), вам нужно больше временных шагов, а это означает, что это уменьшит ваше временное разрешение. Однако вы можете перекрывать свои временные интервалы (фактически, интерполяция). Контроллер домена, который вы можете удалить, вычтя из ваших данных среднее значение всех данных. Хотите ли вы сохранить это - вопрос вне программирования, это физический смысл ваших данных, о котором вам нужно подумать. То же касается палитры, возможно, вы еще не удалили DC.   -  person roadrunner66    schedule 31.01.2020
comment
Примечание: сначала я бы разработал что-то подобное в среде более высокого уровня (например, Matlab, Python Numpy, Mathematica), чтобы выяснить параметры. Это также упростит получение поддержки по вашим вопросам (можно опубликовать короткий код, код изображения сохранен, поэтому вы не увязнете в вопросе реализации C #).   -  person roadrunner66    schedule 31.01.2020
comment
Спасибо за ответы на все вопросы! :) Моя самая большая проблема заключалась в том, что (поскольку все мои значения Y огромны) я должен был вычесть среднее значение из всего массива сигналов перед любой обработкой. Теперь я это сделал. Я также использовал максимальное количество перекрытий и добавил нулевое отступление, что очень помогло в выделении деталей. Кроме того, логарифмическая окраска очень эффективна и позволяет лучше распознать информацию об амплитуде, близкую к максимальной. И если я использую 32, 64 (или любое четное число) длинных окон, оконная функция должна быть похожа на симметричную matlab: en.wikipedia.org/wiki/Window_function#Symmetry   -  person LimeAndConconut    schedule 10.02.2020


Ответы (2)


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

Чтобы добиться большей плавности на горизонтальной оси, перекрывайте окна ввода БПФ (перекрытие 75% или больше).

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

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

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

person hotpaw2    schedule 01.02.2020

Привет, LimeAndConconut,

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

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

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

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

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

person Romain F    schedule 30.01.2020