电话双音频拨码信号采集

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电话双音频拨码信号采集相关的知识,希望对你有一定的参考价值。

简 介: 使用计算机声卡对于旧式电话改造控制板发送的双音频信号进行采集。后期对采集到的的信号进行处理,判断是否出现信号波形出现错误。

关键词 DTFMFFT旧式电话

数据采集 目 录
Contents
背景介绍 采集方案 搭建音频采集系统 录制的音频信号 数据分析 数据分析准备 读取音频文件 绘制Spectrum 采集总结

 

§01 据采集


1.1 背景介绍

  仍然是针对一款改造老式电话机中在成品阶段出现的偶发拨电话号码错误现象进行查找。

  根据前期的测试,会发现电话在发送的时候出现偶然误码,具体的情况可以参见测试录制的电话拨码声音信号在发送过程中的问题

▲ 图1.1.1 拨码第一个信号出现的干扰

由于:

  • 前期的电话拨码信号是录制的来自电话局返回音频,这使得其中信号的频谱不太均匀,所存在的误码波形究竟是发送引起的还是电话线引起的;
  • 对于出现故障率是由人来判断,对于100次拨出电话出现一两次的错误,存在偶然性;

  因此,为了能够定出电话双音频拨码中的干扰问题所在,特地直接对电话线发送信号进行采集判断,看是否可以可以看到出现错误信号的情况。

  • 如果对于采集到的信号(发送1000次)没有能够检测到错误信号,这说明上面的干扰来自于系统与电话线之间的耦合问题;
  • 如果检查到发送信号的错误,可以表明前面的故障来自于本机内的硬件和软件;

1.2 采集方案

1.2.1 声音信号采集

  为了能够高效采集电路板发送的信号,进行了如下的准备。
  1. 电路板自动发送信号;
  2. 通过计算机的是声卡录制发送的音频

  采集信号使用计算机的Audacity软件来录制发送的信号。为了能够更好地判断发送信号的特质,使用44.1kHz录制发送的信号。

1.2.2 拨码信号判断

  判断信号是否出现错误,使用Python语言编程,对于信号进行短时傅里叶变换,对所获得的时频联合分布数据进行解码

1.3 搭建音频采集系统

1.3.1 测试控制电路

  控制主板使用+12V电源。接通+12V电源之后,主板进行初始化,此时对应的左上方绿色LED在高频闪烁。经过大约10几秒之后,主板上的LED大约1Hz进行闪烁,此时可以看到电话线接口板上的红色LED点亮。

▲ 图 主板处在工作状态

(1)测量输出信号

  控制板在没有连接外部电话线的情况下,利用示波器可以在电话线双线连接线上测量到发送的音频信号。其中黑线可以得到到峰峰值为1V的波形信号,红线对应的波形信号非常小。因此,录制音频信号可以从黑线上进行拾取。

▲ 图1.3.2 在黑线上测量到的音频信号

(2)耦合信号线

  但电话控制板上的红色与黑色信号线分别连接到10k欧姆上接到+12V,然后再通过10uF电容耦合到面包板上的10k欧姆的电位器,然后在送往计算机声卡输入。

▲ 图1.3.3 电路采集接口电路

  在面包板上搭建的电路耦合电路。

▲ 图1.3.4 在面包板上搭建的电路耦合电路

1.4 录制的音频信号

  通过Audacity软件录制双音频拨码信号。通过电位器R1调整,使得录制信号的波形比较完整,既不太小,也不要太大使得录制音频信号波形饱和。

1.4.1 录制的波形

采样格式:
采样频率:44100
采样通道:双通道,两个通道是并联的

▲ 图 利用Audacity录制信号

▲ 图1.3.5 一个循环之内录制的信号变化

▲ 图1.3.6 一整套音频信号波形

▲ 图1.3.7 录制的音频信号

 

§02 据分析


2.1 数据分析准备

2.1.1 录制数据

  初步录制了两段音频文件:

两段音频文件:
sound1:6分53秒,wav文件:71.14MB
wav2:17分15秒,wav文件:178.31MB

  由于需要导入 AI Studio进行处理,从本地上载的数据文件大小被限制在150MB,需要通过压缩方式将文件压缩到150MB。所使用的方法:

  • 使用Audacity,将WAV文件压缩成MP3文件;
  • 使用ZIP压缩方式,将文件压缩成ZIP文件。

【表2-1-1 测试声音文件大小】

文件名称WAV文件MP3文件ZIP文件
sound171.15M6.455M48.188M
wav2178.306M616.174M118.228M

2.1.2 解压缩文件

(1)解压缩zipfile

  将压缩文件上载到AI Studio,使用zipfile进行解压缩。

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
import zipfile

print('hello')

wavezip = '/home/aistudio/work/sound/wav2.zip'

with zipfile.ZipFile(wavezip) as f:
    f.extractall()

2.2 读取音频文件

2.2.1 利用wavfile

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
from scipy.io import wavfile

