lab2 按键音识别

lab2 按键音识别

郭高旭 ggx21@mails.tsinghua.edu.cn

测例与频谱图生成代码

https://github.com/Ggx21/dtmf_gen-for-signal-lab2

实验目的

识别dtmf音频,逐帧将其转换为按键序列

实验过程

  1. 将输入音频分成1/64s的帧

  2. 判断每一帧是否静默(计算⼀帧的平均能量(root-mean-square))

  3. 计算当前帧的短时傅里叶变化stft

    STFT的输出是一个矩阵,可以同时描述频域和时域的变化.

  4. 选择出每一帧的两个能量峰值处的频率

    由于每一帧只是判断一次按键,所以我直接在时域上取平均值

    1
    2
    3
    4
    #取得最大值的index
    max_index = mean.index(max(mean))
    #取得对应的频率
    freq_max=max_index*sr/n_fft
  5. 根据找到的频率判断按键

    由于添加了高斯噪声,所以可能并不能恰好命中,找到最接近的DTMF频率即可

    1
    2
    closest_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
2
3
4
5
6
7
8
y, sr = librosa.load(output_wav, sr=sr)

# 计算STFT
stft_matrix = librosa.stft(y, n_fft=2048, hop_length=512)

# 绘制频谱图
plt.figure(figsize=(10, 6))
librosa.display.specshow(librosa.amplitude_to_db(np.abs(stft_matrix), ref=np.max), y_axis='log', x_axis='time', sr=sr, hop_length=512)

image-20231204130307718

容易看到,我们实际上就是要取到每一帧(高亮处)峰值的频率,实际上可以直接读图看出答案

实验结论

通过本实验,我们成功实现了一个简单的按键声音识别系统。该系统可以判断音频是否为静默,并根据非静默帧的频谱信息判断对应的按键。然而,实际应用中可能需要更复杂的频率分析和模式匹配来提高准确性。此外,对于不同的按键声音,可能需要调整阈值和频率范围等参数。总体而言,本实验为进一步深入研究音频信号处理提供了基础。

另外,我还实现了一个输入到dtmf的工具,用来生成测例,以验证代码正确性;以及一个频谱图生成器,相关代码见仓库


        

image-20231204131548586




本文总阅读量