测试录制的电话拨码声音信号在发送过程中的问题
简 介: 对比了实际录制的手机音频信号的波形以及频谱,可以看到,录制双音频信号出现了较大的变化: 拨码的幅值降低了很多,需要放大20倍才能够与录制的双音频相当; 双音频中的高频区的分量很弱,几乎看不到;通过分析,猜测在 原来的电路设计中,对于音频发送电路可能存在着较大的问题,特别是输出音频模拟信号在耦合到电话线中的时候: 耦合和频带宽度严重不足,造成发送出的音频信号的高频区的信号被衰减更大; 输出音频功率不足,有可能是发送电路的阻抗与电话线阻抗不匹配,噪声输出信号幅值较小;至于为什么会出现部分拨码会严重失真,双音频信号全部消失,还无法确认其原因。
关键词
: 电话拨号,双音频,阻抗匹配
§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.2 出错音频
sample_rate: 8000
type(sig): <class 'numpy.ndarray'>
sig.shape: (18321,)
- 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 录制正常手机音频信号
(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
#============================================================
- 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
- 点赞
- 收藏
- 关注作者
评论(0)