我真的新的声音处理,所以也许我的问题将是微不足道的。 我想要做的是使用R从wav文件中提取特定的频率范围(比如说150-400 Hz)。换句话说,我想创建另一个只包含频率成分的波形文件(wave2)指定(150到400 Hz,或其他)。
我在网上读到了一些东西,我发现这可以通过FFT分析来完成,这就是问题所在。
假设我有这段代码:
library(sound)
s1 <- Sine(440, 1)
s2 <- Sine(880, 1)
s3 <- s1 + s2
s3.s <- as.vector(s3$sound)
# s3.s is now a vector, with length 44100;
# bitrate is 44100 (by default)
# so total time of s3 is 1sec.
# now I calculate frequencies
N <- length(s3.s) # 44100
k <- c(0:(N-1))
Fs <- 44100 # sampling rate
T <- N / Fs
freq <- k / T
x <- fft(s3.s) / N
plot(freq[1:22050], x[1:22050], type="l") # we need just the first half of FFT computation
我们获得的情节是:
嗯,有两个高峰。如果我们想知道它们对应的频率,请找到:
order(Mod(x)[1:22050], decreasing=T)[1:10]
[1] 441 881 882 880 883 442 440 879 884 878
前两个值非常接近我用于创建声音的频率:
real computed
Freq1: 440 | 441
Freq2: 880 | 881
所以,现在问题出现了:如果我想从声音中删除范围内的频率,如(1, 500)
?以及如何选择(并保存)范围(1, 500)
?
我参加的是,我的新声音(删除的频率)将接近简单的Sine(freq=880, duration=1)
(我知道,它不可能完全如此!)。
那可能吗?
我很确定fft(DATA, inverse = TRUE)
是我需要的。但我不确定,但我不知道如何继续。
答案 0 :(得分:3)
如果您不想编程,可以使用Praat。
Praat是一个免费的科学软件程序,用于分析语音中的语音。 但您也可以用它来编辑任何声音的频谱(删除频率......),然后将结果导出为新的声音文件。
答案 1 :(得分:2)
也许我错过了这一点,但你不是已经有了答案吗?从你的帖子:
order(Mod(x)[1:22050], decreasing=T)[1:10]
[1] 441 881 882 880 883 442 440 879 884 878
只需收集500以上的所有值:
junk <- order(Mod(x)[1:22050], decreasing=T)[1:10]
(junk1 <- junk[junk > 500])
[1] 881 882 880 883 879 884 878
要生成新信号,只需重复您为构建原始信号所做的操作:
junk2 <- Sine(0, 1)
for (i in 1:length(junk1)) {
junk2 <- junk2 + Sine(junk1[i], 1)
}
junk2.s <- as.vector(junk2$sound)
要将值保持在500以下:
(junk3 <- junk[junk <= 500])
[1] 441 442 440
答案 2 :(得分:1)
查看cran上的'signal'包,其中一个过滤函数应该做