基于PCM的简单语音信号基带传输系统(B类)
记
大三上通信原理课程设计
完成于2020.11.30
在做课程设计的过程中,遇到了很多问题,最后解决了,想要分享给遇到这个问题的其他人,但是全贴也不太好,所以我把网上难找的11位均匀量化代码放出来,其他的都放在资源里了呀。
参考博客 插值 ,audioinfo函数的使用 matlab中wavread函数错误改用方法 关于均匀量化的量化误差
任务要求
任务:自己录制一段带人声的音频,用数字传输方式,传输信道为加性高斯信道,基带传输(不需进行调制),发送端和接收端分别将模拟语音信号A/D、D/A变换,采用PCM编码
要求:(1)画出接收信号误码率随信噪比变化的曲线
(2)信号编译码使用8位A律13折线编码、11位均匀量化编码都实现,并比较两种编码方法对接收到音频信号质量的影响
(3)演示时,需播放发送和接收到的音频,测试信噪比达到多少数量级时语音信号质量可以接受
任务完成情况
基本任务
- 画出接收信号误码率随信噪比变化的曲线
- 信号编译码使用8位A律13折线编码、11位均匀量化编码都实现,并比较两种编码方法对接收到音频信号质量的影响
- 演示时,需播放发送和接收到的音频,测试信噪比达到多少数量级时语音信号质量可以接受
额外工作
-
在发送端对信号采样以压缩, 并在接收端用插值的方式恢复。
-
计算两种编码方式以及抽样造成的失真度
-
测试量化误差随量化电平的增加的变化。
完成课设时遇到的问题
-
11位均匀量化在信噪比很大的情况下,依然声音很糟糕。但是13折线法在信噪比为25的时候信噪比就很好了。
过程:13折线法其实是参考网上的代码写的,先归一后分段。但是11位均匀量化不用归一,也就是我原来的代码原理错了。
一开始我还以为是精度误差,就是int变double时候的精度损失,但其实这个没有那么大。
-
在该情形下,用失真率比较会比误码率比较更好。
我在答辩的时候,问过老师这个问题,老师也说确实是这个样子。
-
抽样之后其实声音是变短了,那就要还原回去。
这个问题似乎被我们一开始不熟悉课本知识的都忽略了,后来我就用最简单的按斜率插值回去了。
框架
设计内容
1.抽样
抽样定理:
能恢复原信号的条件是:
1
f
s
≥
T
\frac{1}{f_s}\geq T
fs1≥T
$ T是抽样间隔,f_H是模拟信号的最高频率$
实现思路:
先进行傅立叶变换得到最高频率,再得到每个间隔点的时间,最后得到采样间隔点
MaxF=max(f); %%得到最高频率为2.4
best=N/fs*1.0/(MaxF*2); %由抽样定理得到的极限值
fprintf('该音乐最高频率为%f,\n由抽样定理得抽样间隔应小于等于%f\n\n',MaxF,best);
2.插值恢复抽样
实现思路:
在第i个点和第i+1个点插入( fs-1)个点
y=zeros(1,ge*L);
for i=2:L;
y(ge*(i-1)+1)=S(i-1);
delta=(S(i)-S(i-1))/(ge-1);
for d=ge*(i-1)+2:ge*i
y(d)=y(d-1)+delta;
end
end
3.均匀量化编码与解码
本课设使用的是11位均匀量化,量化电平数 M = 2 11 = 2048 M=2^{11}=2048 M=211=2048,
量化间隔为
Δ
v
=
M
a
x
d
a
t
a
−
M
i
n
d
a
t
a
M
\Delta v=\frac{Maxdata-Mindata}{M}
Δv=MMaxdata−Mindata
M = power(2,way); %量化间隔数目
v = (maxdata-mindata)/(M-1); %量化间隔大小
对每个数据编码
1.S= floor((S-mindata)./v);
2.再把S转成2进制
对每个数据解码
1.先把数据由2进制变成十进制
2. y=double(y).* v + mindata;
4.8位13折线编码与解码
原理如图,对照看代码
5.失真率的计算
在接收端信号的幅值与信源取样值的不同数除以采样点就得到了失真率。
6.量化噪声的平均功率
E [ e 2 ( t ) ] = ∑ i = 1 i = n ( s ( t ) − s ′ ( t ) ) 2 n E[e^2(t)]=\frac{\sum_{i=1}^{i=n} (s(t)-s'(t))^2}{n} E[e2(t)]=n∑i=1i=n(s(t)−s′(t))2
结果分析
1.信噪比和误码率的关系
![mark](http://mally.oss-cn-qingdao.aliyuncs.com/PicGo上传的图片/20201130/140755704.png)
分析:
-
误码率随着信噪比增大而下降。
-
两种编码方式的结果相近,因为都是用函数添加噪声,而隔离了量化噪声的因素。由此可见,不应该通过误码率去分析该情景下的语音信号质量。
2. 信噪比和失真度的关系
![mark](http://mally.oss-cn-qingdao.aliyuncs.com/PicGo上传的图片/20201130/141244348.png)
分析:
-
信噪比越大,失真度越小。
-
对比两种编码方式,11位均匀量化编码在信噪比较小的情况下,失真率大。因为语音信号主要集中在低频段,非均匀量化减小了低频段的量化损失。
-
当信噪比一定大时,两种效果几乎一样,因为11位均匀量化电平为2048,而8位13折线非均匀间隔数也是2048.
3.量化噪声与量化位数的关系
分析:量化位数越大,量化噪声越小
4.信号的时域图和频谱图
![mark](http://mally.oss-cn-qingdao.aliyuncs.com/PicGo上传的图片/20201130/143822294.png)
分析:
可见是低通信号
函数表
函数名 | 功能 | 备注 | |
---|---|---|---|
1 | main | 主函数,执行主体框架 | 分为5个模块 |
2 | ave_code | 均匀量化编码 | [Q,y,maxdata,mindata] = ave_code(S,way,fs),way是量化电平数量 |
3 | ave_decode | 均与量化解码 | |
4 | pcmCode_13 | 8位13折线非均匀编码 | |
5 | pcmDecode_13 | 8位13折线非均匀解码 | |
6 | recoverError | 插值恢复采样并计算失真率 | |
7 | recovery | 插值恢复采样 | |
8 | distorRate | 计算失真度 | |
9 | fsave | 把音乐保存到文件,并且播放音乐 | |
10 | errorRate | 计算误码率 | |
11 | compare | 接受段和发送端时域信号对比图 | |
12 | addNoise | 添加噪声 | y= addNoise(S,snr) |
13 | quanti_error | 计算量化误差 |
均匀量化编码 ave_code
function [Q,y,maxdata,mindata] = ave_code(S,way,fs)
%功能:均匀量化编码
%way是量化电平数量,Q是用于传回主函数计算量化误差的
maxdata = max(S);
mindata = min(S);
M = power(2,way); %量化间隔数目
v = (maxdata-mindata)/(M-1); %量化间隔大小
n=1:1:length(S);
S= floor((S-mindata)./v);
%编码
y=zeros(1,way*length(S));
for i=1:length(S);
y(way*(i-1)+1:way*i)=de2bi(S(i),way);
end
Q= double(S).* v + mindata; %解量化
end
均匀量化解码 ave_decode
function y=ave_decode(x,maxdata,mindata,way)
% 功能:11位均匀解码
M = power(2,way);
v = (maxdata-mindata)/(M-1); %%量化间隔
L=length(x);
y=zeros(1,L/way);
for i=1:L/way;
y(i)=bi2de( x(way*(i-1)+1:way*i) );
end
y=double(y).* v + mindata;
end