基于Matlab的按键音密码识别。 借助录音设备对手机、电话等按键式密码进行录音对按键式密码输入终端的按键音进行音频分析基于短时能量和过零率对所采集的音频文件进行端点检测提取出单个拨号音然后对处理后的音频进行频谱分析、对比从而识别按键式密码输入终端的按键音。 程序已调通可直接运行。先说端点检测得先揪出哪段是按键音。短时能量和过零率这对老搭档该出场了。看这段代码[audio, fs] audioread(keypress.wav); frame_len 256; overlap 128; energy sum(buffer(audio.^2, frame_len, overlap));这里用了平方求和算能量256采样点一帧128点重叠。注意buffer函数玩的是滑动窗口比for循环快得多。能量曲线要是突然拔高八成是按键开始了。不过单靠能量容易被环境噪声坑得请过零率镇场子zc sum(abs(diff(sign(buffer(audio, frame_len, overlap)))))/2; threshold_zc 0.2 * max(zc);符号函数diff之后绝对值求和这招对付突发噪声特灵。实测发现高频按键音比如#号键过零率能飙到低频键的两倍多。这时候能量和过零率双阈值一卡端点检测稳如老狗。基于Matlab的按键音密码识别。 借助录音设备对手机、电话等按键式密码进行录音对按键式密码输入终端的按键音进行音频分析基于短时能量和过零率对所采集的音频文件进行端点检测提取出单个拨号音然后对处理后的音频进行频谱分析、对比从而识别按键式密码输入终端的按键音。 程序已调通可直接运行。切出单个按键音后频谱分析才是重头戏。上FFT之前记得加窗segment audio(start:end); windowed segment .* hann(length(segment)); spectrum abs(fft(windowed, 8192));汉宁窗能把频谱泄露压下去8192点FFT把频率分辨率怼到约2Hz。重点看DTMF双频特性——每个按键对应高低两个频率。比如数字1对应697Hz和1209Hz这俩峰值一抓一个准。不过实际录音常有谐波干扰得玩点小聪明freqs [697 770 852 941 1209 1336 1477]; peaks find(islocalmax(spectrum(1:2000))); % 前2000点覆盖0-4000Hz [~,idx] min(abs(freqs - peaks*fs/8192));用islocalmax找局部极值比直接阈值灵活还能自动过滤小毛刺。最后拿标准频率表做最近邻匹配实测准确率能到90%以上。整套流程跑下来Matlab代码不到100行。但要注意采样率必须稳定——某次用手机录音自动降采样到8kHz结果频谱全乱套。建议搞个声卡直连录音设备别让系统自作聪明。这年头物理安全防不胜防下回输密码记得把音响关了。