注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

构建数字通信技术理论与实践之间的桥梁

孤云出岫去留一无所系 朗镜悬空静躁两不相干 菜根谭.明.洪应明

 
 
 

日志

 
 

Costas环的MATLAB仿真  

2014-11-30 22:18:18|  分类: 通信同步技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
说明:不少读者来邮件反映,书中没有COSTAS环的MATALB仿真程序,现将程序发布出来,供大家学习参考,同时也将在《数字通信同步技术的MATALB与FPGA实现》、《数字调制解调技术的MATLAB与FPGA实现》两本书的第2版中添加相关内容(如果有机会再版的话)。


%costas.m程序
%作用:  costas环仿真
%作者:  Duyong
%编写日期:2014.11.30
clc;
clear all;

fs=32e6;    %采样频率
fc=6e6;     %载波频率
df=2000;    %初始频偏
fi=fc+df;   %输入信号载波频率
num=0.5e6;  %数据长度
SNR=30;     %输入数据信噪比(dB)
ts=1/fs;

%本地VCO的增益,也相当于最大捕获频偏
%(参见张厥盛等.锁相技术.西安电子科技大学出版社,1998: P11)
K0=10e3;    

%环路滤波器系数
%(参见杜勇.数字调制解调技术的MATLAB与FPGA实现.电子工业出版社,2014:P361)
c1=2^(-5);
c2=2^(-11);

%环路输入信号为单载波信号,信噪比为SNR(dB)
din=sin(2*pi*fi*(0:num-1)*ts); 
datain=awgn(din,SNR);

%设计IIR低通滤波器
N=3;    %滤波器阶数
R=60;   %阻带衰减(dB)
Wn=9e6; %截止频率
[lpf_b,lpf_a]=cheby2(N,R,Wn*2/fs);
%估计滤波器的增益(求取零点系数绝对值之和)

%%%%%%%%%2015.7.18修改
%glpf=sum(abs(lpf_b))
glpf=lpf_b(1)/lpf_a(1);
%%%%%%%%%%%

%本地载波输出信号初值
o_sin=sin(2*pi*fc*(0:num-1)*ts);
o_cos=cos(2*pi*fc*(0:num-1)*ts);
%乘法运算输出信号初值
mult_i=zeros(1,num);
mult_q=zeros(1,num);
%鉴相器输出信号初值
pd=zeros(1,num);
%本地载波频率初值
fo=ones(1,num)*fc;

%开始costas载波同步环路处理
%对costas环路使用到的变量初始化
len=0;   %低通滤波器输出数据长度
dfreq=0; %环路滤波器输出
temp=0;  %环路滤波器中间变量
df=0;    %每次需要更新的VCO输入电压
thera=0; %本地VCO输出信号的相位 
n=2;     %本地VCO频率更新的次数
lvco=20; %本地VCO频率更新的周期
m=0;     %每个VCO频率更新周期内的计数值
for i=(lvco+1):(num);
    %乘法运算
    mult_i(i)=datain(i).*o_sin(i);
    mult_q(i)=datain(i).*o_cos(i);
    %低通滤波
    lpf_i=filter(lpf_b,lpf_a,mult_i(i-N-2:i));
    lpf_q=filter(lpf_b,lpf_a,mult_q(i-N-2:i));
    
    %鉴相乘法运算
    len=length(lpf_i);

    %如果采用同相正交支路相乘运算获取鉴相值
    %为使滤波器增益为1,需对滤波后的数据进行增益处理
 %鉴相乘法器与反正切运算相比,在数据支路与本地载波相乘时会产生一个1/2因子,IQ两路相乘就会产生1/4因
 %子。鉴相相乘时还会产生1/2,因此总共产生了1/8因子。具体请参考《数字通信同步技术的MATLAB与FPGA
   %实现-Altera/Verilog版》中第136页的式(5-9)。这样在计算pd时应该修改为:pd(i)=8*lpf_i(len)*lpf_q(len).
  %这样仿真时,程序能够收敛,但与反正切运算结果还有一些差异,可认为是两种运算误差造成的。(2016.4.20)
     %
    %pd(i)=8*lpf_i(len)*lpf_q(len);
    %如果采用反正切运算求取鉴相值
    %则不需要进行增益处理
    pd(i)=atan(lpf_q(len)/lpf_i(len));
    
    %环路滤波器
    dfreq = c1*pd(i)+temp; 
    temp = temp+c2*pd(i);
    
    %每lvco个采样点更新一次频率
    if(mod(i,lvco)==0)
        df=dfreq;
        %计算上次更新时的本地载波相位
        thera(n)=2*pi*lvco*ts*fo(i-1)+thera(n-1);
        n=n+1;
    end
    %更新本地载波频率及输出信号
    fo(i)=fc+K0*df;
    m=mod(i,lvco);
    %要确保本地VCO输出相位连续的载波信号
    o_sin(i+1)=sin(2*pi*fo(i)*m*ts+thera(n-1));
    o_cos(i+1)=cos(2*pi*fo(i)*m*ts+thera(n-1));
end

%绘制输入信号载波及本地VCO输入信号频率
t=(0:num-1)*ts*1000; %时间轴(ms)
tfi=fi*ones(1,num);  %输入信号频率
plot(t,tfi/1e6,'-.',t,fo/1e6,'-');
legend('输入信号载波频率','本地VCO信号频率');
xlabel('时间(ms)');
ylabel('频率(MHz)');
grid on;

Costas环的MATLAB仿真 - 杜勇 - 构建数字通信技术理论与实践之间的桥梁
 

  评论这张
 
阅读(3458)| 评论(46)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017