我是,真的是,是声音处理方面的新手,所以我的问题可能很简单。
我想做的是使用R从wav文件中提取特定的频率范围(比如说150-400 Hz)。换句话说,我想创建另一个仅包含我所使用的频率分量的wave文件(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)是我所需要的。但是我不确定,但是我不知道如何进行。

最佳答案

也许我错过了要点,但是您还没有答案吗?从您的帖子中:

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

09-25 17:45