基于MATLAB的数字带通传输系统设计(附源码)
通信原理课程实验,做了一晚上头脑异常清晰,写下来和大家分享下,程序有点问题,但可以基本实现要求,话不多说,上干货。
软件环境是MATLAB2019B
大家如果有问题可以在评论区留言,博主会尽快改正
可以实现极低误码的传输!!!
如果要下载源码一定要看最后一个“7.附源码”章节里面源码链接,题目上面的那个链接是老版本的,存在问题。
实验条件:
1) 已知恒参有线信道的带宽为300-3400Hz;
2) 假设信道存在加性高斯白噪声,信噪比为10dB;
3) 带通传输系统的传输速率为4800bps。
实验要求:
1) 确定整个传输系统的核心设计参数;
2) 设计完成该带通传输系统的发送器;
3) 根据要求添加信道噪声,得到接收端的信号;
4) 设计完成该带通传输系统的接收器;
5) 选择一张高清的图片,通过所设计的系统完成图片的传输,并计算误信率;
6) 完成实验报告。
简单说下我的思路,因为之前设计过平方根余弦滚降低通滤波器和平方根余弦滚降带通滤波器并且当时设计的码元速率指标(波特率)都是2400BAUD,因此为了达到4800bps的传输速率要求,我决定采用四进制码元进行发送(偷懒,不想再重新设计发送与接收滤波器了,因为用四进制码元发送所以传输速率Rb=RB*log2(M)=2400x2=4800bps),我实际使用的时候是利用QPSK的方式进行调制与相干解调。
--------------------------------------------------以下是我后来添加的--------------------------------------------------
说下我的理解,一定要采用4进制及以上的调制方式,因为系统是带通系统且带宽3100HZ,因此根据奈奎斯特准则,这个带通系统的最高波特率只能是3100BAUD,因此选取波特率4800BAUD进行传输是有问题的。关于调制的载波频率,因为恒参有线信道的带宽为300-3400Hz,因此载波选择在1600-2000HZ比较合理,我选取的是1800.
因此我接下来的设计选用QPSK的方式(四进制),选取载波1800HZ。
1.将图片利用MATLAB读入并变为二进制数组
2.开始分帧处理,我这里选择4800bit一帧,也就是一次处理4800个二进制数据。一次性处理全部数据我没有试过,但是如果图片太大可能会出问题
3.将4800个二进制数据转化为2400个四进制数据
4.四进制数据进行矢量图映射,说得高级其实很简单,举个例子(这里用两个二进制表示四进制,举的例子是B方式):"11"映射为“1+j“(矢量图第一象限),"01"映射为“-1+j“(矢量图第二象限),"00"映射为“-1-j“(矢量图第三象限),"10"映射为“1-j“(矢量图第四象限)
附一张矢量图:
5.给上述的映射产生的复信号加上发射滤波器,发射滤波器选择的就是低通平方根余弦滚降滤波器
6.进行调制,将滤波后的复信号实部乘以COS(Wct),将滤波后的复信号虚部乘以SIN(Wct),Wc是我们选择的载波频率,然后再将两路信号相加,得到最终发射机的输出信号,给出框图:
7.模拟信号噪声,给最终发射机的输出信号附加上高斯白噪声,使最终到达接收机的信号的信噪比为10Db。
8.接收机收到的信号分别过两个平方根余弦滚降带通滤波器,得到两路带通滤波器输出信号,画个图清楚一点。
其中带通滤波器1是将发射机的低通余弦滚降滤波器乘以COS(Wct) 进行频谱搬移得到的,带通滤波器2是将发射机的低通余弦滚降滤波器乘以SIN(Wct) 进行频谱搬移得到的。
9.先进行载波恢复,然后两路信号分别乘以COS(Wct)与SIN(Wct),详情见上图,相乘之后分别过一个低通滤波器(两个低通一模一样),除去高频分量,这样就可以得到两个信号,分别对应步骤4里面复信号实部与虚部,这样就可以大致得到发送机发送的复信号了。
10.将信号恢复为四进制,恢复的方法很简单,判断两路信号的正负就行,两路信号分别对应复信号的实部与虚部,然后根据一开始的映射关系图就行恢复就行,我再把一开始的映射关系图贴一遍:
11.四进制信号重新变为二进制然后存入总数组(这个数组用于存储图片的所有信息,每一帧处理完的信息都放里面),这样一来一帧就处理完了,然后重复步骤3~11,直到信号被完全处理。
12.所有帧处理完了之后我们得到了一个总的二进制数组,它应该包含一张图片的所有信息,我们将这个数组还原为图片即可,当然也可以凭借这个数组计算误码率等等信息。
简单放一下各步骤产生的结果:
我这里采用的1800HZ的载波就行发送
第一张图是接收机接收到的信号的原始频谱,包含发射机信号与信道的高斯白噪声。
第二张图是被接收机带通滤波器滤波后的信号频谱,可以明显看到白噪声的减少
第三张图是被带通滤波器滤波后的信号乘以SIN(Wct)与COS(Wct)后的信号频谱,可以看到信号 的频谱最高峰处变为3600HZ,即两倍的Fc,且存在直流分量。
第四张图是与正余弦载波相乘之后的信号过低通滤波器后的频谱,可以看到高频分量被滤除,仅剩直流分量剩余。
下面是星座图,反应的是接收到的信号的矢量位置,大部分的点还是挺正常的
下面给大家看下传输结果
左边是接收数据还原出的图片,右边是我们一开始发送的图片,可以看到传输效果很不理想。我稍微看了下误比特率到了将近百分之3,有点恐怖,不过暂时找不到问题,找到问题后会就行改正。
-----------------------------------------------以下是我找到问题后添加的-----------------------------------------------
是我的问题,低通平方根余弦滚降滤波器和带通平方根余弦滚降滤波器都设计错了,所以导致了结果出现问题,重新修改后放上结果。
下面是我输出的一些数据,值得注意的是按照要求信道中信号的信噪比应该是10DB,但是经过带通滤波器滤波后QPSK相干解调端的信噪比会有一定的提升,如果要计算理论的QPSK信噪比的话应该要用带通滤波器输出后的信号的信噪比去计算。
下面这个是理论误码率的计算公式,大家有兴趣可以自己算着试试,注意r的取值:
r=10^(DB单位的信噪比除以10)。比如这里10DB的话r就是10,如果是20DB的话r就是100。
有点小懒,暂时只贴上主函数的源代码 。但是我在文章的最后附上了我的整个工程的源码链接,大家如果发现什么问题可以告诉博主。
代码片
.
%WXP
%怡步晓心rui
% 2020/06/08
clear
[BIT,data,data2,a1,a2,a3] = PICTURE_EXCHANGE('my_picture.png','96_96_3.txt');%读取图片,BIT为二进制原数据
figure%绘图
imshow(uint8(data2));%图片预览
L1=length(BIT);%获取图片包含的二进制数据长度
%采样频率fs,滚降系数alpha,码元速率RB,码元周期Tb,载波频率fc,传输速率Rb,相位分区M,信噪比
SNR(DB),错误比特计数
fs=24000;alpha=0.3;RB=2400;Tb=1/RB;fc=4800;Rb=2*RB;M=4;SNR=10;ERROR_COUNT=0;
[BIT,N] = ADD_ZERO(BIT,Rb);%给BIT补零使其数组长度可以被Rb整除
RECEIVER_1= zeros(1,length(BIT));%接收数组,用于存放接收到的数据
% 四个滤波器,首先是发送滤波器,相干解调的两个接收滤波器,最后的低通滤波器
[h1] = my_fitter(RB,fs,fc,Tb,alpha,"SEND");
[h2] = my_fitter(RB,fs,fc,Tb,alpha,"RECEIVE_COS");
[h3] = my_fitter(RB,fs,fc,Tb,alpha,"RECEIVE_SIN");
[h4] = my_fitter(RB,fs,fc,Tb,0,"SEND");
%下面开始分帧处理
for i=1:1:length(BIT)/Rb
%进行调制与模拟信道噪声,忽略信道畸变
[x_upconv,cos1,sin1,u2,u4] = msg_send(i,RB,Rb,BIT,M,fs,SNR,h1,fc);
%画频谱图,x_upconv为接收机接收到的原始信号
draw_fft(9,'信道原始信号频谱',4,1,x_upconv,fs);
%进行两路带通滤波
R_COS=conv(x_upconv',h2);
R_COS=R_COS((RB)/2:(RB)/2-1+RB*1);
R_SIN=conv(x_upconv,h3);
R_SIN=R_SIN((RB)/2:(RB)/2-1+RB*1);
x_sync_cos=R_COS;
x_sync_sin=R_SIN;
%画频谱图,带通滤波后的频谱
draw_fft(9,'带通滤波后频谱',4,2,R_COS,fs);
%1为使用带通,0为不使用带通(调试)
if(1)
xi_dnconv = x_sync_cos' .* cos1;
xq_dnconv = x_sync_sin' .* sin1;
else
x_sync=x_upconv;
xi_dnconv = x_sync .* cos1;
xq_dnconv = x_sync .* sin1;
end
%画频谱图,与正余弦函数相乘后频谱
draw_fft(9,'与正余弦函数相乘后频谱',4,3,xq_dnconv,fs);
%1为使用滤波器设计的低通,0为使用发射机的发送低通滤波器(调试)
if(0)
H_am = LOWPASS;
rxFilt1 = filter(H_am,xi_dnconv);
rxFilt2 = filter(H_am,xq_dnconv);
else
rxFilt1=conv(xi_dnconv,h1);
rxFilt1=rxFilt1((RB)/2:(RB)/2-1+RB*1);
rxFilt1=rxFilt1';
rxFilt2=conv(xq_dnconv,h1);
rxFilt2=rxFilt2((RB)/2:(RB)/2-1+RB*1);
rxFilt2=rxFilt2';
end
%串并变换,x_filtered为恢复出的信号
x_filtered = rxFilt1- 1j * rxFilt2;
%画频谱图,低通滤波后频谱
draw_fft(9,'低通滤波后频谱',4,4,x_filtered,fs);
%将有相位信息的数据恢复为四进制,demodmsg为四进制数据
hDemod =comm.RectangularQAMDemodulator(M); %#ok<*COMMQAMD>
demodmsg = step(hDemod,x_filtered); % Demodulate detected signal from equalizer.
%四进制恢复为二进制数据
[bin_2] = bin_to_2bin(demodmsg,RB);
%二进制数据存入总数组,并计算错误比特数
[RECEIVER_1,ERROR_COUNT] = ERROR_AND_ASSIGNMENT(bin_2,u2,RECEIVER_1,Rb,ERROR_COUNT,i);
end
%将二进制数据变为图片
Picture_Show(RECEIVER_1,L1,a1,a2,a3);
1.我现在的发送滤波器还有一点点的问题,但对最后的结果影响不大。
欢迎大家下载:
https://download.csdn.net/download/weixin_44584198/12535826
这个源码是发送滤波器有一点点小问题的源码,但可以实现0误码传输!