1)根据语音分帧的思想,编写分帧函数。函数定义如下:函数格式: frameout = enframe(x, win,inc ) 输人参数: x是语音信号; win 是帧长或窗函数,若为窗函数,帧长便取窗函数长; ine 是帧移。 输出参数: frameout 是分帧后的数组,长度为帧长和帧数的乘积。 根据分帧后的语音,绘制连续四帧语音信号(不用窗函数),效果如图3-3所示。
时间: 2024-02-11 11:06:12 浏览: 80
以下是一个基于Python语言的分帧函数,可以实现将音频信号分成多个帧的功能:
```python
def enframe(x, win, inc):
"""
将音频信号分帧
:param x: 音频信号
:param win: 窗函数或帧长
:param inc: 帧移
:return: 分帧后的数组
"""
if type(win) == int: # 如果 win 是整数,则认为其为帧长
nframes = 1 + int((len(x) - win) / inc) # 计算帧数
frameout = np.zeros((nframes, win)) # 初始化分帧矩阵
for i in range(nframes):
frameout[i] = x[i * inc: i * inc + win] # 分帧
else: # 如果 win 是窗函数,则使用窗函数进行加窗
nframes = 1 + int((len(x) - len(win)) / inc) # 计算帧数
frameout = np.zeros((nframes, len(win))) # 初始化分帧矩阵
for i in range(nframes):
frameout[i] = x[i * inc: i * inc + len(win)] * win # 分帧加窗
return frameout
```
接下来是绘制连续四帧语音信号的代码,假设已经读入了一段音频信号`x`:
```python
import matplotlib.pyplot as plt
win_len = 160 # 帧长
win_inc = 80 # 帧移
frames = enframe(x, win_len, win_inc) # 分帧
# 绘制连续四帧语音信号
fig, ax = plt.subplots(nrows=4, sharex=True, sharey=True)
for i in range(4):
ax[i].plot(frames[i])
plt.show()
```
这段代码会将分帧后的前四帧语音信号绘制在同一个图中,效果类似于图3-3所示。如果要绘制其他帧的语音信号,只需要修改`ax[i]`中的`i`即可。
阅读全文