如何用Seewave生成不同起始时间的功率谱?遇下标越界错误求助
解决Seewave库meanspec下标越界问题
错误原因很明确:你的音频总时长是3599秒,但当前生成的序列n中,最后一个起始时间是3584秒,对应的结束时间是3584+32=3616秒,已经超出了音频的实际时长(3599秒)。meanspec在尝试访问超出音频范围的样本时,自然会触发subscript out of bounds错误。之前设0或8时能正常运行,应该是当时序列的最后一段结束时间刚好没超过3599秒。
修复方案
调整序列n的生成逻辑,确保每一段的结束时间(x+32)都不超过音频总时长3599秒:
# 先正确加载音频文件(补充readWave的文件路径参数) sound1 <- readWave("你的音频文件路径.wav") # 计算最大允许的起始时间:总时长减去分段时长 max_valid_start <- 3599 - 32 # 生成符合要求的起始时间序列 n <- seq(from=16, to=max_valid_start, by=32) # 后续处理代码不变 result <- do.call(cbind, lapply(n, function(x) meanspec(sound1, from=x, to=(x+32), wl=1024, plot=FALSE, ovlp=50, norm=FALSE)))
如果允许最后一段可以是不足32秒的片段,也可以在lapply的匿名函数中动态调整结束时间:
result <- do.call(cbind, lapply(n, function(x) { end_time <- min(x+32, 3599) meanspec(sound1, from=x, to=end_time, wl=1024, plot=FALSE, ovlp=50, norm=FALSE) }))
这种方式会保留所有起始时间,但自动将超出时长的片段截断到音频末尾,不过要注意:最后一段的功率谱维度可能和其他完整段不一致,可能会导致cbind报错。如果需要所有功率谱维度一致,优先采用第一种方案,只保留完整的32秒片段。
内容的提问来源于stack exchange,提问作者Juan Almeira
相关产品推荐
相关产品推荐

