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-051.80067726486594e-050.0001454369396715300.0003376930321877910.0006039619342660790.0009539663681081580.001397040450989870.001941617548451700.002596541879989000.003368208219086180.004262337038668350.005282324312780080.006429459829636180.007702712615214660.009098356152680720.01060990786731550.01222814954159050.01394090488284470.01573340797932100.01758821795601220.01948563609911500.02140400738578050.02331982561172910.02520872136087800.02704507672698690.02880340700803920.03045831218821870.03198511184610850.03336072916036110.03456429671298940.03557582349313460.03638183714714220.03696580060288140.03731972734163230.03743833865960530.03731972734163230.03696580060288140.03638183714714220.03557582349313460.03456429671298940.03336072916036110.03198511184610850.03045831218821870.02880340700803920.02704507672698690.02520872136087800.02331982561172910.02140400738578050.01948563609911500.01758821795601220.01573340797932100.01394090488284470.01222814954159050.01060990786731550.009098356152680720.007702712615214660.006429459829636180.005282324312780080.004262337038668350.003368208219086180.002596541879989000.001941617548451700.001397040450989870.0009539663681081580.0006039619342660790.0003376930321877910.0001454369396715301.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('发送信号','接收信号');