Документация Engee

spectrogram

Спектрограмма с использованием оконного преобразования Фурье.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • s, f, time, p = spectrogram(x) — возвращает Оконное преобразование Фурье (ОПФ) входного сигнала x. Каждый столбец s содержит оценку краткосрочного, локализованного во времени частотного содержания x. Величина s2 является спектрограммой временно-частотного представления x [1].

  • s, f, time, p = spectrogram(x, window) — дополнительно использует аргумент window для разделения сигнала на сегменты и выполнения оконной обработки.

  • s, f, time, p = spectrogram(x, window,noverlap) — дополнительно использует аргумент noverlap для перекрытия смежных сегментов.

  • s, f, time, p = spectrogram(x, window, noverlap, nfft) — дополнительно использует аргумент nfft для задания числа точек в дискретном преобразовании Фурье.

  • s, f, time, p = spectrogram(x, window, noverlap, freq) — дополнительно использует аргумент freq для задания нормализованных или циклических частот.

  • s, f, time, p = spectrogram(___, Name=Value) — использует аргументы Name=Value в дополнение к любым входным аргументам, представленным в предыдущих синтаксисах.

Аргументы

Входные аргументы

# x — входной сигнал
вектор

Details

Входной сигнал, заданный как вектора-строка или вектор-столбец.

Типы данных

Float32, Float64

Поддержка комплексных чисел

Да

# window — окно
целое положительное число | вектор

Details

Значение окна, заданное как положительное целое число, вектор-строка или вектор-столбец. Используйте window для разделения сигнала на сегменты:

  • Если window — целое число, то spectrogram делит x на сегменты длиной window и использует для каждого сегмента окно Хэмминга такой же длины.

  • Если window — вектор, то spectrogram делит x на сегменты той же длины, что и вектор, и использует для каждого сегмента окно window.

Если длина x не может быть точно разделена на целое число сегментов без перекрывающихся отсчетов, то x соответственно усекается.

Если вы не укажете window, то spectrogram использует окно Хэмминга таким образом, что x делится на восемь сегментов без перекрывающихся отсчетов.

# noverlap — количество пересекающихся точек
целое неотрицательное число

Details

Количество пересекающихся точек сигнала, заданное как неотрицательное целое число.

  • Если аргумент window — скаляр, то значение аргумента noverlap должно быть меньше значения аргумента window.

  • Если аргумент window — вектор, то значение аргумента noverlap должно быть меньше значения длины аргумента window.

Если не указать значение аргумента noverlap, то спектрограмма использует число, которое дает 50% перекрытия между сегментами. Если длина сегмента не указана, функция устанавливает значение noverlap равным , где — длина входного сигнала, а символы обозначают округление вниз.

# nfft — количество точек в дискретном преобразовании Фурье
целое положительное число

Details

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

Если не указать значение для nfft, то спектрограмма будет использовать значение , где , символы обозначают округление вверх, при этом:

  • window, если аргумент window — скаляр;

  • length(window), если аргумент window — вектор.

# freq — нормализованные/циклические частоты
вещественный вектор

Details

Значения частот, заданные как вещественный вектор. Тип задаваемых частот зависит от значения аргумента fs:

  • Если значение входного аргумента fs не задано, то частоты по умолчанию считаются нормализованными;

  • Если значение входного аргумента fs указано, то частоты считаются циклическими.

Можно задать либо freq как вектор, либо nfft как целое положительное число. Одновременное использование этих аргументов выдаст ошибку.

Входные аргументы «имя-значение»

Укажите необязательные пары аргументов в формате Name=Value, где Name — имя аргумента, а Value — соответствующее значение. Аргументы типа Name=Value должны располагаться после других аргументов, но порядок пар не имеет значения.

# fs — частота дискретизации
1 Гц (по умолчанию) | положительное вещественное число

Details

Частота дискретизации, заданная как положительный скаляр. Частота дискретизации — это количество отсчетов в единицу времени. Если единицей времени являются секунды, то частота дискретизации выражается в Гц.

# freqrange — частотный диапазон оценки плотности энергетического спектра
"onesided" | "twosided"

Details

Частотный диапазон для оценки плотности энергетического спектра (PSD), заданный как "onesided" или "twosided".

Для сигналов с вещественными значениями по умолчанию используется значение "onesided". Для комплексных сигналов по умолчанию используется значение "twosided", а указание значения "onesided" приводит к ошибке.

  • Значение "onesided" — возвращает одностороннюю спектрограмму вещественного входного сигнала.

    • Если значение аргумента nfft четное, то аргумент p имеет nfft/2 + 1 строк и вычисляется на интервале [0, π] радиан на отсчет.

    • Если значение аргумента nfft нечетное, то p имеет (nfft + 1)/2 строки и интервал [0, π) радиан на отсчет. Если вы укажете fs, то интервалы будут соответственно [0, fs/2] циклов на единицу времени и [0, fs/2) циклов на единицу времени.

  • Значение "twosided" — возвращает двухстороннюю спектрограмму вещественного или комплексного сигнала. Аргумент p имеет nfft строк и вычисляется на интервале [0, 2π) радиан на отсчет. Если вы укажете аргумент fs, то интервал будет иметь [0, fs) циклов на единицу времени.

