¿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.