测试录制的电话拨码声音信号在发送过程中的问题

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试录制的电话拨码声音信号在发送过程中的问题相关的知识,希望对你有一定的参考价值。

简 介: 对比了实际录制的手机音频信号的波形以及频谱,可以看到,录制双音频信号出现了较大的变化: 拨码的幅值降低了很多,需要放大20倍才能够与录制的双音频相当; 双音频中的高频区的分量很弱,几乎看不到;通过分析,猜测在 原来的电路设计中,对于音频发送电路可能存在着较大的问题,特别是输出音频模拟信号在耦合到电话线中的时候: 耦合和频带宽度严重不足,造成发送出的音频信号的高频区的信号被衰减更大; 输出音频功率不足,有可能是发送电路的阻抗与电话线阻抗不匹配,噪声输出信号幅值较小;至于为什么会出现部分拨码会严重失真,双音频信号全部消失,还无法确认其原因。

关键词 电话拨号双音频阻抗匹配

背 景
目 录
Contents
拨号音频
音频文件
波形分析
频谱分析
结 论
建议后续工作

 

§00   景

  在 电话双音频拨号声音中的干扰信号 测试了 旧电话改造设备 在外拨码过程出错的波形。显示在出现识别错误的拨码的音频的波形和频谱都出现很大的变化。

  今天(2022-01-14)又收到两端直接使用录音播送以及接受出错的音频波形。下面进行波形和频谱进行对照分析。

*山那边: 卓老师,您好,我们用直接播放录音文件到线路也有类似错,但相对之前的方式出错率比较低,不知道这个出错波形跟之前的波形有什么区别,麻烦您对比分析一下,谢谢!

 

§01 号音频


  然在 AI Studio中的BML-CodeLab的双音频识别算法工程 中进行分析。

from headm import *                 # =

from scipy.io   import wavfile

filename = ('origin.wav', 'record.wav')
wavedir = '/home/aistudio/work/wavefile'

def showwave(wavefile):
    fn = os.path.join(wavedir, wavefile)
    sample_rate,sig = wavfile.read(fn)

    printt(sample_rate|, type(sig)|, sig.shape|)

    plt.clf()
    plt.figure(figsize=(12,8))
    plt.plot(sig)
    plt.xlabel("sample")
    plt.ylabel("amplitude")
    plt.grid(True)
    plt.tight_layout()
    plt.savefig('/home/aistudio/stdout.jpg')
    plt.show()

showwave(filename[0])

1.1 音频文件

  音频文件存储在:work/wavefile中。

  • origin.wav: 这是我录制的十一位手机号标准双音频
  • record.wav: 这是出错时采集的音频信号

1.2 波形分析

1.2.1 原始声音波形

sample_rate: 8000
type(sig): <class 'numpy.ndarray'>
sig.shape: (20160,)

▲ 图1.2.1 原始音频波形

▲ 图 正确声音信号

1.2.2 出错音频

sample_rate: 8000
type(sig): <class 'numpy.ndarray'>
sig.shape: (18321,)

▲ 图1.2.3 出错误音频波形

  观察录制出错的音频,其中出现的问题:

  • 双音频的幅值比较小;相对于开始的摘机空号声音;
  • 发送的时间间隔不同;
  • 在第一个音频位置,出现较大的波动;

▲ 图 出错误的音频波形

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)

from tqdm import tqdm

def gifwave(wavefile):
    fn = os.path.join(wavedir, wavefile)
    sample_rate,sig = wavfile.read(fn)

    gif_num = 200
    start = 7500
    length = 500
    step = length // 8
    wavelength = len(sig)

    stepnum = (wavelength - start - length) // step
    stepnum = 50

    print("stepnum: \\n".format(stepnum))

    for i in tqdm(range(stepnum)):
        plt.clf()
        plt.figure(figsize=(10,5))
        plt.plot(sig[start+i*step:start+i*step+length])
        savefile = os.path.join(gifpath, '%03d.jpg'%i)
        plt.savefig(savefile)

gifwave(filename[1])

1.3 频谱分析

(1)正常手机的频谱

▲ 图1.3.1 录制正常手机音频信号

