Определить заданную частоту c в аудиофайле, используя R - PullRequest
1 голос
/ 27 февраля 2020

У меня есть wav-файл аудиозаписи крикета по крикету, очень часто чириканье происходит в течение ~ 0,01 секунды при частоте около 20 кГц. Я хотел бы использовать R для определения того, в какое время во время записи происходит / запускается заданная частота c (20 кГц).

Объект Wave

Number of Samples:      4041625
Duration (seconds):     91.65
Samplingrate (Hertz):   44100
Channels (Mono/Stereo): Mono
PCM (integer format):   TRUE
Bit (8/16/24/32/64):    16 

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Как говорит @anddt, dfreq - хороший вариант, хотя часто требуется некоторая настройка различных параметров, таких как threshold и wl. Вот игрушечный пример с некоторыми составными данными, содержащими шум.

library(seewave)
library(tuneR)

chirp = sine(freq = 20000, duration = 0.01, xunit = 'time')
silence_0.2 = silence(duration = 0.2, xunit = 'time')
silence_0.1 = silence(duration = 0.1, xunit = 'time')
noise_0.2 = noise(kind='pink', duration=0.2, xunit = 'time')
noise_0.1 = noise(kind='pink', duration=0.1, xunit = 'time')
signal = bind(silence_0.2, chirp, noise_0.1, silence_0.2, chirp, silence_0.1, noise_0.2, chirp, noise_0.2, silence_0.2)

# threshold removes noise, wl is the window length of the fourier transform, smaller 
# values give more accuracy for time but noise gets more troublesome
peaks = data.frame(dfreq(signal, threshold = 10, wl = 128, plot=F))
peaks[is.na(peaks)] = 0
names(peaks) = c('time', 'frequency')
peaks$frequency[peaks$frequency < 19.9 | peaks$frequency > 20.1] = 0

startindices = which(diff(peaks$frequency) > 19)
endindices = which(diff(peaks$frequency) < -19)
starttimes = peaks[startindices, 1]
endtimes = peaks[endindices, 1]

plot(signal, col='grey')
abline(v = starttimes, col='green')
abline(v = endtimes, col='red')

Результат выглядит следующим образом. Зеленые вертикальные линии для начала и красные вертикальные линии для конца щебня.

enter image description here

1 голос
/ 27 февраля 2020

Я верю, что dfreq из пакета seewave - это то, что вам нужно. Метод возвращает доминирующую частоту (ту, которая имеет наибольшую амплитуду) во времени (в секундах). Вот пример того, как вы можете получить эту информацию:

library(tuneR)
library(seewave)

# Read audio file
crickets <- readWave("~/crickets.wav")

# Get dominant frequency
d <- dfreq(crickets, plot = FALSE)

head(d)

#               x        y
# [1,] 0.00000000 0.000000
# [2,] 0.02332295 0.000000
# [3,] 0.04664589 0.000000
# [4,] 0.06996884 0.000000
# [5,] 0.09329179 0.000000
# [6,] 0.11661474 2.583984

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