簡體   English   中英

如何從.wav文件中提取特定的頻率范圍?

[英]How to extract a specific frequency range from a .wav file?

我在聲音處理方面真的很新,所以也許我的問題很簡單。 我想要做的是使用R從wav文件中提取特定的頻率范圍(比如說150-400 Hz)。換句話說,我想創建另一個只包含頻率成分的波形文件(wave2)指定(150到400赫茲,或其他)。

我在網上讀到了一些東西,我發現這可以通過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)是我需要的。 但我不確定,但我不知道如何繼續。

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

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

也許我錯過了這一點,但你不是已經有了答案嗎? 從你的帖子:

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

看看cran上的'signal'包,其中一個過濾函數應該做

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM