电话双音频拨码信号采集

举报
tsinghuazhuoqing 发表于 2022/01/21 23:35:16 2022/01/21
【摘要】 简 介: 使用计算机声卡对于旧式电话改造控制板发送的双音频信号进行采集。后期对采集到的的信号进行处理,判断是否出现信号波形出现错误。 关键词: DTFM,FFT,旧式电话 ...

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

关键词 DTFMFFT旧式电话

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

 

§01 据采集


1.1 背景介绍

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

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

▲ 图1.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 在黑线上测量到的音频信号

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

(2)耦合信号线

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

▲ 图1.3.3 电路采集接口电路

▲ 图1.3.3 电路采集接口电路

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

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

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

1.4 录制的音频信号

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

1.4.1 录制的波形

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

▲ 图  利用Audacity录制信号

▲ 图 利用Audacity录制信号

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

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

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

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

▲ 图1.3.7 录制的音频信号

▲ 图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文件
sound1 71.15M 6.455M 48.188M
wav2 178.306M 616.174M 118.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的波形

▲ 图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.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

▲ 图2.3.1 音频的Spectrum

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

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

▲ 图2.3.2 音频的Spectrum

▲ 图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 电话号码译码结果

▲ 图2.3.3 电话号码译码结果

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

▲ 图2.3.4 电话双音频编码

▲ 图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直接的对应关系,看到他们之间存在着不对应的情况。
▲ 图3.1.1 变换后的频谱与波形之间的对应关系

▲ 图3.1.1 变换后的频谱与波形之间的对应关系

▲ 。。 变换后的频谱与波形之间的对应关系

▲ 。。 变换后的频谱与波形之间的对应关系

下面的参数最好:

fs = sound.frame_rate
dataseg = data[800000:1000000]
f,t,Sxx = signal.spectrogram(dataseg, fs=fs, nperseg=2048, noverlap=2000, nfft=8192)

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

plt.clf()
plt.figure(figsize=(10,10))
plt.subplot(2,1,1)
plt.pcolormesh(t, f[50:350], Sxx[50:350,:])
plt.xlabel("Time(S)")
plt.ylabel("Frequency(Hz)")
plt.grid(True)
plt.tight_layout()

plt.subplot(2,1,2)
plt.plot(dataseg)
plt.xlabel("Time(S)")
plt.ylabel("Value")
plt.grid(True)
plt.tight_layout()

plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

▲ 图3.1.3 波形与频谱

▲ 图3.1.3 波形与频谱

▲ 。变换频谱

▲ 。变换频谱

fs = sound.frame_rate
dataseg = data[840000:960000]
f,t,Sxx = signal.spectrogram(dataseg, fs=fs, nperseg=2048, noverlap=2000, 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()

下面显示了电话号码对应的数字:18512110728

▲ 图3.1.5 对应的电话号码

▲ 图3.1.5 对应的电话号码


■ 相关文献链接:

● 相关图表链接:

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2022-01-20
#
# Note:
#============================================================

from headm import *                 # =
from scipy.io import wavfile
from tqdm import tqdm
from pydub import AudioSegment
from scipy import signal

#------------------------------------------------------------
'''
filename = '/home/aistudio/work/sound/sound1.wav'
sample_rate,sig = wavfile.read(filename)
printt(sample_rate|, shape(sig)|)

'''

#------------------------------------------------------------

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()
'''

#------------------------------------------------------------
fs = sound.frame_rate
dataseg = data[840000:960000]
f,t,Sxx = signal.spectrogram(dataseg, fs=fs, nperseg=2048, noverlap=2000, nfft=8192)

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

plt.clf()
plt.figure(figsize=(10,7))
#plt.subplot(2,1,1)
plt.pcolormesh(t, f[50:350], Sxx[50:350,:])
plt.xlabel("Time(S)")
plt.ylabel("Frequency(Hz)")
plt.grid(True)
plt.tight_layout()

#plt.subplot(2,1,2)
#plt.plot(dataseg)
#plt.xlabel("Time(S)")
#plt.ylabel("Value")
#plt.grid(True)
#plt.tight_layout()

plt.savefig('/home/aistudio/stdout.jpg')
plt.show()

#------------------------------------------------------------
'''


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)




'''
#------------------------------------------------------------
'''
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)
'''
#------------------------------------------------------------




#------------------------------------------------------------
#        END OF FILE : TEST1.PY
#============================================================

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/122606221

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。