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

spectralFlatness

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

Библиотека

EngeeDSP

Синтаксис

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

  • flatness,arithmeticMean,geometricMean = spectralFlatness(x,f) — возвращает спектральную неравномерность, среднее арифметическое и среднее геометрическое спектральное значение сигнала x с течением времени. Интерпретация x функцией зависит от формы f.

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

  • spectralFlatness(___;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 — функция возвращает график.

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

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

Details

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

# arithmeticMean — среднее арифметическое спектра
скаляр | вектор | матрица

Details

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

# geometricMean — среднее геометрическое спектра
скаляр | вектор | матрица

Details

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

Примеры

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

Details

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

import EngeeDSP.Functions: chirp, randn, spectralFlatness

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

flatness = spectralFlatness(x, fs)

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

spectralFlatness(x, fs, out=:plot)

spectralFlatness 1

([0.5327040255782655, 0.552964530108542, 0.47742468036057234, 0.37293317041480095, 0.44287635975879003, 0.4119379715559745, 0.5013730779675295, 0.2015608067144641, 0.33548839011069864, 0.5369805014970516  …  0.1727536936022771, 0.35070131234444546, 0.25693379071386535, 0.255058829804521, 0.3677277425236599, 0.23687507452160672, 0.42585525405176444, 0.2835981233091784, 0.37349949783684333, 0.24033135785583964], [0.07786759765793372, 0.08135374655336428, 0.08637079824524838, 0.11933620888263814, 0.12350546278299357, 0.14497737376909484, 0.15042289056894764, 0.16892023682888072, 0.13419976354764332, 0.09558842868870962  …  0.10961556063903502, 0.11750795091292063, 0.10693418095926478, 0.09961268609163781, 0.10747394543349716, 0.15058502472661675, 0.14519245631195274, 0.15333273649350335, 0.13430846482161657, 0.12333737035602271], [0.04148038273449001, 0.04498573623545049, 0.04123555074472519, 0.04450443072388517, 0.05469764976765691, 0.05972168527195327, 0.07541798764132614, 0.03404769920562753, 0.04502246262583528, 0.05132912237457844  …  0.018936492976677682, 0.041210192596067945, 0.027475004470746342, 0.025407095148218223, 0.03952115133437092, 0.035669838953955334, 0.06183097036912634, 0.04348487631141832, 0.050164144166111126, 0.029641837692031523], 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(length(t), 1)

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

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

import EngeeDSP.Functions: spectralFlatness

flatness = spectralFlatness(s, f)

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

spectralFlatness(s, f, out=:plot)

spectralFlatness 2

([0.41698805310198656, 0.46683201868098656, 0.3883287575836514, 0.4907688270016035, 0.4091462305599816, 0.3191585704065677, 0.3577051127741075, 0.3896555430416278, 0.598856100869491, 0.5385492705509978  …  0.3819877611783831, 0.41721990894367383, 0.38697190520523694, 0.46858320991071867, 0.48587071241197366, 0.38864151988166845, 0.5335128495308832, 0.4664062512134147, 0.4145737219480951, 0.477601293218658], [66.18935543214769, 71.25953873838431, 67.29284380517325, 72.27692418494, 77.76383362649338, 74.80810295770037, 65.91505570861669, 67.23287211343407, 73.51318020109804, 61.9977680185544  …  67.19403006538472, 79.16107520226234, 79.39008525296707, 70.97130285799408, 68.37996747931281, 63.08170611779957, 68.8590471648835, 79.56916556123606, 53.21814023726604, 53.157840474425484], [27.600170457726666, 33.26623431951591, 26.13174642913364, 35.47126130152683, 31.81677940217331, 23.87564719480698, 23.578152435762313, 26.197661293608466, 44.02381645774584, 33.38885274218245  …  25.667297109229274, 33.02757658777121, 30.721732544746853, 33.255960904744626, 33.22382351388131, 24.51617014235037, 36.73718646891848, 37.111556221595656, 22.062842473319066, 25.388253355296733], 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: spectralFlatness, hamming

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

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

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

spectralFlatness 3

([0.44393966543497354, 0.4695783799925332, 0.49431342254249894, 0.6021106597242966, 0.44236146074090665, 0.5951722206261713, 0.6452967394540707, 0.46437619283350273, 0.3888478354209635, 0.6150829750332204  …  0.5454458473997145, 0.5030744478476047, 0.45828271847210195, 0.3342891893548354, 0.5377916650534941, 0.2390323362290697, 0.41558590905052906, 0.5762897059640517, 0.5368836411577717, 0.5281049952129195], [0.09501542410874092, 0.09365413839399048, 0.08501344767652717, 0.08096139641217256, 0.03234155232658504, 0.0508716873101426, 0.08013355128737082, 0.09856405316445577, 0.0713312402132862, 0.08216872345317404  …  0.09695049793640315, 0.0824351178183989, 0.1008633635765253, 0.09848674637522525, 0.0885626532954448, 0.08363028719440331, 0.10550801325677596, 0.08844347795474994, 0.06239257287735799, 0.1156749436919185], [0.042181115589996564, 0.043977958586646555, 0.0420232882831218, 0.04874771980593352, 0.014306656329816626, 0.030277415103377784, 0.051709919366615946, 0.045770799758748926, 0.027736998354829127, 0.05054058287626024  …  0.052881246502745685, 0.041471001379743265, 0.04622393645409, 0.03292305460796933, 0.04762825677731257, 0.019990342927586273, 0.04384764360143251, 0.05096906590498093, 0.033497551707597585, 0.06108851558467535], Plot{Plots.PlotlyJSBackend() n=1})

Алгоритмы

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

где

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

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

Литература

  1. Johnston, J. D. «Transform Coding of Audio Signals Using Perceptual Noise Criteria.» IEEE Journal on Selected Areas in Communications. Vol. 6, Number 2, 1988, pp. 314–323.