背景:
目的是从语音输入中提取特征/共振峰。
我过去曾在原始样本上使用过 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 操作之间的适配器类)。理想情况下,我会在与语言无关的概念级别上寻求输入。