Измерение ширины полосы сигнала в R

Я пытаюсь измерить ширину полосы сигнала по спектрам мощности. Я хочу иметь возможность извлекать минимальное и максимальное значения с учетом значения относительной амплитуды. Я использовал «seewave» для расчета спектров мощности, и я могу построить график плотности и предоставить аблайн, но я не могу понять, как заставить R сказать мне, где аблайн пересекается с графиком. Мне нужно будет изменить интересующие значения относительной амплитуды в зависимости от качества сигнала, но я хочу найти простой способ измерения полосы пропускания с помощью R. Заранее спасибо!

power.spec <- spec(IBK.trill.1, flim=c(0,2))
pow.spec <- as.matrix(power.spec)
head(pow.spec)
#                x           y
# [1,] 0.000000000 0.007737077
# [2,] 0.007470703 0.029795630
# [3,] 0.014941406 0.021248476
# [4,] 0.022412109 0.015603801
# [5,] 0.029882813 0.014103307
# [6,] 0.037353516 0.014584454
freq <- pow.spec[1:2941,1]
head(freq)
# [1] 0.000000000 0.007470703 0.014941406 0.022412109 0.029882813 0.037353516
ampl <- pow.spec[,2]
head(ampl)
# [1] 0.007737077 0.029795630 0.021248476 0.015603801 0.014103307 0.014584454
plot(ampl ~ freq, type="l",xlim=c(0,2))
abline(h=0.45)

введите здесь описание изображения


person Dena J Clink    schedule 09.04.2016    source источник
comment
Возможно, вы захотите проверить ?приблизительно... Пример использования: приблизительно(ampl, freq, xout=0.45)   -  person chinsoon12    schedule 10.04.2016


Ответы (1)


Сохраните результаты идентификации значений «y», превышающих ваш порог:

wspec <- which( power.spec[, "y"] > 0.45)

Затем использовали эти индексы для извлечения из значений «x», чтобы поместить вертикальные линии в первый и последний индексы:

abline( v= power.spec[ c( wspec[1], tail(wspec, 1) ) , "x"],  col="blue" )

Кстати, я предложил исходные значения «power.spec», а не вашу версию as.matrix, потому что spec возвращает матрицу, поэтому принуждение не требуется. Я проверил это на первом примере со страницы ?spec. Я полагаю, вы могли бы стать очень придирчивым и попытаться взять среднее значение «x», где пороговые значения были превышены, а также те, которые были до и после. Что тогда будет:

abline( v= c( mean( myspec[ c( wspec[1]-1,  wspec[1]), "x"]) , 
            mean( myspec[ c( tail(wspec, 1), tail(wspec, 1)+1 ) , "x"]) ),  col="blue" ) 

введите здесь описание изображения

Я посмотрел на различия с diff, и типичное разделение в моем примере было

mean( diff(myspec[ , "x"]) )
[1] 0.0005549795

Так что я мог бы вернуться назад и вперед на половину этой суммы, чтобы получить разумную оценку. (Я использовал это как свою оценку «половинной высоты»: max(myspec[, "y"])/2)

person IRTFM    schedule 10.04.2016
comment
Большое спасибо! Это может показаться глупым вопросом, но как мне извлечь значения, где линии пересекаются с осью X? - person Dena J Clink; 10.04.2016
comment
У меня нет способа проверить это, поскольку все значения y в примере, который я использовал (из-за того, что вы не включили метод получения IBK.trill.1), имели только положительные значения. (И мне интересно, так ли это в случае с вашими данными.) Что такое min(power.spec[,'y'])? Ответ может зависеть от того, какой уровень точности вам нужен для ответа [. Если вам нужно знать только значения индексов, где y[n-1] — один знак, а y[n] — другой знак, то это довольно просто (но на самом деле это другой вопрос, и я подозреваю, что на него уже был дан ответ). - person IRTFM; 10.04.2016