600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > matlab实现cqt频谱 基于音乐识别的频谱转换算法——CQT

matlab实现cqt频谱 基于音乐识别的频谱转换算法——CQT

时间:2019-08-03 18:38:28

相关推荐

matlab实现cqt频谱 基于音乐识别的频谱转换算法——CQT

傅立叶变换的缺点

由于在音乐中,所有的音都是由若干八度的12平均律共同组成的,这十二平均律对应着钢琴中一个八度上的十二个半音。这些半音临近之间频率比为21/12。显然,同一音级的两个八度音,高八度音是低八度音频率的两倍。

因此在音乐当中,声音都是以指数分布的,但我们的傅立叶变换得到的音频谱都是线性分布的,两者的频率点是不能一一对应的,这会指使某些音阶频率的估计值产生误差。所以现代对音乐声音的分析,一般都采用一种具有相同指数分布规律的时频变换算法——CQT。

什么是恒Q变换(CQT)

CQT指中心频率按指数规律分布,滤波带宽不同、但中心频率与带宽比为常量Q的滤波器组。它与傅立叶变换不同的是,它频谱的横轴频率不是线性的,而是基于log2为底的,并且可以根据谱线频率的不同该改变滤波窗长度,以获得更好的性能。由于CQT与音阶频率的分布相同,所以通过计算音乐信号的CQT谱,可以直接得到音乐信号在各音符频率处的振幅值,对于音乐的信号处理来说简直完美。

关于信号处理中的窗口

在实际的信号处理过程中,我们会将时间片段分帧,按照帧为单位,转换成一个基于时间帧的频谱图,然后我们再将这些频谱图放到时间轴上,就可以形成一个类似热力图样的,基于时间变换的频谱变换图。

声音信号处理

现在我们注意一个问题,在我们的单个时间帧内(实际上我们在对信号进行截断),信号很可能不呈现它原周期的整数倍(周期截断),那么截断后的信号会泄漏问题,为了更好地满足傅立叶变换(实际上是FFT)处理的周期性要求,我们需要使用加权函数,也叫窗函数。加窗主要是为了使时域信号似乎更好地满足FFT处理的周期性要求,减少泄漏。

我们关注上述“中心频率与带宽比为常量Q”,从公式上看,我们可以表达为下述公式

恒Q变换

直观的理解是,恒Q变换避免了时频分辨率均匀的缺点,对于低频的波,它的带宽十分小,但有更高的频率分辨率来分解相近的音符;但是对于高频的波,它的带宽比较大,在高频有更高的时间分辨率来跟踪快速变化的泛音。

下面,我们从计算过程来看恒Q变换的本质

首先,假设我们处理的最低的音为fmin,fk表示第k分量的频率,β为一个八度内所包含一个八度的频谱线数,例如β=36,表示每个八度内有36条频谱线,每个半音三条频率分量。

频率

并且有

频率带宽

设 δf 表示的是频率 f 处的频率带宽,也可以称为频率解析度,那么根据我们的定义得知:

常数Q

从这个式子,我们得知常量Q是只与β相关的常数。

下面我们假设Nk是随频率变换的窗口长度,fs表示采样频率

窗口函数

同时我们的线性频率应该变为基于log2的非线性频率

线性频率变为非线性频率

我们的CQT,通过采用不同的窗口宽度,获得不同的频率解析度,从而可以得到各个半音的频率振幅。在CQT中第n帧的第k个半音频率分量可表示为

CQT频谱

其中我们的x(m)为时域信号,wNk为窗函数

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。