r - 如何从 .wav 文件中提取特定频率范围?

标签 r audio fft frequency-analysis

我是 真的新的声音处理,所以也许我的问题会很简单。
我想要做的是使用 R 从 wav 文件中提取特定的频率范围(比如 150-400 Hz)。换句话说,我想创建另一个波形文件(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

我们得到的情节是:

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)是我需要的。但我不确定,但我不知道如何继续。

最佳答案

如果您不想对其进行编程,则可以使用 Praat。

Praat 是一个免费的科学软件程序,用于分析语音中的语音。
但您也可以使用它来编辑任何声音的频谱(删除频率,...),然后将结果导出为新的声音文件。

关于r - 如何从 .wav 文件中提取特定频率范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7504409/

相关文章:

r - 1 分钟 xts 时间序列上的 lm 函数

c++ - 如何告诉 C++ 根据索引指示符放弃 vector 中的某些元素

javascript - 如何在网页中多次播放同一个音频文件?

c++ - 四元数 FFT 在 C++ 中使用一维 FFT

python - 来自 scipy.fft 的幅度

r - 将数据框子集到未出现在另一个数据框中的行

javascript - HTML5音频标签无法播放某些音频

javascript - Web Audio API getFloatFrequencyData 函数将 Float32Array 参数数据设置为 -Infinity 值数组

c++ - 实际输入到FFT,然后iFFT返回到一维数组中的实际数据

r - 识别 xml 文件的独特属性