filename = '/home/aistudio/work/sound/sound1.wav'

sample_rate,sig = wavfile.read(filename)

print("sample_rate: ".format(sample_rate), "shape(sig): ".format(shape(sig)))
sample_rate: 44100
shape(sig): (18213120, 2)
plt.clf()
plt.figure(figsize=(8,5))
plt.plot(sig[:,0])
plt.xlabel("n")
plt.ylabel("Wave")
plt.grid(True)
plt.tight_layout()
<span id=987010></span>![▲ 图  波形文件波形](https://img-blog.csdnimg.cn/2fa2641483e74fd7aa1f6527cd5d2f1b.gif#pic_center =560x)<center>``▲ 图  波形文件波形``</center>
udio/stdout.jpg')
plt.show()

▲ 图2.2.2 sound1的波形

gifpath = '/home/aistudio/GIF'
if not os.path.isdir(gifpath):
    os.makedirs(gifpath)
gifdim = os.listdir(gifpath)
for f in gifdim:
    fn = os.path.join(gifpath, f)
    if os.path.isfile(fn):
        os.remove(fn)

step_length = 1000
draw_length = step_length * 9

for i in tqdm(range(200)):

    startid = i * step_length
    endid = startid + draw_length

    plt.clf()
    plt.figure(figsize=(8,5))
    plt.plot(sig[startid:endid,0])
    savefile = os.path.join(gifpath, '%03d.jpg'%i)
    plt.savefig(savefile)

▲ 图 波形文件

2.2.2 读取MP3

import sys,os,math,time
import matplotlib.pyplot as plt
from numpy import *
from scipy.io import wavfile
from tqdm import tqdm
from pydub import Audiosegment
filename = '/home/aistudio/work/sound/sound1.mp3'
sound = AudioSegment.from_file(file=filename)
left = sound.split_to_mono()[0]
data = frombuffer(left._data, int16)

plt.clf()
plt.figure(figsize=(8,5))
plt.plot(data)
plt.xlabel("n")
plt.ylabel("Wave")
plt.grid(True)
plt.tight_layout()
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

▲ 图2.2.4 读取的MP3数据文件

2.3 绘制Spectrum

fs = sound.frame_rate
f,t,Sxx = signal.spectrogram(data[30000:200000], fs=fs, nperseg=8192, noverlap=256, nfft=8192)

plt.clf()
plt.figure(figsize=(12,8))
plt.pcolormesh(t, f[50:350], Sxx[50:350,:])
plt.xlabel("Time(S)")
plt.ylabel("Frequency(Hz)")
plt.grid(True)
plt.tight_layout()
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

▲ 图2.3.1 音频的Spectrum

  为了能够提高频谱的对比度,对Sxx进行了限幅:

thread = 1500000
Sxx[where(Sxx>thread)] = thread

▲ 图2.3.2 音频的Spectrum

fs = sound.frame_rate
f,t,Sxx = signal.spectrogram(data[30000:200000], fs=fs, nperseg=8192, noverlap=256, nfft=8192)

thread = 1500000
Sxx[where(Sxx>thread)] = thread

plt.clf()
plt.figure(figsize=(10,7))
plt.pcolormesh(t, f[50:350], Sxx[50:350,:])
plt.xlabel("Time(S)")
plt.ylabel("Frequency(Hz)")
plt.grid(True)
plt.tight_layout()
plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

▲ 图2.3.3 电话号码译码结果

  下图是在 DTFM信号生成与检测 给出了双音频编码组合方式。

▲ 图2.3.4 电话双音频编码

▲ 图 频谱变化过程

gifpath = '/home/aistudio/GIF'
if not os.path.isdir(gifpath):
    os.makedirs(gifpath)
gifdim = os.listdir(gifpath)
for f in gifdim:
    fn = os.path.join(gifpath, f)
    if os.path.isfile(fn):
        os.remove(fn)

count = 0
for i in tqdm(range(50000,150000,512)):
    startid = i
    freq = abs(fft.fft(data[startid:startid+8192]))

    plt.clf()
    plt.figure(figsize=(10,7))
    plt.plot(freq[50:350])
    plt.xlabel("Frequency(z)")
    plt.ylabel("Abs")
    plt.grid(True)
    plt.tight_layout()
    savefile = os.path.join(gifpath, '%03d.jpg'%count)
    count += 1
    plt.savefig(savefile)

 

集总结 ※


  使计算机声卡对于旧式电话改造控制板发送的双音频信号进行采集。后期对采集到的的信号进行处理,判断是否出现信号波形出现错误。

存在问题

下面给出了波形与SFFT直接的对

以上是关于电话双音频拨码信号采集的主要内容,如果未能解决你的问题,请参考以下文章

电话双音频拨号声音中的干扰信号

基于matlab的声音信号采集与处理

Python音频处理——信号,波形与频谱

双声道录制的混动波形信号

0到5之间的字符串是啥意思?

Android麦克风数据采集格式和常见的编码格式