将 LPC 频率响应与原始样本数据频率响应相匹配

信息处理 fft 语音识别 语音处理 演讲 lpc
2022-01-30 18:06:59

背景:

目的是从语音输入中提取特征/共振峰。

我过去曾在原始样本上使用过 FFT,并且随着时间的推移从频率的加权平均值中进行了简单的峰值拾取。这给出的结果近似于浊音非鼻音在元音四边形中的位置,但并不一致。我听说 LPC 会提供更平滑的响应曲线和更高的特征提取精度。残差是另一个期望的副作用,它也有望允许对其他特征进行分析。

问题:

我在原始样本上的 FFT 和派生的 LP 系数上的 FFT 之间的峰值频率存在很大差异。

我发现响应曲线在形状和峰值频率位置上有很大不同。FFT_LPC (见下面的定义)通常在 3000/4000Hz 范围内显示简单浊元音发音的大峰值。也许这些是流行音乐 - 也许我应该执行 IFFT 并回放输出以检查。在给定源样本的情况下, FFT_Raw 的峰值恰好在我所期望的位置。

过程:

这是我目前的方法:

  • 获取 22050Hz 的样本。
  • 从原始样本帧中,使用 Hamming 窗口并执行 FFT。调用这个FFT_Raw
  • 并行地,从原始样本中提取 LP 系数,不要加窗,并直接对用零填充的 LP 系数执行 FFT。实际上,每一帧都会以这些系数领先。调用这个FFT_LPC
  • 获取原始样本的 RMS 并应用(公认是任意的)乘数,使FFT_LPC与FFT_Raw相比具有可比的幅度
  • 显示两条频率响应曲线,其中一条重叠在另一条之上。

我尝试了 8 到 32 个系数,结果相似。

问题:

  • 直接使用系数作为 FFT 的输入是正确的方法吗?我的假设是,以系数为先导将近似于单位脉冲。但是,我应该做任何中间处理(例如以某种方式移动每组系数数据的起点以匹配基频)?
  • LPC 数据是否应该在 FFT 之前加窗?我认为我目前在每帧都使用系数的方法意味着加窗会降低第一组系数的幅度,而 FFT 会产生不同的频率。但是,如果我将原始样本窗口化,然后将其用作 LPC 数据的输入,那么我将获得更准确的结果。

我没有使用过 MATLAB 或任何其他第三方应用程序——我希望自己使用 Xcode 及其随附的库来构建它。我可以显示此代码,但它很长并且跨越多个类(包括数据类型和数学/FFT 操作之间的适配器类)。理想情况下,我会在与语言无关的概念级别上寻求输入。

2个回答

直接使用系数作为 FFT 的输入是正确的方法吗?

这取决于你接下来要做什么。共振峰提取算法有很多,你可以在 COVAREP 中找到最近的高级算法https://github.com/covarep/covarep/blob/master/formant/formant_CGDZP.m

并直接对用零填充的 LP 系数执行 FFT。

这似乎是一个没有太大意义的疯狂步骤。你为什么做这个?LP 系数创建了非常粗略的频谱近似,其余的都在残差中,但是来自 LPC 的 FFT,这很奇怪。

窗口化没有太大变化,差异将不可见。您只能从中获得几个百分点的准确结果。

计算的 LPC 系数是权重ai, 预测未来的信号值p输入信号的先前样本:

x^[n]=i=1paix[ni],
在哪里x^[n]是预测值。系数ai, 和i[1,p], 通常通过最小化误差来找到
e[n]=||x[n]x^[n]||22.
因此,直接对系数进行 DFTai不会为您提供原始信号的频谱包络的​​估计值。相反,估计值由全极点滤波器的频率响应给出:
H(z)=||e[n]||21+i=1paizi,
在哪里||e[n]||2是预测误差的 RMS 值。因此,您应该取上面全极点滤波器的脉冲响应的 DFT,并将其与原始信号频谱一起绘制。通过预测误差缩放滤波器幅度可确保频谱包络的​​幅度对应于原始信号的幅度。