语音信号作业 清音浊音分析python

文章目录


题目

录制一段自己的语音(单通道),编写Python代码,分析其采样频率、数据长度。画出语音信号的时域波形,提取出其中清音和浊音的帧(帧长为N),画出帧的时域波形,并加窗,分析其频谱。 描述清音和浊音在时域、频域的差别。 改变帧长、窗函数,观察不同帧长和窗函数对频谱带来的影响。
注意:本题使用的是单通道音频,若使用双通道下面代码会报错,需要提取一个通道分析,x[:,0]或x[:,1]。如过不想自己录,可以用一些网站现成的,比如下面这个
https://spandh.dcs.shef.ac.uk//gridcorpus/
获取音频基本信息:

import numpy as np
from scipy.io import wavfile
import matplotlib.pylab as plt

#%%
Fs,x =wavfile.read('swio1s.wav') #读取音频文件
print('Fs =',Fs,'Hz')
print('Shape:', x.shape)
print('Datatype:', x.dtype)
print('Duration:', round(x.shape[0] / float(Fs), 3),'seconds')
#%%
print(len(x))

在这里插入图片描述
画出时域波形

t = np.arange(0,len(x),1)
#%%

plt.plot(t/Fs, x/np.power(2,15))
#plt.plot(t/Fs,x/np.power(2,15))
plt.xlabel('t/s')
plt.grid()
plt.show()

在这里插入图片描述

  • 先找一段清音

截取其中一段波形,从第12400采样点开始,长度为256

N = 256
Tstart = 12400
s=x/np.power(2,15)
stemp = s[np.arange(Tstart,Tstart+N,1)]
plt.plot(stemp)
plt.show()

在这里插入图片描述
傅里叶变换

Stemp = np.fft.fft(stemp) #傅里叶变换
plt.plot(20*np.log10(np.abs(Stemp)))
plt.show()

在这里插入图片描述
加窗汉宁窗之后

#%% 加汉宁窗
n = np.arange(0,N,1)
w = 0.5*(1-np.cos(2*np.pi*n/(N-1)))
#plt.plot(w)
#plt.show()
#%% 加窗之后的频谱
Stemp = np.fft.fft(stemp*w) #傅里叶变换
n = np.arange(0,256,1)
f = n*Fs/1000/N
plt.plot(f, 20*np.log10(np.abs(Stemp[n])))
plt.grid()
plt.xlabel('Frequency/kHz')
plt.ylabel('Amplitude/dB')
plt.show()

在这里插入图片描述

  • 再找一段浊音,浊音的波形具有周期性

起始采样点

N = 1000
Tstart = 30500
s=x/np.power(2,15)
stemp = s[np.arange(Tstart,Tstart+N,1)]
plt.plot(stemp)
plt.show()

在这里插入图片描述
傅里叶变换

Stemp = np.fft.fft(stemp) #傅里叶变换
plt.plot(20*np.log10(np.abs(Stemp)))
plt.show()

在这里插入图片描述
加窗之后

#%% 加汉宁窗
n = np.arange(0,N,1)
w = 0.5*(1-np.cos(2*np.pi*n/(N-1)))
#plt.plot(w)
#plt.show()
#%% 加窗之后的频谱
Stemp = np.fft.fft(stemp*w) #傅里叶变换
n = np.arange(0,256,1)
f = n*Fs/1000/N
plt.plot(f, 20*np.log10(np.abs(Stemp[n])))
plt.grid()
plt.xlabel('Frequency/kHz')
plt.ylabel('Amplitude/dB')
plt.show()

在这里插入图片描述
简要分析:
浊音:时域上为短时周期信号,波形呈现周期性重复

频域上信号能量大,衰减快,共振峰明显

清音:时域上波形不具有周期性

频域上能量小,衰减相对慢。

窗函数主瓣窄,旁瓣大,频率识别精度高,幅值识别精度低

完整代码

import numpy as np
from scipy.io import wavfile
import matplotlib.pylab as plt

#%%
Fs,x =wavfile.read('swio1s.wav') #读取音频文件
print('Fs =',Fs,'Hz')
print('Shape:', x.shape)
print('Datatype:', x.dtype)
print('Duration:', round(x.shape[0] / float(Fs), 3),'seconds')
#%%
print(len(x))
#%%
t = np.arange(0,len(x),1)
#%%

plt.plot(t/Fs, x/np.power(2,15))
#plt.plot(t/Fs,x/np.power(2,15))
plt.xlabel('t/s')
plt.grid()
plt.show()

#%%
#
N = 256
Tstart = 12400
s=x/np.power(2,15)
stemp = s[np.arange(Tstart,Tstart+N,1)]
plt.plot(stemp)
plt.show()

Stemp = np.fft.fft(stemp) #傅里叶变换
plt.plot(20*np.log10(np.abs(Stemp)))
plt.show()

#%% 加汉宁窗
n = np.arange(0,N,1)
w = 0.5*(1-np.cos(2*np.pi*n/(N-1)))
#plt.plot(w)
#plt.show()
#%% 加窗之后的频谱
Stemp = np.fft.fft(stemp*w) #傅里叶变换
n = np.arange(0,256,1)
f = n*Fs/1000/N
plt.plot(f, 20*np.log10(np.abs(Stemp[n])))
plt.grid()
plt.xlabel('Frequency/kHz')
plt.ylabel('Amplitude/dB')
plt.show()



N = 1000
Tstart = 30500
s=x/np.power(2,15)
stemp = s[np.arange(Tstart,Tstart+N,1)]
plt.plot(stemp)
plt.show()

Stemp = np.fft.fft(stemp) #傅里叶变换
plt.plot(20*np.log10(np.abs(Stemp)))
plt.show()

#%% 加汉宁窗
n = np.arange(0,N,1)
w = 0.5*(1-np.cos(2*np.pi*n/(N-1)))
#plt.plot(w)
#plt.show()
#%% 加窗之后的频谱
Stemp = np.fft.fft(stemp*w) #傅里叶变换
n = np.arange(0,256,1)
f = n*Fs/1000/N
plt.plot(f, 20*np.log10(np.abs(Stemp[n])))
plt.grid()
plt.xlabel('Frequency/kHz')
plt.ylabel('Amplitude/dB')
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值