matlab ASK通讯系统

要用matlab搭个最简单的通讯系统,做一点想法的测试,基本搭好了,貌似我觉得我注释还是写的非常细了

% Create by Edward.xu
% Must,16,12,2012
% 280599580@qq.com
%%
close all;  %关闭所有图
clear all;  %清楚所有缓存变量
clc;        %清空命令行
%初始化
n=32;   %产生n位随机数作为信号,该仿真中标准32
fc=1000000;  %载波,该仿真中标准1000000
bitRate=1000000;  %这里也可以说是接收端的比特率,2*bitRate为奈奎斯特采样频率,该仿真中标准1000000
sampleRate=2; %奈奎斯特采样频率等于2*bitRate,这里调节的是采样的点数,该仿真中标准1000000
N=64;  %每片信号长度,就是1位随机信号用多少个点来表示,该仿真中标准64
snr=30;   %信噪比,单位db,该仿真中标准30
gate=0.5;  %判决电压,在解调的时候要根据接收信号最后的幅度进行0,1信号判断,该仿真中标准0.5
%%
picNum = 8;  %中间绘图数目
figure(1);   %第一幅图为主过程
%%
%发送信号产生,sendSignal为结果
sendSignal=randint(1,n);     %产生n位0,1交替的随机数,长度为之前设置
bit=[];                    %存最后结果,结果里有n*N个数,每N位定义了一片,共n片
for i=1:length(sendSignal)   
    if sendSignal(i)==0
       bit1=zeros(1,N);  %每一位随机数用N位数去表示,为了仿真这样写,表示时延
    else 
       bit1=ones(1,N);
    end
    bit=[bit,bit1];        %依次加入产生的数据>>bit1
end
subplot(picNum,1,1);  %发送端信号波形
stairs(1:length(sendSignal),sendSignal),title('发送端二进制信号'),grid on;  %这里采用stairs进行画图,为01序列
axis([1,length(sendSignal),-1.5,1.5]);
subplot(picNum,1,2);  %发送端信号波形
plot(1:length(bit),bit),title('发送端二进制波形'),grid on;
axis([0,(N)*length(sendSignal),-1.5,1.5]);
%sendSignal-发送信号,bit-发送二进制波形
%%
t=linspace(0,1/bitRate,N);    %创建一个用来存放调制完信号的数组,从0-1/bitRate,中间N个元素
c=sin(2*pi*t*fc);  %产生载波信号
transmittedSignal=[];  %调制完的信号存放数组初始化
for i=1:length(sendSignal)   %调制,sendSignal(i)*c,和载波相乘
     transmittedSignal=[transmittedSignal,sendSignal(i)*c];   %调制完依次存放数据
end
subplot(picNum,1,3); %画调制完的信号
plot(1:length(transmittedSignal),transmittedSignal);
title('ASK后的波形'),grid on;
axis([0,length(transmittedSignal),-1.5,1.5]);
%transmittedSignal-调制信号
%%
%对比发送和调制
figure(2);  %第二幅是一个对比
plot(bit,'b');
hold on;
plot(1:length(transmittedSignal),transmittedSignal,'r');
axis([0,length(transmittedSignal),-1.5,1.5]);
title('原始信号经调制后的对比'),grid on;
legend('发送端二进制波形','ASK后的波形');
figure(1);  %恢复到第一幅图继续
%%
%加上信道的高斯白噪声
signalPlusNoise=awgn(transmittedSignal,snr,'measured');  %awgn是Matlab库函数,直接加入加性高斯白噪声,'measured'标识测定信号强度
subplot(picNum,1,4); %画调制完的信号
plot(1:length(signalPlusNoise),signalPlusNoise);
title('接收端波形(包含噪声)'),grid on;
axis([0,length(signalPlusNoise),-1.5,1.5]);
%signalPlusNoise-调制信号加上高斯白噪声
%%
%对比发送和加上高斯白噪声的干扰
figure(3);  %第三幅是一个对比
plot(bit,'b');
hold on;
plot(1:length(signalPlusNoise),signalPlusNoise,'r');
axis([0,length(signalPlusNoise),-1.5,1.5]);
title('原始信号经调制加上高斯白噪声后的对比'),grid on;
legend('发送端二进制波形','接收端波形(AWGN)');
figure(1);  %恢复到第一幅图继续
%%
%对其接收信号进行全波整流
rectifyingSignal=abs(signalPlusNoise);       %整流,这里实际上是全波整流,由于无线发射信号是有周期的
                                             %可以认为其是一个ac信号,有负半周期,模拟解调不好处理
                                             %所以对其副半周期的信号对折到正半周期,变成一个dc信号
                                             %然后对其进行解调,对折是全波,直接滤去是半波整流
