一、实验目的
1、提高独立学习的能力;
2、培养发现问题、解决问题和分析问题的能力;
3、学习Matlab 的使用;
4、掌握基带数字传输系统的仿真方法;
5、熟悉基带传输系统的基本结构;
6、理解奈奎斯特第一准则;
7、通过观测眼图和星座图判断信号的传输质量;
8、通过观察BER瀑布曲线来判定系统性能。
二、实验原理
图1 基带系统传输模型框图
(1).信源
信息源,是本系统中输入的基带信号。使用matlab的rand函数生成0-1的均匀分布的随机数并将其转换为-1到1的随机数,同时令>0的数为1,<0的数为-1,至此便生成了均匀随机分布的1/-1的数据流。或者也可令>0的数为1,<0的数为-1,便生成了均匀随机分布的0/1比特流。两种都可以作为本系统的输入信号。
(2).码型转换
若上述生成的基带信号为1/-1数据流,那在码型转换处便不需要做过多的处理,因为其本身含有双极性的特性,适合在AWGN信道里传输。但若输入信号为0/1比特流则需要对其进行码型转换便于在信道中的传输,本次实验将其转换为AMI码(也可以尝试其它的)
AMI码:消息码的“1”交替地变换为“+1”和“-1”,而“0”保持不变。
例如;消息码;1 0 0 0 0 0 1 1 0 0
AMI 码:1 0 0 0 0 0-1 1 0 0
(3).扩大周期
将上述码型转换后的具有双极性的序列进行周期的扩大,或者说在每个码之间插入若干个值为0的码。
因为经仿真发现,上步结束后的码与根升余弦滚降滤波器(发送滤波器)的单位脉冲响应卷积后每个码附近都会产生小波纹,可能是与滤波器的单位脉冲响应卷积时其旁瓣造成的影响,当上述每个双极性码之间距离过近时,会导致小波纹干扰到了临近的信号的主瓣处,尤其是当其干扰到了后面进行采样的点的幅值时会导致结果不准确,本过程通过观察仿真图形也可发现。
所以在每个码之间插上若干个0可以避免码间的干扰,次数周期扩大倍数的同时后续进行采样时也需要根据此倍数进行采样,避免没有采样到关键的点,做到前后统一.
(4).根升余弦滚降滤波器
发送端的滤波器和接收端的滤波器均采用平方根升余弦滤波器。升余弦滚降信号用来消除码间串扰,实际实现时采用的方式是由发送端的基带成行滤波器和接收端的匹配滤波器两个环节公共实现。匹配滤波器是为了使得在抽样时刻信噪比最大。
当发端成形滤波器用根升余弦滤波器,接收端同样使用根升余弦滤波器,滤波器匹配时,既能够使得抽样时刻信噪比最高(即完成匹配滤波器的作用),又能够在一定的带限平坦信道中不引入码间干扰,传输系统的传递函数二者的乘 积,所以每个环节均为平方根升余弦滚降滤波器。
根升余弦滚降滤波器时域表达式:
对应的频谱为:
(5).AWGN信道
AWGN信道全称Additive white Gaussian noise信道,高斯白噪声信道,说明此信道里的噪声是按照高斯分布,在频谱上均匀分布。所以在此系统中我们通过生成高斯分布的噪声与传输的信号相加来进行模拟AWGN信道。
为了弄清误码率和信噪比的关系,需要根据信噪比得到噪声的强度,再通过与Matlab中的randn生成的强度为一的高斯分布序列相乘,得到噪声信号。
信源强度和噪声强度以及信噪比之间的公式:
其中,Ps为信源强度,Pn为噪声强度。当信源信号为1/-1分布时有此关系:
其中是信源强度Ps。
如果在Matlab中如此计算信源强度:sigPower=sum(abs(rigin_signal).^2)/length(rigin_signal);
则当信源为1/-1分布时该公式得出其强度为1,与上述不完全符合,所以在其后面除以便得出信源强度,紧接着按上式得到噪声强度,再按照上述与randn函数生成的序列相乘得到噪声信号,最后与原信号相加得到最终通过AWGN信道的信号,至此模拟AWGN信道完成。
(6).采样
通过了AWGN信道的信号须得再通过与发送滤波器相匹配的滤波器,因为本实验使用的时平方根升余弦滚降滤波器,所以接收的滤波器同样采用相同的滤波器。
通过接收滤波器的信号是经过周期放大的,所以对其采样的时候按照先前放大的周期同样对其进行间隔采样,这样是为了得到信源信号,防止得到其它信号会对最终结果造成太大误差。
(7).判决
因为采样的信号是通过了两次滤波器和AWGN信道的信号,其对应的大小早已不是最初的大小,所以需要对其进行判决,将其转换为需要的信号
如果信源信号是1/-1分布,在判决时,判断当该信号>0时,该信号对应的判决信号为1;当该信号<0时,其对应的判决信号为-1。
如果信源信号时1/0分布,在判决时,判断该信号>0.5时,其对应的判决信号为1;当该信号<-0.5时,其对应的判决信号为0。
这样判决是因为当信源时1/-1分布时,加入的高斯噪声强度最大也只能与信号强度相同(当信噪比为0时),又因为该信源强度的绝对值为1,所以如果最终的结果大于0,说明其原本的大小一定为1。1/0分布的信源同理。
(8).码型反转
依据第(2)点中对信号的码型转换,对判决的信号进行反转。当信源是1/-1分布时,信号不需要码型反转可以直接使用;当信源是1/0分布时,将信号的所以-1信号转变成1就可以了。
(9).计算误码率
通过码型反转后的信号就是所谓的收码,误码率的公式是:
其中ER是误码个数,L是发码的长度。将收码与发码进行比较,每遇见一个不同的脉冲便使ER+1,所有码判断完后用ER除以信源的长度L即可。
将上述过程通过for循环进行多次,每次给予不同的信噪比,便可以得出误码率与信噪比的关系。
三、实验步骤
①.分别编辑生成信源的子程序,在主程序使用并绘制其图形,观察是否正确。
②.编辑码型转换的子程序和码型反转的子程序,并在上述步骤的基础上在主程序里试用,并依次绘制成图形观察码型转换的结果是否正确和码型反转的结果是否和原信号一致。成功后将其应用在步骤(1)的基础上
③.编辑周期扩大的子程序和采样的子程序,在步骤(1)的基础上在主程序里试验,并依次绘制成图形观察周期扩大的结果是否正确和采样的结果是否与原信号一致(注意周期扩大的倍数和采样的周期须一致)。成功后将其应用在步骤(2)的基础上。
④.编辑信号通过滤波器的子程序,在步骤(3)的基础上在主程序里试验,绘制图形观察分别通过发送滤波器和接收滤波器的图形是否正确,成功后将其应用上。
⑤.编辑添加噪声的子程序,在步骤(4)的基础上,在通过发送滤波器后的信号上试用,观察其其绘制的图形是否大体正确(当SNR减小时噪声会减少,SNR等于0时噪声最大)。
⑥.设置循环函数,将SNR从0开始增大至某值,循环前完成生成信源、码型转换、周期扩大等步骤,循环内进行添加噪声、通过发送滤波器、采样、判决、码型反转、计算误码率等步骤。循环结束绘制SER和SNR的图形并且与理想图形进行比较。
图2为本实验的主程序框图
图2 数字基带传输系统主程序框图
四、实验条件
- 信源种类的不同。本次实验尝试了两种信源,type=1时信源为1/0分布,type=2时信源为1/-1分布。
- 信号通过AWGN信道时信噪比的不同
- 是否采用滤波器
五、实验结果
(1).type=1(信源为1/0分布)
图3-1 信源、码型转换、周期扩大、hn
图3-2 经过滤波器、添加噪声
图3-3 采样、判决、码型反转
当type为1时,信源为1/0分布,本实验的SER与SNR的关系以及二相相移键控 (BPSK) 调制下的误码率 (BER)与SNR的理论关系,如下所示:
图3-4 SER-SNR
信噪比为10时,接收端采样的眼图:
图3-5
其星座图:
图3-6
因为type=1时信源1/0分布,对其进行了码型转换,所以若将采样的信号取绝对值,则其眼图为:
图3-7
其星座图为:
图3-8
(2).type=2(信源1/-1分布)
图4-1 信源、码型转换、周期扩大、hn
图4-2 经过滤波器、添加噪声
图3-3 采样、判决、码型反转
当type为2时,信源为1/-1分布,本实验的SER与SNR的关系以及二相相移键控 (BPSK) 调制下的误码率 (BER)与SNR的理论关系,如下所示:
图4-4 SER-SNR
信噪比为10时,接收端采样的眼图:
图4-5
其星座图为:
图4-6
(3).不加滤波器
信源为1/-1分布,本实验的SER与SNR的关系以及二相相移键控 (BPSK) 调制下的误码率 (BER)与SNR的理论关系,如下所示:
图5 未加滤波器 SER-SNR
①.本实验说明,在AWGN信道中信号传输的误码率与信噪比有如上所示的非线性关系,大体是当信噪比降低时 误码率也随之降低,因为本实验当信噪比过大时会导致误码数不足,直接导致误码率为零,所以只做SNR从0-9的结果。
②.本次实验对设计了两种信源,对这两种信源都进行了尝试,发现其误码率与信噪比的结果大致相同,但当信源时1/0分布时,结果曲线在理想曲线的上方,此理想曲线为高斯白噪声在BPSK调制下误码率与信噪比的关系,对于为什么1/0分布的信源结果曲线不重合而1/-1分布的曲线结果重合,是我需要继续深入了解的知识。本次实验在此方面还有不足。
3.通过在接收端观察采样信号的眼图和星座图,当type=1时,信源1/0分布,因为对其进行了码型转换所以传输时主要分布在1/0/-1三个点处,若对其取绝对值可发现其主要分布在1/0两点处,说明其传输质量尚可;当type=2时,信源1/-1分布,接收端主要分布在1/-1两点出,说明本系统对1/-1的信号传输质量也尚可。
③.本实验在没用滤波器和用了滤波器两种情况下都进行了尝试,发现用来滤波器有一定可能性造成误差。
④.通过实验,我对数字信号处理的知识掌握更加深刻,将平时所学应用了起来,巩固了数字信号处理的知识。
⑤.本次实验让我对Matlab的使用更加熟练,增强了编程能力,同时增强了我对于仿真系统框架搭建的能力。实验初期,对于整个系统的进行乱糟糟,经老师提醒后从大框架(前后匹配)开始做起,一点一点往内做,真正明白了构思对于整个编程的重要性。
⑥.本次实验与队友分工合作,队友在实验过程中帮助查阅资料,方便了整个系统的设计,大大节约了时间,同时与队友进行讨论也一次次的完善了整个系统,这次实验让我意识到与队友配合的重要性。
主函数代码:
clear ;
close all;
type=2; %信源类型
a=0.5; %滚降系数
L=1000000; %信源长度
x=makingData(type,L); %信源
x2=AMI_Code(type,x); %码型转换为AMI码
y=extrudeMultiples(x2,20); %周期扩大20倍
hn=rcosdesign(0.6,6,4,'sqrt'); %建立升余弦滚降滤波器%M长度为25
send1=filterDeal(y,hn); %通过发送滤波器
p=(10);
for i=0:9
get2=filterDeal(addNoise(i,send1,x),hn); %添加噪声+经过接收滤波器
p(i+1)=errorRate(AMItoBinary(type,judgeCode(type,sample_AY(get2,20))),x); %采样+判决+码型反转+计算误码率
end
%% 以下用于绘制图形 %%
SNR=10; %设置信噪比
send2=addNoise(SNR,send1,x); %在send1上添加噪声
send3=filterDeal(send2,hn); %通过接收滤波器
ER=0;
send4=sample_AY(send3,20); %对send3抽样
send5=judgeCode(type,send4); %判决
send6=AMItoBinary(type,send5); %码型反转
pp=errorRate(send6,x);
figure(1);
subplot(4,1,1);stem(x);axis([0 30 -1.1 1.1]);title("信源信号");
subplot(4,1,2);stem(x2);axis([0 30 -1.1 1.1]);title("AMI码");
subplot(4,1,3);stem(y);axis([0 600 -1.1 1.1]);title("周期扩大20倍后");
subplot(4,1,4);stem(hn);axis([0 30 -0.5 0.6]);title("根升余弦单位脉冲响应");
figure(2);
subplot(3,1,1);plot(send1);axis([0 600 -1.1 1.1]);title("经过发送滤波器的信号");
subplot(3,1,2);plot(send2);axis([0 600 -1.1 1.1]);title(sprintf("添加噪声后的信号(当前信噪比:%d)",SNR));
subplot(3,1,3);plot(send3);axis([0 600 -1.1 1.1]);title("经过接收滤波器的信号");
figure(3);
subplot(3,1,1);stem(send4);axis([0 30 -2.1 2.1]);title("抽样的信号");
subplot(3,1,2);stem(send5);axis([0 30 -1.1 1.1]);title("判决后的信号");
subplot(3,1,3);stem(send6);axis([0 30 -1.1 1.1]);title("码型反转后的信号");
figure(4);
m=(0:1:9); %信噪比
j=1:10 ;
TBER(j) = erfc (sqrt(power(10,m(j)/10)))/2; %理论误码率
semilogy(m,p,'B-V',m,TBER,'M-X');
grid on;
legend ('仿真误码率','理想误码率');
生成信源子函数makingData.m:
function y=makingData(type,Length)
a = 2*rand(1,Length)-1;
y=(Length);
if type==1 %生成0 1比特流(均匀分布)
for i=1:Length
if a(i)>0
y(i) = 1;
else
y(i) = 0;
end
end
elseif type==2 %生成1 -1数据流
for i=1:Length
if a(i)>0
y(i) = 1;
else
y(i) = -1;
end
end
end
end
码型转换子函数AMI_Code.m:
function output=AMI_Code(type,input)
output=zeros(1,length(input));
if type == 1
cout=1;
for i=1:length(input) %转换成AMI码
if input(i)==1
output(i)=cout;
cout=-cout;
else
output(i)=0;
end
end
elseif type == 2
output = input;
end
end
周期扩大子函数extrudeMultiples.m:
function output=extrudeMultiples(input,multiples)
output=zeros(1,length(input)*multiples);
for i=multiples:multiples:length(input)*multiples
output(i)=input(i/multiples);
end
end
滤波器处理子函数filterDeal.m:
function output=filterDeal(input,hn)
L=length(hn);
output=conv(input,hn);
for j=1:(L-1)/2
output(:,1)=[];
end
for i=1:(L-1)/2
output(:,length(input)+1)=[];
end
end
添加噪声子函数addNoise.m:
function signal1=addNoise(SNR,add_Noise_Signal,rigin_signal)
N=length(add_Noise_Signal);
x=randn(1,N);
noiseSig=(length(add_Noise_Signal));
sigPower=sum(abs(rigin_signal).^2)/length(rigin_signal)/sqrt(2);
noisePower=power(10,-SNR/20)*sigPower;
% noisePower=power(10,(-SNR/20))/sqrt(2);
for i=1:N
noiseSig(i) = noisePower*x(i);
end
signal1=add_Noise_Signal+noiseSig;
end
采样子函数sample_AY.m:
function output=sample_AY(input,period)
output=(length(input)/period);
for i=period:period:length(input) %设置间隔来取出抽样值;
output(i/period)=input(i);
end
end
判决子函数judgeCode.m:
function output=judgeCode(type,input)
output=(length(input));
if type == 1
for i=1:length(input)
if input(i)>0.5
output(i)=1;
elseif input(i)<-0.5
output(i)=-1;
else
output(i)=0;
end
end
elseif type == 2
for i=1:length(input)
if input(i)>0
output(i)=1;
else
output(i)=-1;
end
end
end
end
码型反转子函数AMItobinary.m:
function output=AMItoBinary(type,input)
output=(length(input));
if type == 1
for i=1:length(input)
if input(i)==1
output(i)=1;
elseif input(i)==-1
output(i)=1;
else
output(i)=0;
end
end
elseif type == 2
for i=1:length(input)
if input(i)==1
output(i)=1;
elseif input(i)==-1
output(i)=-1;
end
end
end
end
计算误码率子函数errorRate.m:
function output=errorRate(intput,sample)
ER=0;
for j=1:length(intput)
if intput(j)~=sample(j)
ER=ER+1;
end
end
output=ER/length(sample); %计算误码率
end
写在最后(2023.12.25):
时间久远还请大伙原谅我没有太多时间精力回顾具体代码内容了。但我还是觉得原理和思路介绍的挺清楚的,希望能在思路上为大家提供帮助,代码反而不是很难,感谢大家的观看!