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

spectralCrest

Спектральный гребень для сигналов и спектрограмм.

Библиотека

EngeeDSP

Синтаксис

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

  • crest,spectralPeak,spectralMean = spectralCrest(x,f) — возвращает спектральный гребень сигнала x с течением времени, пик спектра и спектральное среднее. Интерпретация x функцией зависит от формы f.

  • crest,spectralPeak,spectralMean = spectralCrest(x,f,Name,Value) — задает параметры с использованием одного или нескольких аргументов типа «имя-значение».

  • spectralCrest(___,out=:plot) — строит график спектрального гребня.

    • Если входной сигнал находится во временной области, график спектрального гребня строится в зависимости от времени.

    • Если входной сигнал находится в частотной области, график спектрального гребня строится в зависимости от номера кадра.

Аргументы

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

# x — входной сигнал
вектор-столбец | матрица

Details

Входной сигнал, заданный как вектор или матрица. Интерпретация x функцией зависит от формы f.

Типы данных

Float32, Float64

# f — частота дискретизации или вектор частот (Гц)
скаляр | вектор

Details

Частота дискретизации или вектор частот в Гц, заданные как скаляр или вектор соответственно. Интерпретация x функцией зависит от формы f:

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

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

  • Количество строк x, , должно быть равно количеству элементов f.

Типы данных

Float32, Float64

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

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

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

Следующие аргументы типа «имя-значение» применяются, если x — сигнал во временной области. Если x — сигнал в частотной области, аргументы типа «имя-значение» игнорируются.

# Window — окно, применяемое во временной области
rectwin(round(f*0.03)) (по умолчанию) | вектор

Details

Окно, применяемое во временной области, заданное как вещественный вектор. Количество элементов вектора должно находиться в диапазоне [1,size(x,1)]. Количество элементов вектора также должно быть больше OverlapLength.

Типы данных

Float32, Float64

# OverlapLength — количество отсчетов, перекрывающихся между соседними окнами
round(f*0.02) (по умолчанию) | неотрицательный скаляр

Details

Количество отсчетов, перекрывающихся между соседними окнами, заданное как целое число в диапазоне [0,size(Window,1)).

Типы данных

Float32, Float64

# FFTLength — количество элементов в ДПФ
numel(Window) (по умолчанию) | положительный целочисленный скаляр

Details

Количество элементов, используемых для вычисления ДПФ оконных входных выборок, заданное как положительный целочисленный скаляр. Если не аргумент не задан, FFTLength по умолчанию равен количеству элементов в Window.

Типы данных

Float32, Float64

# Range — диапазон частот (Гц)
[0,f/2] (по умолчанию) | двухэлементный вектор-строка

Details

Диапазон частот в Гц, заданный как двухэлементный вектор-строка возрастающих вещественных значений в диапазоне [0,f/2].

Типы данных

Float32, Float64

# SpectrumType — тип спектра
"power" (по умолчанию) | "magnitude"

Details

Тип спектра, заданный как "power" или "magnitude":

  • "power" — спектральный гребень рассчитывается для одностороннего спектра мощности;

  • "magnitude" — спектральный гребень рассчитывается для одностороннего амплитудного спектра.

Типы данных

String

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

Details

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

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

  • :plot — функция возвращает график.

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

# crest — спектральный гребень
скаляр | вектор | матрица

Details

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

# spectralPeak — пик спектра
скаляр | вектор | матрица

Details

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

# spectralMean — спектральное среднее
скаляр | вектор | матрица

Details

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

Примеры

Спектральный гребень сигнала во временной области

Details

Создадим ЛЧМ-сигнал с белым гауссовским шумом и рассчитаем гребень, используя параметры по умолчанию.

import EngeeDSP.Functions: chirp, randn, spectralCrest

fs = 1000
t = (0:1/fs:10)
f1 = 300
f2 = 400
x = chirp(t, f1, 10, f2) + randn(length(t), 1)

crest = spectralCrest(x, fs)

Построим график зависимости спектрального гребня от времени.

spectralCrest(x, fs, out=:plot)

spectralCrest 1

([4.987046327015055, 5.236871947723927, 7.544804457899835, 10.3772996669661, 7.705619466415934, 5.99985432220379, 4.868975479415114, 5.902444766668258, 5.6781203280701815, 6.523480840096338  …  7.803614225515488, 8.289150599849984, 8.382547366360493, 6.028262627692971, 6.683863065009292, 5.194224063455523, 3.7499682104979466, 5.218718311184415, 3.207068721139457, 6.082745967003252], [0.439680011925611, 0.601102975643176, 1.034484757673182, 1.3330997948299792, 0.8496287200130014, 0.4947671774843161, 0.43476209921716236, 0.5070692566692776, 0.6240111902833801, 0.8937070726200211  …  0.962580947281854, 1.2053879463201618, 1.4011032035761652, 0.8161989525511318, 0.716299380591645, 0.37571979028258434, 0.25389759893331165, 0.48721486174074174, 0.31362312100811496, 0.6811440879165471], [0.08816441298005284, 0.11478282868925793, 0.13711220263502233, 0.12846307205270513, 0.11026092369549412, 0.08246319842355515, 0.08929231643396737, 0.08590834420556587, 0.1098974932247451, 0.1369984973554123  …  0.1233506577163312, 0.14541754692476894, 0.16714527724577494, 0.1353953871886124, 0.10716847033290458, 0.072334151490691, 0.06770660034464596, 0.09335910326805238, 0.09779120694884458, 0.11197970318200254], Plot{Plots.PlotlyJSBackend() n=1})

