如何从 .wav 文件中提取特定频率范围?

Tom*_*aso 5 audio r fft frequency-analysis

真的对声音处理新的,所以也许我的问题将是微不足道的。我想要做的是使用 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
Run Code Online (Sandbox Code Playgroud)

我们得到的情节是:

在此处输入图片说明

嗯,有两个高峰。如果我们想知道它们对应的频率,只需找到:

order(Mod(x)[1:22050], decreasing=T)[1:10]
[1] 441 881 882 880 883 442 440 879 884 878
Run Code Online (Sandbox Code Playgroud)

前两个值非常接近我用来创建声音的频率:

        real     computed
 Freq1: 440   |  441 
 Freq2: 880   |  881 
Run Code Online (Sandbox Code Playgroud)

所以,现在问题来了:如果我想从我的声音中删除该范围内的频率,例如,(1, 500)如何进行?以及如何仅选择(并保存)范围(1, 500)?我参加的是,我的新声音(删除了频率)将接近简单Sine(freq=880, duration=1)(我知道,它不可能完全像这样!)。那可能吗?

我很确定这fft(DATA, inverse = TRUE)就是我所需要的。但我不确定,但我不知道如何继续。

bil*_*080 2

也许我没有抓住重点,但你不是已经有了答案吗?从你的帖子:

order(Mod(x)[1:22050], decreasing=T)[1:10]
[1] 441 881 882 880 883 442 440 879 884 878 
Run Code Online (Sandbox Code Playgroud)

只需收集 500 以上的所有值即可:

junk <- order(Mod(x)[1:22050], decreasing=T)[1:10]
(junk1 <- junk[junk > 500])
[1] 881 882 880 883 879 884 878
Run Code Online (Sandbox Code Playgroud)

要生成新信号,只需重复您为构建原始信号所做的操作:

junk2 <- Sine(0, 1)    
for (i in 1:length(junk1)) {     
    junk2 <- junk2 + Sine(junk1[i], 1)    
}    
junk2.s <- as.vector(junk2$sound)    
Run Code Online (Sandbox Code Playgroud)

要将值保持在 500 以下:

(junk3 <- junk[junk <= 500])
[1] 441 442 440
Run Code Online (Sandbox Code Playgroud)