matlab lpc求共振峰频率,用Python中的LPC估计共振峰

博主在尝试使用Python实现LPC(线性预测编码)来估计元音的共振峰,过程中遇到了问题。通过对比MATLAB代码并调整参数,逐步解决了频率不准确的问题。最终通过修改滤波器系数和调整LPC阶数,使得结果更接近Praat软件的估计。
摘要由CSDN通过智能技术生成

我对信号处理还不太熟悉(关于这一点,numpy、scipy和matlab)。我试着用Python中的LPC来估计元音共振峰,方法是修改下面的matlab代码:

这是我目前的代码:#!/usr/bin/env python

import sys

import numpy

import wave

import math

from scipy.signal import lfilter, hamming

from scikits.talkbox import lpc

"""

Estimate formants using LPC.

"""

def get_formants(file_path):

# Read from file.

spf = wave.open(file_path, 'r') # http://www.linguistics.ucla.edu/people/hayes/103/Charts/VChart/ae.wav

# Get file as numpy array.

x = spf.readframes(-1)

x = numpy.fromstring(x, 'Int16')

# Get Hamming window.

N = len(x)

w = numpy.hamming(N)

# Apply window and high pass filter.

x1 = x * w

x1 = lfilter([1., -0.63], 1, x1)

# Get LPC.

A, e, k = lpc(x1, 8)

# Get roots.

rts = numpy.roots(A)

rts = [r for r in rts if numpy.imag(r) >= 0]

# Get angles.

angz = numpy.arctan2(numpy.imag(rts), numpy.real(rts))

# Get frequencies.

Fs = spf.getframerate()

frqs = sorted(angz * (Fs / (2 * math.pi)))

return frqs

print get_formants(sys.argv[1])

使用this file作为输入,我的脚本返回以下列表:[682.18960189917243, 1886.3054773107765, 3518.8326108511073, 6524.8112723782951]

我甚至还没到最后一步,他们根据带宽过滤频率,因为列表中的频率不对。根据Praat的说法,我应该得到这样的结果(这是元音中间的共振峰列表):Time_s F1_Hz F2_Hz F3_Hz F4_Hz

0.164969 731.914588 1737.980346 2115.510104 3191.775838

我做错什么了?

非常感谢

更新:

我改了这个

x1 = lfilter([1., -0.63], 1, x1)

x1 = lfilter([1], [1., 0.63], x1)

按照沃伦·韦克瑟的建议,现在

[631.44354635609318, 1815.8629524985781, 3421.8288991389031, 6667.5030877036006]

我觉得我好像丢了什么东西,因为F3非常不好。

更新2:

我意识到传递给order的scikits.talkbox.lpc由于采样频率的不同而关闭。更改为:Fs = spf.getframerate()

ncoeff = 2 + Fs / 1000

A, e, k = lpc(x1, ncoeff)

现在我明白了:

[257.86573127888488, 774.59006835496086, 1769.4624576002402, 2386.7093679399809, 3282.387975973973, 4413.0428174593926, 6060.8150432549655, 6503.3090645887842, 7266.5069407315023]

更接近普拉特的估计!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值