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

举报
tsinghuazhuoqing 发表于 2022/01/15 22:05:57 2022/01/15
【摘要】 简 介: 对比了实际录制的手机音频信号的波形以及频谱,可以看到,录制双音频信号出现了较大的变化: 拨码的幅值降低了很多,需要放大20倍才能够与录制的双音频相当; 双音频中的高频区的分量很弱,几乎...

简 介: 对比了实际录制的手机音频信号的波形以及频谱,可以看到,录制双音频信号出现了较大的变化: 拨码的幅值降低了很多,需要放大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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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
  • 3

▲ 图1.2.1 原始音频波形

▲ 图1.2.1 原始音频波形

▲ 图  正确声音信号

▲ 图 正确声音信号

1.2.2 出错音频

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

  
 
  • 1
  • 2
  • 3

▲ 图1.2.3 出错误音频波形

▲ 图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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

1.3 频谱分析

(1)正常手机的频谱

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

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

(2)错误双音频信号

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

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

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

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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