您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

Costas环的MATLAB仿真

时间:2018-3-8 23:55:33 点击:

  核心提示:Costas环的MATLAB仿真 ...
%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仿真 来源:Costas环的MATLAB仿真
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2018 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment