将数据框列转换为一个声音

时间:2017-05-03 05:57:55

标签: r

我有兴趣将我的数据转换为声音。我的数据在数据框中。每列表示特定频率下声音的相对幅度。每行都是一个样本。以固定的采样率记录样品。我已经找到了如何使用seewave package发出声音,但没有找到我想要的特定频率。

示例:

library(seewave)

# some dummy data, 3 columns
set.seed(7)
df <- data.frame(f1=rnorm(600,30,5), f2=rnorm(600,40,10), 3=rnorm(600,30,10))
df[df<0] <- 0

mat <- as.matrix(df)
mat <- t(mat) +0i # istft() only works with complex numbers
sr <- 1000 # sample rate in Hz
freqs <- c(500, 2000, 10000) # desired frequencies of output sounds for each column

sound <- istft(mat,f=sr,ovlp=50,wl=256,output = "Wave") # creates a sound 
listen(sound)

istft假设:

  

&#34;由短期傅里叶变换产生的复杂矩阵&#34;。

我的mat对象显然格式不正确,所以我不确定输出实际是什么。我无法弄清楚如何将数据帧中的每一列强制为存储在频率中的频率。

任何想法都会很棒。

2 个答案:

答案 0 :(得分:2)

实际上你的代码运行但是有一个警告说

  

1:在xprim * win中:    较长的物体长度不是较短物体长度的倍数

要解决此问题,您的wl必须有一些可被2整除的行,并且小于您的FFT窗口长度(library(seewave) # some dummy data, 3 columns set.seed(7) N = 128 df <- data.frame(f1=rnorm(N,30,5), f2=rnorm(N,40,10), f3=rnorm(N,30,10)) df[df<0] <- 0 mat <- as.matrix(df) #no need to transpose mat <- mat + 0i # istft() only works with complex numbers sr <- 1000 # sample rate in Hz freqs <- c(500, 2000, 10000) # desired frequencies of output sounds for each column sound <- istft(mat, f=sr, ovlp=50, wl=256, output = "Wave") # creates a sound listen(sound) ):

istft

上面的代码不会给你那个警告。您可以逐步执行?istftwww.mysite.com/something/代码中提供的示例代码,并查看导致警告的原因。

答案 1 :(得分:1)

所以我设法通过使用synth()函数合成波来完成此操作。这通过数据帧的每一列工作,并在载波频率上产生调幅信号。然后,将所有列的结果加在一起。

t_win <- 0.5 # window length for spectrogram (s)
n_win <- t_win/(nsamps/sf/dout)*fout # calculate the window length in samples
spectro(wave, f=fout, flim = c(0,1.1), wl = n_win, ovlp = 75) # plot the spectrogram

以下是创建频谱图的代码:

EnableThemeDialogTexture(.., ETDT_ENABLETAB)

enter image description here