python----根据共振峰频率绘制二阶谐振曲线

# 根据共振峰频率绘制二阶谐振曲线

from matplotlib import pyplot as plt
import numpy as np
from scipy import signal
f = np.array([500,1500,2500])
sampleRate = 8000
pitch = 100  #基音
f1,f2,f3= f[0],f[1],f[2]  # 三个共振频率
#冲激函数
yt = np.zeros((8000))
yt[0]=1

if f1>0:
    cft = f1 / sampleRate
    bw = 50
    q = f1 / bw
    rho = np.exp(-np.pi * cft / q)
    theta = 2 * np.pi * cft * np.sqrt(1-1/(4*q*q))
    a2 = -2 * rho*np.cos(theta)
    a3 = rho * rho
    y = signal.filtfilt([1+a2+a3],[1,a2,a3],yt)

plt.figure()
N = len(y)
fn = np.arange(0,N-1)*sampleRate/N
fftg = np.fft.fft(y)
disg = 20 * np.log10(np.abs(fftg))
plt.plot(fn[1:N//2+1],disg[1:N//2+1])
plt.xlabel('fre/hz')
plt.ylabel('amp/db')
plt.title('first formant')

if f2>0:
    cft = f2 /sampleRate
    bw = 50
    q = f2 / bw
    rho = np.exp(-np.pi * cft / q)
    theta = 2 * np.pi * cft * np.sqrt(1-1/(4*q*q))
    a2 = -2*rho*np.cos(theta)
    a3 = rho * rho
    y = signal.filtfilt([1+a2+a3],[1,a2,a3],y)

plt.figure()
N = len(y)
fn = np.arange(0,N-1)*sampleRate/N
fftg=np.fft.fft(y)
disg=20*np.log10(np.abs(fftg))
plt.plot(fn[1:N//2+1],disg[1:N//2+1])
plt.xlabel('fre/hz')
plt.ylabel('amp/db')
plt.title('second formant')


if f3>0:
    cft=f3/sampleRate
    bw=50
    q=f3/bw
    rho=np.exp(-np.pi*cft/q)
    theta = 2*np.pi*cft*np.sqrt(1-1/(4*q*q))
    a2=-2*rho*np.cos(theta)
    a3=rho*rho
    y = signal.filtfilt([1+a2+a3],[1,a2,a3],y)

plt.figure()
N=len(y)
fn = np.arange(0,N-1)*sampleRate/N
fftg = np.fft.fft(y)
disg=20*np.log10(np.abs(fftg))
plt.plot(fn[1:N//2+1],disg[1:N//2+1])
plt.xlabel('fre/hz')
plt.ylabel('amp/db')
plt.title('third formant')
plt.show()

结果是:

可以看到,共振的地方在500,1500,2500hz的频率上面。 

其中滤波器函数用到了scipy库里面的函数。signal.filtfilt()函数。具体的可以进这个网址了解:

利用Python scipy.signal.filtfilt() 实现信号滤波_John-Cao的博客-CSDN博客_signal.filtfilticon-default.png?t=M5H6https://blog.csdn.net/weixin_37996604/article/details/82864680

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值