subplot(picNum,1,5); %画整流完的信号
plot(1:length(rectifyingSignal),rectifyingSignal);
title('接收端波形(整流后)'),grid on;
axis([0,length(rectifyingSignal),-1.5,1.5]);
%rectifyingSignal-接收端全波整流后的信号
%%
%对比发送和全波整流的结果
figure(4);  %第四幅是一个对比
plot(bit,'b');
hold on;
plot(1:length(rectifyingSignal),rectifyingSignal,'r');
title('原始信号经全波整流后信号的对比'),grid on;
axis([0,length(rectifyingSignal),-1.5,1.5]);
legend('发送端二进制波形','接收端波形(整流后)');
figure(1);  %恢复到第一幅图继续
%%
%采用低通滤波器进行包络检波(LPF),就是提取接收信号的包络线
%这里LPF是通过toolbox计算的,非自适应或者盲信号检测用的位同步方法,所以片信号长度N不能够过小
%否则提取不了正确的包络线
LPFnumber=[-0.000974115228971540	-5.27232987826710e-05	1.80067726486594e-05	0.000145436939671530	0.000337693032187791	0.000603961934266079	0.000953966368108158	0.00139704045098987	0.00194161754845170	0.00259654187998900	0.00336820821908618	0.00426233703866835	0.00528232431278008	0.00642945982963618	0.00770271261521466	0.00909835615268072	0.0106099078673155	0.0122281495415905	0.0139409048828447	0.0157334079793210	0.0175882179560122	0.0194856360991150	0.0214040073857805	0.0233198256117291	0.0252087213608780	0.0270450767269869	0.0288034070080392	0.0304583121882187	0.0319851118461085	0.0333607291603611	0.0345642967129894	0.0355758234931346	0.0363818371471422	0.0369658006028814	0.0373197273416323	0.0374383386596053	0.0373197273416323	0.0369658006028814	0.0363818371471422	0.0355758234931346	0.0345642967129894	0.0333607291603611	0.0319851118461085	0.0304583121882187	0.0288034070080392	0.0270450767269869	0.0252087213608780	0.0233198256117291	0.0214040073857805	0.0194856360991150	0.0175882179560122	0.0157334079793210	0.0139409048828447	0.0122281495415905	0.0106099078673155	0.00909835615268072	0.00770271261521466	0.00642945982963618	0.00528232431278008	0.00426233703866835	0.00336820821908618	0.00259654187998900	0.00194161754845170	0.00139704045098987	0.000953966368108158	0.000603961934266079	0.000337693032187791	0.000145436939671530	1.80067726486594e-05	-5.27232987826710e-05	-0.000974115228971540
];   %这些分母项直接用toolbox生成,这里只要是一个低通滤波器的冲击响应公式,分母项很多,分子项为1
filterSignal=filter(LPFnumber,1,rectifyingSignal);  %LPFnumber是分母,1为分子,后面为进入滤波器的信号
subplot(picNum,1,6); %画整流完的信号
plot(1:length(filterSignal),filterSignal);
title('接收端波形(包络检波后)'),grid on;
axis([0,length(filterSignal),-1.5,1.5]);
%filterSignal-包络检波完的信号
%%
%对比发送和包络检波的结果,这里能看到有一个相位差,是用LPF低通滤波器产生的
%所以在其之后要对其进行相位补偿
figure(5);  %第五幅是一个对比
plot(bit,'b');
hold on;
plot(1:length(filterSignal),filterSignal,'r');
title('原始信号经包络检波后信号的对比'),grid on;
axis([0,length(filterSignal),-1.5,1.5]);
legend('发送端二进制波形','接收端波形(包络检波后)');
figure(1);  %恢复到第一幅图继续
%%
%LPF的相位延迟补偿
delay=fix(length(LPFnumber)/2);  %延迟时间
phaseCompensation=[];  %初始化相位补偿结果数组
i=delay;    %i始终作为零时变量
while (i<=length(filterSignal))         %相位补偿,也就是整体把接收信号进行平移i个单位
    phaseCompensation=[phaseCompensation,filterSignal(i)];
    i=i+1;
end
subplot(picNum,1,7); %画相位补偿的信号
plot(1:length(phaseCompensation),phaseCompensation);
title('接收端波形(相位补偿后)'),grid on;
axis([0,length(phaseCompensation),-1.5,1.5]);
%phaseCompensation-相位补偿完的信号
%%
%对比发送和相位补偿的结果
figure(6);  %第六幅是一个对比
plot(bit,'b');
hold on;
plot(1:length(phaseCompensation),phaseCompensation,'r');
title('原始信号经相位补偿的接收信号的对比'),grid on;
axis([0,length(phaseCompensation),-1.5,1.5]);
legend('发送端二进制波形','接收端波形(相位补偿后)');
figure(1);  %恢复到第一幅图继续
%%
%判决解调
bitstream=[]; %解码结果存放初始化
LL=(fc/bitRate)*N;  %解码的步长,与其说步长不如说片长更好,2为奈奎斯特采样
i=LL/sampleRate;
while (i<=length(phaseCompensation))         %判决
    bitstream=[bitstream,phaseCompensation(i)>=gate];   %gate为判决电压
    i=i+LL;  %按照一片N进行一次判决
end
subplot(picNum,1,8); %画相位补偿的信号
stairs(1:length(bitstream),bitstream);   %同样用stairs进行画图,为01序列
title('接收端二进制信号'),grid on;
axis([1,length(bitstream),-1.5,1.5]);
%bitstream-解调之后的结果
%%
%对比发送和接收的结果
figure(7);  %第六幅是一个对比
stairs(1:length(sendSignal),sendSignal,'b:p')
hold on;
stairs(1:length(bitstream),bitstream,'ro-.');
grid on;
title('接收信号和发送信号的对比');
axis([1,length(bitstream),-1.5,1.5]);
legend('发送信号','接收信号');


相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页