Спектральный гребень сигнала в частотной области

Details

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

import EngeeDSP.Functions: chirp, randn, stft

fs = 1000
t = (0:1/fs:10)'
f1 = 300
f2 = 400
x = chirp(t, f1, 10, f2) + randn(size(t)...)

s, f = stft(x, fs, "FrequencyRange", "onesided")
s = abs.(s).^2

Рассчитаем гребень спектрограммы с течением времени.

import EngeeDSP.Functions: spectralCrest

crest = spectralCrest(s, f)

Построим график зависимости спектрального гребня от номера кадра.

spectralCrest(s, f, out=:plot)

spectralCrest 2

([13.278262719339581, 11.423943909400123, 10.704344652278133, 7.265409265608759, 15.671348771900583, 17.14664360019774, 16.805060471491807, 14.696328543184194, 17.09013028905847, 15.936360071580983  …  16.710312667671143, 16.761812477538534, 12.62023888820894, 10.886155724606253, 13.208164879678929, 15.219986950457587, 11.520098623729307, 16.272350151097733, 18.269299846830197, 16.45774860128549], [1038.875221526367, 1003.8420042054646, 878.9222908403066, 340.3639889446644, 1013.9709212810934, 1511.5917119138305, 1166.5576026614406, 845.4456363019548, 1122.2172446705913, 1132.3238949123497  …  1483.6967321132968, 1213.326351390993, 859.9980861071526, 864.0666804644605, 1179.3520050171578, 766.8614058144813, 652.278982569946, 1323.7297764621535, 1825.3095783670533, 1640.464109040237], [78.23879098379803, 87.87175533831703, 82.10893047555709, 46.847187336823175, 64.70221140755848, 88.15671143339087, 69.41704283899455, 57.52767664506604, 65.66463951354794, 71.05285584828131  …  88.78928609060397, 72.38634563039626, 68.14435873402103, 79.37298549858043, 89.28961863821208, 50.38515527711577, 56.62095472224257, 81.34840783111189, 99.91130441070254, 99.67730998832384], Plot{Plots.PlotlyJSBackend() n=1})

Указание параметров, отличных от стандартных

Details

Создадим ЛЧМ-сигнал с белым гауссовским шумом.

import EngeeDSP.Functions: chirp, randn

fs = 1000
t = (0:1/fs:10)
f1 = 300
f2 = 400
x = chirp(t, f1, 10, f2) + randn(length(t), 1)

Рассчитаем пик спектра мощности с течением времени. Рассчитаем пик для окон Хэмминга длительностью 50 мс с перекрытием 25 мс. Используем диапазон от 62.5 Гц до fs/2 для расчета пика.

import EngeeDSP.Functions: spectralCrest, hamming

crest = spectralCrest(x, fs,
                      "Window", hamming(round(Int, 0.05*fs)),
                      "OverlapLength", round(Int, 0.025*fs),
                      "Range", [62.5, fs/2])

Построим график зависимости гребня от времени.

spectralCrest(x, fs,
              "Window", hamming(round(Int, 0.05*fs)),
              "OverlapLength", round(Int, 0.025*fs),
              "Range", [62.5, fs/2],
              out=:plot)

spectralCrest 3

([9.538007545680625, 5.730876827698805, 5.032509222116753, 8.153962933846854, 6.409421405881727, 5.675496154818911, 3.936388047909756, 6.4173265830507695, 8.571412474805326, 8.245914575869225  …  9.01887114861341, 6.801343613682713, 4.948170085776451, 4.303209591503631, 6.032361588552264, 5.892015558392096, 4.323588797979937, 4.386216853001777, 5.755291814282484, 8.589943998230682], [1.072192257755449, 0.7611738870970485, 0.6151487100923281, 0.694504549763681, 0.41087548375427874, 0.35978967731876343, 0.38720592502049855, 0.3867047677182591, 0.846628743616088, 0.5501511870614189  …  0.9982941134388452, 0.6086401775262335, 0.16918248208293274, 0.2568272244259427, 0.4861993272274322, 0.563021155034732, 0.48023412546096145, 0.37966201056426135, 0.5141970164720814, 1.0541601271133798], [0.11241260322141401, 0.1328197952917255, 0.12223498913601331, 0.08517386642522173, 0.06410492581705285, 0.06339351970369599, 0.0983657912552872, 0.06025948075318637, 0.09877353891259522, 0.06671803133534474  …  0.11068947510047597, 0.08948822645892963, 0.03419091889530009, 0.0596827133247307, 0.08059850526037807, 0.09555663074120903, 0.11107303397708311, 0.08655796630402203, 0.08934334401533499, 0.12272025607274167], Plot{Plots.PlotlyJSBackend() n=1})

Алгоритмы

Спектральный гребень рассчитывается, как описано в [1]:

где

  • — спектральное значение в бине ;

  • и — границы полосы в бинах, по которым рассчитывается спектральный гребень.

Литература

  1. Peeters, G. «A Large Set of Audio Features for Sound Description (Similarity and Classification) in the CUIDADO Project.» Technical Report; IRCAM: Paris, France, 2004.