# centered — является ли частотный диапазон центрированным
false (по умолчанию) | true

Details

Включение центрирования частотного диапазона, заданное как false или true.

# spectrumtype — масштабирование плотности энергетического спектра
"psd" (по умолчанию) | "power"

Details

Масштабирование плотности энергетического спектра (PSD), заданное как "psd" или "power".

Если тип спектра не указан или указано значение "psd", то функция возвращает спектральную плотность мощности.

Значение "power" масштабирует каждую оценку плотности энергетического спектра на эквивалентную полосу шума окна. В результате получается оценка мощности на каждой частоте.

# freqloc — ось отображения частот
"xaxis" (по умолчанию) | "yaxis"

Details

Ось отображения частоты, заданная как "xaxis" или "yaxis".

  • Значение "xaxis" — отображение частоты по оси и времени по оси .

  • Значение "yaxis" — отображение частоты по оси и времени по оси .

# MinThreshold — порог минимальных значений
−Inf (по умолчанию) | вещественный скаляр

Details

Пороговое значение, заданное как вещественный скаляр в дБ. Спектрограмма обнуляет те элементы s, для которых 10 log10(s) ≤ MinThreshold.

# OutputTimeDimension — направление времени
"acrosscolumns" (по умолчанию) | "downrows"

Details

Направление времени выходных данных, заданное как "acrosscolumns" или "downrows". Установите для этого аргумента значение "downrows", если хотите, чтобы направление времени для выходных аргументов отображалось по строкам, а направление частот — по столбцам. Установите значение "acrosscolumns", если хотите, чтобы направление времени для выходных аргументов отображалось по столбцам, а направление частот — по строкам.

# out — тип выходных данных
:plot (по умолчанию) | :data

Details

Тип выходных данных:

  • :data — функция возвращает данные s, f, time и p;

  • :plot — функция строит спектрограмму.

Если out = :plot, то можно дополнительно передавать параметры для отображения итогового heatmap(). Например, если вызвать spectrogram(x, c = cgrad([:black, :white], [0.1, 0.3, 0.8])), то на спектрограмме будут серые цвета вместо стандартных.

Выходные аргументы

# s — дискретное преобразование Фурье
матрица

Details

Дискретное преобразование Фурье, возвращаемое в виде матрицы. Время увеличивается по столбцам матрицы s, а частота увеличивается по строкам, начиная с нуля.

  • Если x — сигнал длиной , то матрица s имеет столбцов, где

  • Если x — вещественный, а nfft — четное, то матрица s имеет (nfft/2 + 1) строк.

  • Если x — вещественный, а nfft — нечетное, то матрица s имеет (nfft + 1)/2 строк.

  • Если x — комплексный, то матрица s имеет nfft строк.

Если параметр freqrange имеет значение "onesided", то спектрограмма выводит значения s в положительном диапазоне Найквиста и не сохраняет полную мощность.

# f — циклические частоты
вектор

Details

Циклические частоты, возвращаемые в виде вектора. Длина вектора f равна количеству строк матрицы s.

# time — моменты времени
вектор

Details

Моменты времени, возвращаемые в виде вектора. Значения времени в t соответствуют середине каждого сегмента.

# p — плотность энергетического спектра
матрица

Details

Плотность энергетического спектра (PSD) или спектр мощности, возвращаемый в виде матрицы.

  • Если x — вещественное число, а freqrange не указан или установлен в значение "onesided", то p содержит одностороннюю модифицированную периодограмму PSD или спектра мощности каждого сегмента. Функция умножает мощность на 2 на всех частотах, кроме 0 и частоты Найквиста, чтобы сохранить общую мощность.

  • Если x — комплексное число или если freqrange установлен в значение "twosided" или "centered", то p содержит двустороннюю модифицированную периодограмму PSD или спектра мощности каждого сегмента.

  • Если вы зададите вектор нормализованных или циклических частот в freq, то p будет содержать модифицированную периодограмму PSD или спектра мощности каждого сегмента, вычисленную на входных частотах.

Примеры

Значения по умолчанию для спектрограммы

Details

Сгенерируем отсчетов сигнала, представляющего собой сумму синусоид. Нормализованные частоты синусоид составляют рад/отсчет и рад/отсчет. Синусоида с более высокой частотой имеет в раз большую амплитуду, чем другая синусоида.

import EngeeDSP.Functions: spectrogram
N = 1024
n = 0:N-1
w0 = 2pi / 5
x = sin.(w0 * n) .+ 10 * sin.(2 * w0 * n)

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

spectrogram(x,freqloc="yaxis")

spectrogram 1

Спектрограмма комплексного сигнала

Details

Сгенерируем 512 отсчетов частотной модуляции с синусоидально изменяющимся частотным составом. Вычислим центрированное двустороннее оконное преобразование Фурье частотной модуляции. Разделим сигнал на сегменты по 32 отсчета с перекрытием в 16 отсчетов. Укажем 64 точки дискретного преобразования Фурье. Построим спектрограмму.

