如何在RStudio中批量运行M声学指数分析并解决相关报错
问题分析与解决方案
报错原因
- 直接将文件名字符串传入
M()函数时,若文件读取逻辑未能自动识别采样率,会触发f参数缺失的错误; - 手动添加
f=48000后,M()函数误将文件名字符串当作数值型wave数据处理,导致fft()函数抛出非数值参数的错误; - 单独运行时你大概率是先通过
readWave()等函数将文件读取为wave对象(自带采样率信息),因此无需手动指定f。
修正后的代码方案
方案1:先读取为wave对象(推荐)
先将每个WAV文件读取为wave对象(内置采样率信息),再传入M()函数,无需手动指定f:
library(seewave) library(tuneR) # readWave依赖该包,显式调用避免依赖问题 # 设置工作目录 setwd("/Users/fiene123/Desktop/samples Sounds/August27-28_outside_Unit14_1am") # 获取目录下所有WAV文件(正则匹配更精准) wav_files <- dir(pattern = "\\.wav$", ignore.case = TRUE) # 初始化结果列表 results <- list() # 循环处理每个文件 for (file_name in wav_files) { # 读取wave对象 wave_data <- readWave(file_name) # 计算声学指数 results[[file_name]] <- M(wave = wave_data, plot = FALSE) }
方案2:直接传文件名并指定采样率
如果确认所有文件采样率均为48000,可直接传文件名并指定f:
library(seewave) setwd("/Users/fiene123/Desktop/samples Sounds/August27-28_outside_Unit14_1am") wav_files <- dir(pattern = "\\.wav$", ignore.case = TRUE) results <- list() for (file_name in wav_files) { # 明确指定文件名与采样率 results[[file_name]] <- M(wave = file_name, f = 48000, plot = FALSE) }
额外优化建议
- 变量名避免歧义:不要用
listcsv命名WAV文件列表; - 正则匹配更严谨:用
\\.wav$精准匹配后缀为.wav的文件; - 列表元素命名:用文件名作为列表元素的键(
results[[file_name]]),后续查看结果更直观。
内容的提问来源于stack exchange,提问作者Fiene
相关产品推荐
相关产品推荐

