我是真的聲音處理新,所以也許我的問題將是微不足道的。 我想要做的是使用R從wav文件中提取特定的頻率範圍(比如說150-400 Hz)。換句話說,我想創建另一個波形文件(wave2),其中只包含頻率分量我指定(150至400赫茲,或其他)。如何從.wav文件中提取特定的頻率範圍?
我在網上讀了一些東西,我發現這可以通過FFT分析來完成,這就是問題所在。
想我也該代碼:
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)
是我所需要的。但我不確定,但是我不知道如何繼續。
行動,它太容易成爲真正的XD謝謝你的答案!只是一個簡單的問題,這可能是我的下一個官方問題:最終的聲音是*糟糕的*,不完全是我所期待的。你知道一種改進fft分析的方法嗎?有沒有更好的方法來提取頻率? – Tommaso
@Tommaso;我認爲「壞」的聲音是由於多個頻率。從你的程序中,嘗試以下方法:'play(s1)''play(s2)'和'play(s3)'。這是導致「壞」聲音的頻率混合。不是提取一系列頻率,也許你可以選擇一個範圍內的中間/中間頻率。 –
@Tommaso;糟糕,耗盡時間...選擇中位數頻率可以通過'(junk1 < - median(junk [junk> 500]))''完成。 –