5

私はサウンド処理に関して本当に初心者なので、私の質問は些細なことかもしれません。私がやりたいことは、R を使用して、wav ファイルから特定の周波数範囲 (150 ~ 400 Hz としましょう) を抽出することです。つまり、私が作成した周波数成分のみを含む別の wave ファイル (wave2) を作成したいと考えています。 (150 ~ 400 Hz など) を指定します。

私はネットで何かを読んで、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

得られるプロットは次のとおりです。

ここに画像の説明を入力

さて、2つのピークがあります。それらがどの周波数に対応するかを知りたい場合は、次を見つけてください。

order(Mod(x)[1:22050], decreasing=T)[1:10]
[1] 441 881 882 880 883 442 440 879 884 878

最初の 2 つの値は、サウンドの作成に使用した周波数に非常に近いです。

        real     computed
 Freq1: 440   |  441 
 Freq2: 880   |  881 

さて、問題は次のとおりです。サウンドから範囲内の周波数を削除したい場合、どうすればよい(1, 500)ですか?そして、範囲のみを選択(および保存)する方法は(1, 500)?私が注目しているのは、私の新しいサウンド (周波数が削除されたもの) が単純なものに近いものになるということですSine(freq=880, duration=1)(私は知っていますが、まったく同じになることはできません!)。それは可能ですか?

それが私が必要としているものだと確信してfft(DATA, inverse = TRUE)います。しかし、よくわかりませんが、続行する方法がわかりません。

4

3 に答える 3

3

プログラミングしたくない場合は、Praat を使用できます。

Praat は、音声学における音声分析のための無料の科学ソフトウェア プログラムです。しかし、それを使用して任意のサウンドのスペクトルを編集し (周波数を削除するなど)、結果を新しいサウンド ファイルとしてエクスポートすることもできます。

于 2012-06-30T14:12:22.307 に答える
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
于 2011-09-21T18:31:58.960 に答える
1

クランの「シグナル」パッケージを見てください。そこにあるフィルター関数の1つが実行する必要があります

于 2011-09-21T18:05:17.373 に答える