2011-09-21 207 views
4

我是真的聲音處理新,所以也許我的問題將是微不足道的。 我想要做的是使用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 

我們獲取劇情是:

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)是我所需要的。但我不確定,但是我不知道如何繼續。

回答

2

也許我忽略了一點,但你不已經有你的答案?從您的文章:

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 
+0

行動,它太容易成爲真正的XD謝謝你的答案!只是一個簡單的問題,這可能是我的下一個官方問題:最終的聲音是*糟糕的*,不完全是我所期待的。你知道一種改進fft分析的方法嗎?有沒有更好的方法來提取頻率? – Tommaso

+0

@Tommaso;我認爲「壞」的聲音是由於多個頻率。從你的程序中,嘗試以下方法:'play(s1)''play(s2)'和'play(s3)'。這是導致「壞」聲音的頻率混合。不是提取一系列頻率,也許你可以選擇一個範圍內的中間/中間頻率。 –

+0

@Tommaso;糟糕,耗盡時間...選擇中位數頻率可以通過'(junk1 < - median(junk [junk> 500]))''完成。 –

0

看看CRAN上的「信號」包的過濾功能之一,應該做

3

如果你不想編程它,你可以使用Praat。

Praat是一個免費的科學軟件程序,用於分析語音中的語音。 但您也可以使用它來編輯任何聲音的頻譜(移除頻率,...),然後將結果導出爲新的聲音文件。