双音多频技术
作者:郑不挫。
原理
电话拨号有两种,脉冲和音频,所谓音频也称双音多频(DTMF)信号的拨号方式,双音多频既是电话拨号时每按一个键,有两个音频频率叠加成一个双音频信号,十二个按键由八个音频频率区分。如下图
应用
知道了双音多频技术的原理,下面讲讲如何通过双音多频技术来识别号码。采用的音频的采样频率为1000Hz,随意录制一段拨号音频,其时域波形如下:
为了进行号码识别,需要将音频信号进行切割,这里可以通过幅值来进行切割,比较简单就不说了。切割完成后,就得到了每个拨号的音频,然后对每个拨号进行FFT变换并进行一定的信号处理,就可以得到每个拨号音频的信号。
由于音频的频率为1000Hz,故双音多频表格中对应的频率也要做相应变化
如下表:
下面就是识别每个拨号音频的频谱图上的两个波峰对应的频率即可完成拨号识别。
源码
# -*- coding: utf-8 -*-
"""
Created on Mon Oct 12 22:57:08 2020
@author: ZhengBuCuo
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载数据并进行预处理
def Load_data(filepath):
# 使用read_csv方法读取数据
input_data = pd.read_csv(filepath, sep = ' ', header=None,engine = 'python' )
input_data = np.array(input_data)
# 对数据进行预处理,便于频域变换
Pretreated_data = input_data[:,1]-3232
plt.plot(input_data[:,0],Pretreated_data)
plt.title('Time Domain')
plt.xlabel('Time')
plt.show()
return Pretreated_data
# 将时域信号转至频域
def TransformTofrequencydomain(data):
sample_rate = 1000 # 采样率
nframes = len(data) # 信号点数
df=sample_rate/(nframes-1)
freq=[df*n for n in range(0,nframes)] # 信号频率
transformed=np.fft.fft(data) # 对信号进行傅里叶变换
d = int(len(transformed)/2) # 根据对称性,取一般
while freq[d]>500: # 去除频率大于500的无效信息
d-=10
freq=freq[:d]
transformed=transformed[:d]
for i,data in enumerate(transformed): # 取绝对值
transformed[i]=abs(data)
plt.plot(freq,transformed)
plt.title('Frequency Domain')
plt.xlabel('Frequency')
plt.show()
return freq , transformed
# 找频域图中低频和高频的两个波峰
def find_peaks(freq,fft_result):
local_peaks=[]
for i in np.arange(1,len(fft_result)-20)