我有兴趣将我的数据转换为声音。我的数据在数据框中。每列表示特定频率下声音的相对幅度。每行都是一个样本。以固定的采样率记录样品。我已经找到了如何使用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
对象显然格式不正确,所以我不确定输出实际是什么。我无法弄清楚如何将数据帧中的每一列强制为存储在频率中的频率。
任何想法都会很棒。
答案 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
上面的代码不会给你那个警告。您可以逐步执行?istft
中www.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)