Как извлечь определенный частотный диапазон из файла .wav? - PullRequest
4 голосов
/ 21 сентября 2011

Я действительно новичок в обработке звука, поэтому, возможно, мой вопрос будет тривиальным. Что я хочу сделать, это извлечь определенный частотный диапазон (скажем, 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

Сюжет, который мы получаем:

enter image description here

Ну, есть два пика. Если мы хотим узнать, какой частоте они соответствуют, просто найдите:

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) - это то, что мне нужно. Но я не уверен, и, тем не менее, я не знаю, как поступить.

Ответы [ 3 ]

3 голосов
/ 30 июня 2012

Если вы не хотите его программировать, вы можете использовать Praat.

Praat - бесплатная научная программа для анализа речи в фонетике.Но вы также можете использовать его для редактирования спектра любого звука (удаления частот, ...), а затем экспортировать результат в виде нового звукового файла.

2 голосов
/ 21 сентября 2011

Может быть, я упустил момент, но разве у вас уже нет ответа?Из вашего поста:

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
1 голос
/ 21 сентября 2011

посмотрите на пакет 'signal' на кране, одну из функций фильтра, которую он там должен выполнить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...