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