(2)错误双音频信号

  实现的音频的视频联合分布,可以看到:

  • 音频中的实际拨码信号的频谱很小,几乎看不到了。
  • 第一个拨码的频谱基本不存在了。
    ▲ 图1.3.2 错误音频的频谱

  下面是将音频信号乘以20之后现实的频谱。放大之后:

  • 可以显示出拨码的音频的双音频的频谱;
  • 可以看到对于高频的分量的频谱很弱,对比前面正常的信号频谱可以看到它们之间的区别。
    ▲ 图1.3.3 声音增强后对应的频谱

 

  论 ※


  比了实际录制的手机音频信号的波形以及频谱,可以看到,录制双音频信号出现了较大的变化:

  • 拨码的幅值降低了很多,需要放大20倍才能够与录制的双音频相当;
  • 双音频中的高频区的分量很弱,几乎看不到;

  通过分析,猜测在 原来的电路设计中,对于音频发送电路可能存在着较大的问题,特别是输出音频模拟信号在耦合到电话线中的时候:

  • 耦合和频带宽度严重不足,造成发送出的音频信号的高频区的信号被衰减更大;
  • 输出音频功率不足,有可能是发送电路的阻抗与电话线阻抗不匹配,噪声输出信号幅值较小;

  至于为什么会出现部分拨码会严重失真,双音频信号全部消失,还无法确认其原因。

2.1 建议后续工作

  建议,对于电话线输出电路信号使用示波器进行观察,对于输出信号的幅值,频率进行实时在线分析。 对于所使用的的电话线的耦合阻抗进行测试,对比电路的输出阻抗是是否满足匹配。测试输出电路的信号频带宽度,寻找为何它对于高频区的信号衰减这么大?


■ 相关文献链接:

● 相关图表链接:

● 信号处理程序:

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

from headm import *                 # =

from scipy.io   import wavfile
from scipy      import signal


#------------------------------------------------------------
filename = ('origin.wav', 'record.wav')
wavedir = '/home/aistudio/work/wavefile'


def showwave(wavefile):
    fn = os.path.join(wavedir, wavefile)
    sample_rate,sig = wavfile.read(fn)

    printt(sample_rate|, type(sig)|, sig.shape|)


    plt.clf()
    plt.figure(figsize=(12,8))
    plt.plot(sig)
    plt.xlabel("sample")
    plt.ylabel("amplitude")
    plt.grid(True)
    plt.tight_layout()
    plt.savefig('/home/aistudio/stdout.jpg')
    plt.show()

#showwave(filename[1])
#------------------------------------------------------------

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)

from tqdm import tqdm

def gifwave(wavefile):
    fn = os.path.join(wavedir, wavefile)
    sample_rate,sig = wavfile.read(fn)


    gif_num = 200
    start = 7500
    length = 500
    step = length // 8
    wavelength = len(sig)

    stepnum = (wavelength - start - length) // step
    stepnum = 50

    print("stepnum: \\n".format(stepnum))

    for i in tqdm(range(stepnum)):
        plt.clf()
        plt.figure(figsize=(10,5))
        plt.plot(sig[start+i*step:start+i*step+length])
        savefile = os.path.join(gifpath, '%03d.jpg'%i)
        plt.savefig(savefile)


#gifwave(filename[1])

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

def spectwave(wavefile):
    fn = os.path.join(wavedir, wavefile)
    sample_rate, sig = wavfile.read(fn)

    sig = sig*20

    f,t,Sxx = signal.spectrogram(sig, fs=sample_rate, nperseg=512, noverlap=256, nfft=8192)


    plt.figure(figsize=(12, 8))
    plt.pcolormesh(t, f[:2400], Sxx[:2400][:], cmap='Blues') #, shading='gouraud'
    plt.ylabel('Frequency[Hz]')
    plt.xlabel('Time[sec]')
    plt.savefig('/home/aistudio/stdout.jpg')
    plt.show()

spectwave(filename[1])

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

以上是关于测试录制的电话拨码声音信号在发送过程中的问题的主要内容,如果未能解决你的问题,请参考以下文章

检测DTMF信号质量

电话双音频拨码信号采集

电话录音服务仅记录来电者的声音。 (安卓)

如何使用Javascript / PHP录制用户的声音? [关闭]

屏幕录制时没有声音是怎么回事

如何用声卡采集声音信号 然后用到MATLAB里面