倒谱是表示一帧语音数据特征的一个序列。从periodogram estimate of the power spectrum计算得到的倒谱系数,可以用于基音追踪(pitch tracking),然而,从AR power spectral estimate计算得到的倒谱系数可以用于语音识别(现在已经被MFCCs所替代)。
One of the benefits of cepstrum and LPCCs over e.g. LPCs is that you can do cepstral mean subtraction (CMS) on cepstral coefficients to remove channel effects。
倒谱(Cepstrum)是什么?
这一节将会描述如何从功率谱的periodogram estimate来计算倒谱。首先,我们介绍自相关系数(autocorrelattion),然后,介绍如何使用类似的方法来计算倒谱。最后,我们介绍LPCCs的相关知识。
倒谱可以看做和自相关序列类似的东西。如果,我们获得了信号的功率谱,我们可以使用Wiener-Khinchin theorem来计算信号的自相关序列。用数学公式表示为:\(x(n)\)是信号的时域表示,\(X(k)\)是信号的复数谱,\(P(k)\)是信号的功率谱,\(A(n)\)是信号的自相关序列。
通过对信号\(x(n)\)取离散傅里叶变换,可以得到信号的复数谱:
\]
对复数谱做逆离散傅里叶变换,可以得到信号的时域表示:
\]
通过对信号\(x(n)\)DFT的绝对值取平方,可以得到信号的功率谱:
\]
如果,我们对信号的功率谱做\(IDFT\),可以得到信号的自相关序列:
\]
如果,我们在对信号的功率谱做\(IDFT\)之前,对功率谱取对数,则可以获得信号的倒谱:
\]
因此,可以将倒谱理解为自相关序列的对数压缩,因为其携带有和自相关序列类似的信息(如“信号的周期性),但是,信号的倒谱是由其对数功率谱而非标准功率谱计算得到的。(注:有资料显示,对功率谱取对数,可以将乘性信号转变为加性信号。)
在上述图片中,展示了原始语音信号的一帧数据、对数功率谱、自相关序列和倒谱。倒谱当中的峰值对应自相关序列当中的一个峰值,但是更为清晰。这个峰值的位置在58sample位置处,对应的基音频率为(16000/58)=275Hz (信号采样率为16kHz)。这是一个相当高的基音频率,原始语音信号是从一位女性说话人得到的。因为倒谱的强峰值,所以经常被用于基音检测。
在MATLAB当中,我们可以使用下面代码得到信号的倒谱:
PowerSpectrum = abs(fft(SpeechFrame,1024)).^2;
AutoCorrelation = ifft(PowerSpectrum,1024);
Cepstrum = ifft(log(PowerSpectrum),1024);
什么是LPCCs(线性预测倒谱系数)?
在前面的小节,我们介绍了标准倒谱(standard cepstrum),线性预测倒谱系数(Linear Prediction Cepstral Coefficients)的计算与其类似,除了LPCCs是由光滑自回归功率谱(smoothed Auto-Regressive power spectrum)计算得到的,而非功率谱的peridogram estimate。例:10阶AR谱估计,Levinson Curbin算法应用前10个自相关系数来计算10个线性预测系数。在MATLAB中,使用下面代码进行实现:
[lp,g] = lpc(frame,10)
前一节所展示信号的线性预测系数为:
1.00 -2.22 1.68 0.05 -1.28 1.32 -0.30 -0.76 1.35 -1.19 0.44
从AR谱估计来计算倒谱:
[lp,g] = lpc(SpeechFrame,10);
ARPowerSpectrum = g ./ abs(fft(lp,1024)).^2;
Cepstrum = ifft(log(ARPowerSpectrum),1024);
注意到,上述计算步骤和前一节的计算过程完全相同,除了计算的功率谱不同。前十个倒谱系数为:
-11.78 2.22 0.79 -0.12 0.38 0.03 -0.20 0.04 -0.42 -0.11
以这种方法计算的系数,第一个系数是被忽略的,仅仅决定于\(g\)。这是一帧数据的线性预测倒谱系数。如果想要计算信号的LPCCs,不要使用这种方法进行计算,因为下面有更加有效的方法。
这一节的内容旨在展示倒谱系数和线性预测倒谱系数之间的区别和联系。
从LPCs计算LPCCs
这是一个简单的从LPCs计算LPCCs的递归公式,不用计算DFT。在下式当中,\(a_k\)表示线性预测系数,在前面小节中表示为\(\text{lp}\)。
\begin{cases}
0 &n<0\\
ln(G) &n=0\\
a_n+\sum{_{k=1}^{n-1}(\frac{k}{n})c(k)a_{n-k}} &0<n\leq p\\
\sum{_{k=n-p}^{n-1}(\frac{k}{n})c(k)a_{n-k}} &n>p\\
\end{cases}
\]
从一个有限LPC系数,可以得到无限长度的线性预测倒谱系数。研究显示,12-20个倒谱系数对语音识别任务已经足够。