Math, physics and music.
紧接上一篇《R语言声音音乐分析01-初次上手怎么用tuneR和seewave音频分析之一》。上一篇里我们安装了这两个包,导入了WAV文件,剪切了音频,绘制波形图oscillo,对响度波封进行了时间测量。我们对手上这个WAV文件有了初步的了解。
这一篇我尝试了一下频谱分析spectral analysis,包括优势频率提取、峰频率提取等等。更多是自己的理解,如果有任何建议或意见尽管提出来!
seewave频谱分析Spectral Analysis
优势频率 Dominant Frequency
理解优势频率
光看名字第一反应是什么?最占主导地位的频率?优势频率(dominant frequency)在是指“在谱密度曲线上与最大值对应的频率”。听音乐的时候有没有过这种感觉,有一些声音有一种在脑海里萦绕的感觉,有一些haunting sound特别具有感染力,直击心灵的力量,十分难忘。除了由它周围的context在和声上或者材质上产生的效果,这些音的情绪或者表现跟它们的响度也是有关的。对音乐和乐器有一些了解的小伙伴们可能有这样的体会,即便弹奏同一个和弦,如果弹的时候分了轻重,即和弦内每一个音如果它们的响度不同,听起来还是有一些差异的。一些独具情感感染力的和弦音比如b6或者b9,如果被特别突出,人们能立马感受到那种情绪,但如果反而被刻意淡化了,它在表现上似乎就增加了另一种意味,very arty。
dfreq直接获取优势频率
dfreq(c1,44100,ovlp=87.5)
用频谱图spectrum可视化
按照默认的方法:
spectro(c1, 44100)
这里的谱图用由1024个样本组成的FFT window,连续窗口的overlap重叠率是87.5%,由这两个参数作为条件得到的图。
spectro(c1, 44100, ovlp=87.5,wl=1024)
这里我们调整了window length还有overlap,所以在每隔一定样本数之后,我们的滑动窗口都会找窗口内的优势频率,最后叠加得到的结果可以在一定程度上代表音频局部的优势频率,这张图就是一个整体的情况。可以发现,这里出现优势频率的时间段和波形图oscillo以及响度波封时间测量的是一致的。
用平均频谱可视化
计算平均频率频谱,也就是频率分布的平均相对响度,可以看出来相对于其他的频率,那些频率的响度更大/更小:
meanspec(c1,44100,col="red")
最突出的那个区间就是我们要找的优势频率。
为了更准确得到是哪一个频率,我们还可以用soundscapespec,用条形图画出不同频率的响度:
soundscapespec(c1, f=44100,plot=TRUE, col="gray")
窗口大小
前面的spectro方法里,我们用到了一个概念,叫做window length,那它是什么意思呢?我们先来了解一些基本知识:
(Reference参考文献:Signal Analysis Introduction)
周期period、频率frequency和采样率sampling rate
我们对声音做傅里叶变换FFT的对象是周期性的声音。这里是指声波本身的周期性(periodity)。我们平时说的音高,也就是声音的频率(frequency),指的就是在一秒以内周期出现的次数。周期period是所重复的那个单位的延续时间长度(duration)。
F=1/T
T=1/F
频率越低的音,音调越低;频率越高的音,音调越高。
窗口大小(window size)常被用来描述样本sample。它是一个变量,不过我们有一个Fixed value固定值叫做采样率(sampling rate),一般是44100或者48000个样本每秒。
窗口大小相关参数
窗口延续时间duration of the window:
sampling rate是针对一秒以内的。前面说到,周期长度period T就是频率F的倒数
T = WindowSize / SamplingRate
周期时间 = 窗口大小 / 采样率
对1024个样本进行分析,44100的采样率的窗口,窗口延续时间一定是信号周期的五倍:
T(Window) = 5 * T(Signal)
那么比如说,对于440Hz的信号,窗口大小是5 * (1/440)=0.025,每一条分析都代表25ms内的频谱图。
最低可探测频率 Lowest Detectable Frequency:
对于窗口大小的选择可以根据信号的频率而定。最低可探测频率F0决定于size of the window也就是duration of the window,窗口大小或窗口延续时间。比如我们有1024样本分析窗口,F0=5*(44100/1024/)~=215 Hz。窗口大小应该是:
WindowSize = 5 * SamplingRate / F(Signal)
对于440Hz的信号,窗口大小是501,对于100Hz的信号,窗口大小是2205。信号频率越低,音高越低,窗口大小越大。
分析的窗口大小和时间分辨率 Window Size and Temporal Resolution of the Analysis
计算Time Resolution分析窗口的延续时间,也称为time resolution,和frequency resolution成反比。采样率是和1秒的时间延续相对应的,分析窗口的延续时间是:
TimeResolution = WindowSize / SamplingRate
窗口越长,描述信息变化的切片越少。
比如说,用44100的采样率,1024点的FFT,我们能得到:T = 1024/44100 = 0.023频谱图被等分成切片,每个切片持续23ms。如果我们选用4096 FFT,得到:FrequencyResolution = 4096/44100 = 0.093频谱图被等分成切片,每个切片持续0.93ms。频率分辨率的准确性更低了。
分析的窗口大小和频率分辨率 Window Size and Frequency Resolution of the Analysis频率分辨率取决于分析的bins的个数,bins的数量实际上就是FFT的规模。更多的可以去针对性学习数字信号处理。
这个同样有帮助:《采样率 窗口点数》,非常数字信号学。
基础频率 Fundamental Frequency
维基上这么讲的:
The fundamental frequency, often referred to simply as the fundamental, is defined as the lowest frequency of a periodic waveform. In music, the fundamental is the musical pitch of a note that is perceived as the lowest partial present.
稍微翻译一下:
基础频率,通常简单地指一个周期性波形中的最低频率。在音乐里,基本音是音乐里出现的最低声部的音。
这里可以看一看 写给理工科人看的乐理(二)十二平均律与五线谱以及整个系列。当讨论音乐和频率时,基本上进入音律学的领域了。有兴趣可以了解了解,是另一个理解声音和音乐的视角。
要得到这个基础频率也很简单:
fund(c1,44100)
由于wl必须得在at不为null时才能用,而一旦用了at,就只能测其中一个时间点的优势频率,还不能画图了,我没有设置窗口大小。这张图表达的内容还是比较含糊。
峰频率 Frequency Peak
计算平均频率频谱中的的主频率波峰: main frequency peaks of the mean frequency spectrum。输入只能是频谱分析spectral analysis得出的结果,也就是spec或者meanspec的结果。所有这些分析结果都可以通过print得到矩阵表示形式。
mspec1<-meanspec(c1,44100,col="red")
fpeaks(mspec1)
还是太密集了,而且10-20Hz那里的局部峰值过于放大了细微数据差异的影响。就像我们第一篇处理timer时一样,需要加一些判断条件或者对这里的波形本身做预处理。
mspec1<-meanspec(c1,44100,col="red")
fpeaks(mspec1,amp=c(0.01,0.01))
这里的amp属于限制条件之一,要求这个波封的左右两边的变化率/斜率达到一定值,我们才认为它是peak,而不是单一地以它相对于周围的平均值相比更高作为标准。
这一系列很快就会有更新,后面除了继续介绍R语言的音频处理方法,还会介绍声学相关、基本乐理、音乐制作等有助于音乐分析的干货。如果对数据分析、声音硬件、live-coding等等有兴趣也可以关注一下,后续也会有相关文章发布~