Я действительно новичок в обработке звука, поэтому, возможно, мой вопрос будет тривиальным.
Что я хочу сделать, это извлечь определенный частотный диапазон (скажем, 150-400 Гц) из файла WAV, используя R. Другими словами, я хочу создать другой волновой файл (wave2), который содержит только частотный компонент, который я указать (от 150 до 400 Гц или что еще).
Я прочитал что-то в сети и обнаружил, что это можно сделать с помощью анализа БПФ, и вот тут-то и возникли проблемы.
Предположим, у меня есть этот код:
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)
- это то, что мне нужно. Но я не уверен, и, тем не менее, я не знаю, как поступить.