import EngeeDSP.Functions: spectrogram
N = 512
n = collect(0:N-1)

x = @. exp(im*pi*sin(8*n/N)*32)
spectrogram(x, 32, 16, 64, centered = true, freqloc="yaxis")

spectrogram 2

Отобразим результаты в виде данных.

spectrogram(x, 32, 16, 64, centered = true, freqloc="yaxis", out=:data)
(ComplexF64[-0.004799003568266007 - 0.0505661817205643im 0.04928181142575791 - 0.08168061694423136im … 0.06661413792128079 + 0.005582741943515573im 0.06563897996263357 - 0.03809302080510557im; 0.08251130568172917 - 0.009465091175966937im 0.01113491156754788 + 0.0019301579098507408im … -0.0033130937073331257 + 0.04853476281962177im 0.013263617768417113 + 0.025903864451430003im; … ; -0.009649405525420679 - 0.05239849276178002im 0.04401940995315085 - 0.0914065432314291im … 0.06820937107281076 - 6.325260894440854e-5im 0.06223032913485138 - 0.04414639111404428im; 0.08717673328273712 - 0.01888297777102288im 0.0132333274580263 + 0.0005901735083794213im … 0.002529248964486752 + 0.05007735729089752im 0.017119544189724056 + 0.024263377986849743im], [-3.043417883165112, -2.945243112740431, -2.84706834231575, -2.748893571891069, -2.650718801466388, -2.5525440310417067, -2.4543692606170255, -2.356194490192345, -2.2580197197676637, -2.1598449493429825  …  2.2580197197676637, 2.3561944901923453, 2.454369260617026, 2.5525440310417067, 2.6507188014663883, 2.748893571891069, 2.8470683423157497, 2.9452431127404313, 3.043417883165112, 3.1415926535897936], [2.5464790894703255 5.092958178940651 … 76.39437268410977 78.94085177358009], [3.3313443855835635e-5 0.00011750773553006685 … 5.770022477295285e-5 7.436932913915006e-5; 8.906550573571001e-5 1.6490579693362508e-6 … 3.0558345518866313e-5 1.0935898096347522e-5; … ; 3.665443356386854e-5 0.00013290498623780864 … 6.0074958410346855e-5 7.516942675213517e-5; 0.00010273510683279117 2.2657190730313684e-6 … 3.246341980220297e-5 1.1385977847041683e-5])

Дополнительно

Оконное преобразование Фурье (ОПФ)

Details

Оконное преобразование Фурье (ОПФ) используется для анализа изменения частотного содержания нестационарного сигнала с течением времени. Величина квадрата ОПФ известна как спектрограмма временно-частотного представления сигнала.

ОПФ сигнала вычисляется путем скольжения окна анализа длины по сигналу и вычисления дискретного преобразования Фурье (ДПФ) каждого сегмента оконных данных. Окно скользит по исходному сигналу с интервалом в отсчетов, что эквивалентно отсчетов перекрытия между соседними сегментами. Большинство оконных функций сужаются на краях, чтобы избежать спектрального звона. ДПФ каждого сегмента с окном складывается в комплексную матрицу, содержащую величину и фазу для каждой точки во времени и на частоте. Матрица ОПФ имеет столбцов, где — длина сигнала , а символы обозначают функцию округления вниз. Количество строк в матрице равно , числу точек ДПФ, для центрированных и двусторонних преобразований и нечетному числу, близкому к , для односторонних преобразований вещественных сигналов.

-й столбец матрицы ОПФ содержит ДПФ оконных данных, центрированных по времени :


spectrogram 1 ru

Если в оконном преобразовании Фурье есть нули, его преобразование в децибелы приводит к отрицательным бесконечным значениям, которые невозможно вывести на график. Чтобы избежать этой потенциальной трудности, функция spectrogram добавляет eps к оконному преобразованию Фурье, когда вы вызываете ее без выходных аргументов.

Литература

  1. Boashash, Boualem, ed. «Time Frequency Signal Analysis and Processing: A Comprehensive Reference.» Second edition. EURASIP and Academic Press Series in Signal and Image Processing. Amsterdam and Boston: Academic Press, 2016.

  2. Chassande-Motin, Éric, François Auger, and Patrick Flandrin. «Reassignment.» In Time-Frequency Analysis: Concepts and Methods. Edited by Franz Hlawatsch and François Auger. London: ISTE/John Wiley and Sons, 2008.

  3. Fulop, Sean A., and Kelly Fitz. «Algorithms for computing the time-corrected instantaneous frequency (reassigned) spectrogram, with applications.» Journal of the Acoustical Society of America. Vol. 119, January 2006, pp. 360–371.

  4. Oppenheim, Alan V., and Ronald W. Schafer, with John R. Buck. «Discrete-Time Signal Processing.» Second edition. Upper Saddle River, NJ: Prentice Hall, 1999.

  5. Rabiner, Lawrence R., and Ronald W. Schafer. «Digital Processing of Speech Signals.» Englewood Cliffs, NJ: Prentice-Hall, 1978.