lab2 按键音识别
郭高旭 ggx21@mails.tsinghua.edu.cn
测例与频谱图生成代码
https://github.com/Ggx21/dtmf_gen-for-signal-lab2
实验目的
识别dtmf音频,逐帧将其转换为按键序列
实验过程
-
将输入音频分成1/64s的帧
-
判断每一帧是否静默(计算⼀帧的平均能量(root-mean-square))
-
计算当前帧的短时傅里叶变化
stft
STFT的输出是一个矩阵,可以同时描述频域和时域的变化.
-
选择出每一帧的两个能量峰值处的频率
由于每一帧只是判断一次按键,所以我直接在时域上取平均值
1
2
3
4#取得最大值的index
max_index = mean.index(max(mean))
#取得对应的频率
freq_max=max_index*sr/n_fft -
根据找到的频率判断按键
由于添加了高斯噪声,所以可能并不能恰好命中,找到最接近的DTMF频率即可
1
2closest_a = np.argmin(np.abs(dtmf_freqs_a - max_a))
closest_b = np.argmin(np.abs(dtmf_freqs_b - max_b))
实验现象
可以通过librosa.display.specshow
观察对样例wav进行整体的stft的频谱图
1 | y, sr = librosa.load(output_wav, sr=sr) |
容易看到,我们实际上就是要取到每一帧(高亮处)峰值的频率,实际上可以直接读图看出答案
实验结论
通过本实验,我们成功实现了一个简单的按键声音识别系统。该系统可以判断音频是否为静默,并根据非静默帧的频谱信息判断对应的按键。然而,实际应用中可能需要更复杂的频率分析和模式匹配来提高准确性。此外,对于不同的按键声音,可能需要调整阈值和频率范围等参数。总体而言,本实验为进一步深入研究音频信号处理提供了基础。
另外,我还实现了一个输入到dtmf的工具,用来生成测例,以验证代码正确性;以及一个频谱图生成器,相关代码见仓库