R: условие, основанное на наблюдаемом результате - PullRequest
0 голосов
/ 25 января 2019

У меня R data.frame с результатами быстрого преобразования Фурье.Столбцы Мощность и Частота.Для целей моего исследования я выбрал часть полных результатов БПФ (частоты от 1 до 48).

Я должен идентифицировать maximum 5 peaks (highest powers) в диапазоне частот.Кроме того, существует условие, что мы не будем рассматривать пики, которые составляют менее 45% от самого высокого пика.Я поделюсь кодом ниже:

df_FFT_2 <- select(filter(df_FFT, frequency <49 & frequency >0 ),c(frequency, power))
with(df_FFT_2,plot(frequency,power, type = "l"))



max_power <- max(df_FFT_2$power)
max_freq <- df_FFT_2$frequency[which(df_FFT_2$power == max_power)]
print(c(max_power, max_freq))


# Calculate a threshold and then create a filtered data.frame
threshold <- 0.45 * max_power
df_filt <- df_FFT_2[which(df_FFT_2$power > threshold), ]
df_filt <- df_filt[order(-df_filt$power), ]
if(nrow(df_filt) > 5){
  df_filt <- df_filt[1:5, ]
}


freq_FFT <- df_filt$frequency 
n = length(freq_FFT)

Этот код отлично работает.С разными наборами входных данных я получаю пики 1 (мин), 2,3,4 или 5 (макс.).

Однако это небольшая часть полного прототипа, с которым я работаю.Я обнаружил, что когда я получаю только один пик, конечные результаты не очень хороши.Я хотел бы выбрать at least 2 peaks,, даже если второй пик does not satisfy пороговое условие.

Я хотел бы поставить условие

if (length(freq_FFT) < 2){
   disregard the threshold condition and find the two highest peaks.
}

Я не смог изменитькод соответственно.

1 Ответ

0 голосов
/ 25 января 2019

Рассмотрите возможность сортировки основных данных заранее, а затем добавьте условный блок, который объединяет (используя rbind) отфильтрованные данные с двумя верхними в основном наборе данных. И поскольку одна строка может быть ведущей power , введите unique для устранения дублирования данных. Комментарии в коде ниже означают корректировки:

...
threshold <- 0.45 * max_power
df_FFT_2 <- df_FFT_2[order(-df_FFT_2$power), ]                  # ORDER BY DESCENDING POWER
df_filt <- df_FFT_2[which(df_FFT_2$power > threshold), ]
df_filt <- df_filt[order(-df_filt$power), ]

if(nrow(df_filt) > 5) {
  df_filt <- head(df_filt, 5)                                   # CHANGED TO head()
}

# NEW IF LOGIC BLOCK
if(nrow(df_filt) < 2) {
  df_filt <- rbind(df_filt,
                   head(df_FFT_2, 2))                           # TOP TWO  ROWS
  df_filt <- unique(df_filt)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...