У меня 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.
}
Я не смог изменитькод соответственно.