¿Cómo extraer un rango de frecuencia específico de un archivo .wav?

SoyDe Verda nuevo en procesamiento de sonido, así que tal vez mi pregunta sea trivial. Lo que quiero hacer es extraer un rango de frecuencia específico (digamos 150-400 Hz) de un archivo wav, usando R. En otras palabras, quiero crear otro archivo de onda (wave2) que contenga solo el componente de frecuencia que yo especifique (150 a 400 Hz, o qué más).

Leí algo en la red, y descubrí que esto se puede hacer con un análisis FFT, y aquí están los problemas.

Supongamos que tengo este código:

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

La trama que obtenemos es:

Bueno, hay dos picos. Si queremos saber a qué frecuencia corresponden, solo busque:

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

Primero dos valores están realmente cerca de la frecuencia que he usado para crear mi sonido:

        real     computed
 Freq1: 440   |  441 
 Freq2: 880   |  881 

Entonces, ahora viene el problema: cómo proceder, si quiero eliminar de mi sonido las frecuencias en el rango, digamos,(1, 500)? Y cómo seleccionar (y guardar) solo el rango(1, 500)? A lo que asisto es que mi nuevo sonido (con frecuencias eliminadas) será algo cercano a simpleSine(freq=880, duration=1) (Lo sé, ¡no puede ser exactamente así!). ¿Es eso posible

Estoy bastante seguro de quefft(DATA, inverse = TRUE) es lo que necesito. Pero no estoy seguro y, sin embargo, no sé cómo proceder.

Respuestas a la pregunta(3)

Su respuesta a la pregunta