我有一个R data.frame
,具有快速的傅立叶变换结果。列是功率和频率。出于研究目的,我选择了全部FFT结果的一部分(频率在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.
}
我无法相应地修改代码。
答案 0 :(得分:0)
请考虑预先对主要数据进行排序,然后添加一个条件块,该条件块将使用主数据集中的前两个(使用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)
}