基于MATLAB的数字带通传输系统设计

基于MATLAB的数字带通传输系统设计

基于MATLAB的数字带通传输系统设计

通信原理课程实验,做了一晚上头脑异常清晰,写下来和大家分享下,程序有点问题,但可以基本实现要求,话不多说,上干货。
软件环境是MATLAB2019B
大家如果找到问题可以在评论区留言,博主会尽快改正

1 实验条件与要求

实验条件:
1) 已知恒参有线信道的带宽为300-3400Hz;
2) 假设信道存在加性高斯白噪声,信噪比为10dB;
3) 带通传输系统的传输速率为4800bps。
实验要求:
1) 确定整个传输系统的核心设计参数;
2) 设计完成该带通传输系统的发送器;
3) 根据要求添加信道噪声,得到接收端的信号;
4) 设计完成该带通传输系统的接收器;
5) 选择一张高清的图片,通过所设计的系统完成图片的传输,并计算误信率;
6) 完成实验报告。

2 设计思路

简单说下我的思路,因为之前设计过平方根余弦滚降低通滤波器和平方根余弦滚降带通滤波器并且当时设计的码元速率指标(波特率)都是2400BAUD,因此为了达到4800bps的传输速率要求,我决定采用四进制码元进行发送(偷懒,不想再重新设计发送与接收滤波器了,因为用四进制码元发送所以传输速率Rb=RB*log2(M)=2400x2=4800bps),我实际使用的时候是利用QPSK的方式进行调制与相干解调。

3 设计步骤

1.将图片利用MATLAB读入并变为二进制数组

2.开始分帧处理,我这里选择4800bit一帧,也就是一次处理4800个二进制数据。一次性处理全部数据我没有试过,但是如果图片太大可能会出问题

3.将4800个二进制数据转化为2400个四进制数据

4.四进制数据进行矢量图映射,说得高级其实很简单,举个例子(这里用两个二进制表示四进制,举的例子是B方式):"11"映射为“1+j“(矢量图第一象限),"01"映射为“-1+j“(矢量图第二象限),"00"映射为“-1-j“(矢量图第三象限),"10"映射为“1-j“(矢量图第四象限)
附一张矢量图:基于MATLAB的数字带通传输系统设计
5.给上述的映射产生的复信号加上发射滤波器,发射滤波器选择的就是低通平方根余弦滚降滤波器

6.进行调制,将滤波后的复信号实部乘以COS(Wct),将滤波后的复信号虚部乘以SIN(Wct),Wc是我们选择的载波频率,然后再将两路信号相加,得到最终发射机的输出信号,给出框图:
基于MATLAB的数字带通传输系统设计

7.模拟信号噪声,给最终发射机的输出信号附加上高斯白噪声,使最终到达接收机的信号的信噪比为10Db

8.接收机收到的信号分别过两个平方根余弦滚降带通滤波器,得到两路带通滤波器输出信号,画个图清楚一点。
其中带通滤波器1是将发射机的低通余弦滚降滤波器乘以COS(Wct) 进行频谱搬移得到的,带通滤波器2是将发射机的低通余弦滚降滤波器乘以SIN(Wct) 进行频谱搬移得到的。
基于MATLAB的数字带通传输系统设计
9.先进行载波恢复,然后两路信号分别乘以COS(Wct)SIN(Wct),详情见上图,相乘之后分别过一个低通滤波器(两个低通一模一样),除去高频分量,这样就可以得到两个信号,分别对应步骤4里面复信号实部与虚部,这样就可以大致得到发送机发送的复信号了。

10.将信号恢复为四进制,恢复的方法很简单,判断两路信号的正负就行,两路信号分别对应复信号的实部与虚部,然后根据一开始的映射关系图就行恢复就行,我再把一开始的映射关系图贴一遍:基于MATLAB的数字带通传输系统设计
11.四进制信号重新变为二进制然后存入总数组(这个数组用于存储图片的所有信息,每一帧处理完的信息都放里面),这样一来一帧就处理完了,然后重复步骤3~11,直到信号被完全处理。

12.所有帧处理完了之后我们得到了一个总的二进制数组,它应该包含一张图片的所有信息,我们将这个数组还原为图片即可,当然也可以凭借这个数组计算误码率等等信息。

4 实验结果

简单放一下各步骤产生的结果:

我这里采用的4800HZ的载波就行发送
第一张图是接收机接收到的信号的原始频谱,包含发射机信号与信道的高斯白噪声。
第二张图是被接收机带通滤波器滤波后的信号频谱,可以明显看到白噪声的减少
第三张图是被带通滤波器滤波后的信号乘以SIN(Wct)与COS(Wct)后的信号频谱,可以看到信号的频谱最高峰处变为9600HZ,即两倍的Fc,且存在直流分量。
第四张图是上述信号过低通滤波器后的频谱图,可见高频分量被滤除,仅剩余直流分量。

*基于MATLAB的数字带通传输系统设计

下面这个图突然忘了叫啥了,反正反应的是接收到的信号的矢量位置,大部分的点还是挺正常的
基于MATLAB的数字带通传输系统设计

下面给大家看下传输结果
基于MATLAB的数字带通传输系统设计
左边是接收数据还原出的图片,右边是我们一开始发送的图片,可以看到传输效果很不理想。我稍微看了下误比特率到了将近百分之3,有点恐怖,不过暂时找不到问题,找到问题后会就行改正。

5 大家最关心的源代码

SORRY,由于代码暂时可能有点问题,因此只贴上主函数的源代码 ,其余代码改正后贴出,但我还是会把整个代码(可能有问题的)上传到CSDN,具体上传时间看情况。
代码片.

%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);

6 现在的问题

1.误码率太高,但感觉不是信噪比太低造成的,因为我有调高信噪比但发现对最后结果影响不大
2.总感觉有问题,让我研究会儿

7 附源码

源码还在路上,博主心情好说不定就发出来了

上一篇:4G LTE基础概念:VRB和PRB概念、易混名词辨析


下一篇:python对中文的处理