怎么绘制基音频率图
时间: 2023-10-11 11:13:01 浏览: 76
要绘制基音频率图,可以使用MATLAB中的`pitch`函数来获取音频信号的基音频率,然后再使用MATLAB中的`plot`函数绘制基音频率随时间的变化曲线。具体步骤如下:
1. 读取音频文件并获取采样率。
```
filename = 'example.wav'; % 音频文件名
[x, fs] = audioread(filename); % 读取音频文件
```
2. 使用`pitch`函数获取音频信号的基音频率。
```
[pitch, loc] = pitch(x, fs);
```
3. 将基音频率转换为每秒钟的基音周期数。
```
period = 1./pitch;
```
4. 计算每个基音周期的起始时间。
```
time = loc./fs;
```
5. 绘制基音频率随时间的变化曲线。
```
plot(time, period);
xlabel('Time (s)');
ylabel('Pitch period (s)');
```
注意,上述代码中的`example.wav`需要替换为你的音频文件名。绘制出的基音频率图中,横坐标表示时间,单位为秒,纵坐标表示基音周期,单位也为秒。
相关问题
用Python画基音的基音频率图
要画出语音信号的基音频率图,可以使用Python中的Matplotlib库。以下是一个简单的示例代码:
```python
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
# 读取语音信号
speech_signal, sample_rate = read_wave_file('speech.wav')
# 计算自相关函数
auto_corr = signal.correlate(speech_signal, speech_signal)
# 取自相关函数的一半作为基音周期范围
period_range = len(speech_signal) // 2
# 找到最大峰值
max_peak = np.argmax(auto_corr[period_range:]) + period_range
# 计算基音周期和基音频率
fundamental_period = max_peak
fundamental_freq = sample_rate / max_peak
# 计算每一帧的基音频率
frame_size = 256
hop_size = 128
num_frames = (len(speech_signal) - frame_size) // hop_size + 1
fundamental_freqs = np.zeros(num_frames)
for i in range(num_frames):
start = i * hop_size
end = start + frame_size
frame_signal = speech_signal[start:end]
auto_corr = signal.correlate(frame_signal, frame_signal)
max_peak = np.argmax(auto_corr[period_range:]) + period_range
fundamental_freqs[i] = sample_rate / max_peak
# 画出基音频率图
plt.plot(fundamental_freqs)
plt.xlabel('Frame')
plt.ylabel('Fundamental Frequency (Hz)')
plt.show()
```
这段代码假设你已经有一个名为 `read_wave_file` 的函数可以读取语音文件,并返回语音信号和采样率。代码的核心是计算语音信号的自相关函数,找到自相关函数的最大峰值,并将其转换为基音周期和基音频率。然后,代码使用短时傅里叶变换将语音信号分帧,并计算每一帧的基音频率。最后,代码使用Matplotlib库将基音频率图绘制出来。
用Python求取语音的基音频率图
以下是一个用Python绘制语音基音频率图的例子,基于上面的代码,需要用到matplotlib库来绘制图形:
```python
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
# 读取语音文件
sample_rate, signal_data = wavfile.read('speech.wav')
# 帧长和帧移
frame_length = int(sample_rate * 0.02)
frame_step = int(sample_rate * 0.01)
# 分帧
frames = np.array([signal_data[i:i+frame_length] for i in range(0, len(signal_data)-frame_length, frame_step)])
# 求取自相关函数
corr = np.array([np.correlate(frame, frame, mode='full') for frame in frames])
corr = corr[:, len(corr[0])//2:]
# 找到每一帧的基音周期
periods = []
for i in range(len(corr)):
peak = signal.find_peaks(corr[i], height=0)[0]
if len(peak) > 1:
period = (peak[1] - peak[0]) / sample_rate
periods.append(period)
else:
periods.append(0)
# 计算基音频率
fundamental_freq = np.array(periods)
fundamental_freq[fundamental_freq > 0] = 1 / fundamental_freq[fundamental_freq > 0]
fundamental_freq = fundamental_freq * sample_rate
# 绘制基音频率图
plt.plot(fundamental_freq)
plt.xlabel('Frame')
plt.ylabel('Fundamental Frequency (Hz)')
plt.show()
```
在这个例子中,我们将基音频率绘制为一个图形,x轴表示帧的编号,y轴表示基音频率的值。
阅读全文