python,输入一段语音信号,求基音频率,并绘制出基频曲线
时间: 2023-07-13 15:27:41 浏览: 207
要求一段语音信号的基音频率,可以使用自相关函数的方法。具体步骤如下:
1. 读入音频文件,将音频信号进行预加重(可选)和帧分割。
2. 对每一帧信号进行自相关分析,得到自相关函数。
3. 在自相关函数中找到第一个峰值,该峰值的位置即为基音周期。
4. 将基音周期转换为基音频率。
以下是一个简单的示例代码,可以实现这一功能:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
# 读入音频文件
sample_rate, signal = wavfile.read('your_audio_file.wav')
# 定义帧长、帧移和预加重系数
frame_length = int(0.025 * sample_rate)
frame_step = int(0.01 * sample_rate)
pre_emphasis = 0.97
# 预加重
signal = np.append(signal[0], signal[1:] - pre_emphasis * signal[:-1])
# 分帧
frames = []
for i in range(0, len(signal)-frame_length, frame_step):
frames.append(signal[i:i+frame_length])
# 自相关分析
pitch = []
for frame in frames:
# 自相关函数
autocorr = np.correlate(frame, frame, mode='full')
# 找到第一个峰值的位置
start = frame_length // 2
end = frame_length
peak = np.argmax(autocorr[start:end]) + start
# 计算基音周期和基音频率
period = peak - start
pitch.append(sample_rate / period)
# 绘制基频曲线
plt.plot(np.arange(len(pitch))*frame_step/sample_rate, pitch)
plt.xlabel('Time (s)')
plt.ylabel('Pitch (Hz)')
plt.show()
```
其中,`wavfile.read`函数用于读取音频文件。预加重和帧分割的代码与上一个问题中的代码类似,这里不再赘述。对于每一帧信号,使用`np.correlate`函数计算其自相关函数,然后在自相关函数中找到第一个峰值的位置,即可计算基音周期和基音频率。最后,使用`matplotlib.pyplot.plot`函数绘制基频曲线,并使用`matplotlib.pyplot.show`函数显示图像。
阅读全文