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

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

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

 
 
 

日志

 
 

《数字调制解调技术的MATLAB与FPGA实现》-Gardner算法在MSK中的应用问题  

2014-12-12 20:23:21|  分类: 调制解调技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
huheyi88@163.com
 杜老师好,我是您忠实读者,买了您通信同步技术和数字调制解调技术的两本书,从两本书中学到很多,感谢杜老师能把这些知识传授给我们,对我们帮助很大!
     我想把MSK用Gardener算法来做同步,MSK采用调整解调书上第六章讲的平方环解调,程序也是使用的是光盘里的,Gardener算法是利用您第八章gardener附件的第一个,定时误差也是采用的针对PSK的算法。但是定时误差始终无法降到0,我调节了很多环路滤波器的C1,C2参数,也不行。我改变输入信号的采样时钟,附件中的那个程序就是我现在在用的程序,beishu这个变量变,采样时钟也变,但是无论怎么调都不行,beishu=1,是我现在工程的采样时钟。
    杜老师您有时间了,帮我看下附件这个程序,这个程序里有各个部分的波形,我不知道该怎么调整才能降低定时误差,谢谢!

clc;clear all

beishu = 21;
ps=564480;  %码速率为564480Hz
Fs=564480*168/beishu; %采样速率为564480*168/beishuHz
fc=564480*7.5;  %载波频率为564480*7.5Hz

N=20000;        %数据码元个数
Len=N*Fs/ps;  %仿真数据的长度
rand('state', 0);
x = randint(N,1,2)'; % 产生随机数据做为数据码元
%x=ones(1,N);
dx=ones(1,N);
for i=1:N
    if x(i)==0
        x(i)=-1;
    end
end
%求原码的相对码dx 差分编码(英文名称:differential
%encoding)指的是对数字数据流,除第一个元素外,将其中各元素都表示为各该元素与其前一元素的差的编码,确实是差分,因为减去0不变,减去1,相反
for i=2:N
    if x(i)==1
        dx(i)=-dx(i-1);
    else
        dx(i)=dx(i-1);
    end
end

%将相对码按奇偶序号分成两路数据,形成Ik\Qk
di=ones(1,N);
dq=ones(1,N);
%取dx的偶数位,并列两位为di
for i=2:2:N
    di(i:i+1)=dx(i);
end
%取dx的奇数位,并列两位为dq
for i=1:2:N-1
    dq(i:i+1)=dx(i);
end

%对原始BIT数据进行Fs/ps倍重采样,使得下面构造的时候点数相同,udi每Fs/ps个是一样的
udi=ones(1,N*Fs/ps);
udq=ones(1,N*Fs/ps);
for i=1:N
    udi(Fs/ps*(i-1)+1:Fs/ps*i)=di(i);
    udq(Fs/ps*(i-1)+1:Fs/ps*i)=dq(i);
end
% udi=rectpulse(di,Fs/ps);
% udq=rectpulse(dq,Fs/ps);

%产生MSK信号所需的载波信号
t=0:1/Fs:(Len-1)/Fs;
cf0c=cos(2*pi*fc.*t);
sf0c=sin(2*pi*fc.*t);
cfps=cos(pi*ps/2.*t);
sfps=sin(pi*ps/2.*t);

%正交调制法产生msk信号
msk=udi.*cfps.*cf0c-udq.*sfps.*sf0c;

%MSK 解调
%第一种相干解调,需要同时获取fc,fb的载波频率
% demod_i=msk.*cf0c.*cfps;
% demod_q=msk.*sf0c.*sfps;
%平方环相干解调,只需获取fL、fH的载波频率
fL=cos(2*pi*fc.*t-2*pi*ps/4.*t);%cos(2*pi*ps/4.*t)
fH=cos(2*pi*fc.*t+2*pi*ps/4.*t); %这里是高低频率的频率值

demod_i=msk.*(fH+fL);
demod_q=msk.*(fH-fL);
%低通滤波后,获取I、Q支路基带波形
b=fir1(256,0.5*ps*2/Fs);%设计低通滤波器 阶数为30阶,截止频率为0.5*ps*2
f_i=filter(b,1,demod_i);
f_q=filter(b,1,demod_q);

%求Tb/2的时钟信号波形
% fL2=cos(4*pi*fc.*t-4*pi*ps/4.*t);%cos(2*pi*ps/4.*t)
% fH2=cos(4*pi*fc.*t+4*pi*ps/4.*t);
% b2=fir1(30,1*ps*2/Fs);%设计低通滤波器
% fb=fL2.*fH2;
% rb=filter(b2,1,fb);

fb=fL.*fH;
% tb=filter(b,1,fb);
rb=filter(b,1,fb);
% for i=1:length(rb)-1
%     rb(i)=tb(i+1)-tb(i);
% end
% rb=rb>=0;
%绘制解后的I、Q支路基带波形及时钟信号波形
figure(1); 
num=2000;
x_t=0:1/Fs:(num-1)/Fs;
x_t=x_t*10^6; %x_t为1/16,2/16...x_t为1的时候真的就表示1个码元,plot(x_t,udi(1:num))应该是X,Y轴一一对应,两者之间并没有什么关系
subplot(411);plot(x_t,udi(1:num));axis([0 25 -1.2 1.2]);
legend('I支路原始数据时域波形');
xlabel('时间(us)');ylabel('幅度(V)');
subplot(412);plot(x_t,f_i(1:num),'-',x_t,rb(1:num),'--');
legend('I支路解调数据','时钟信号');
xlabel('时间(us)');ylabel('幅度(V)');
subplot(413);plot(x_t,udq(1:num));axis([0 25 -1.2 1.2]);
legend('Q支路原始数据时域波形');
xlabel('时间(us)');ylabel('幅度(V)');
subplot(414);plot(x_t,f_q(1:num),'-',x_t,rb(1:num),'--');
legend('Q支路解调数据','时钟信号');
xlabel('时间(us)');ylabel('幅度(V)');

%绘制MSK信号的频谱及时域波形
figure(2);
%求MSK信号的FFT变换
m_msk=20*log10(abs(fft(msk,2048)));
m_msk=m_msk-max(m_msk);
%设置幅频响应的横坐标单位为MHz
x_f=1:length(m_msk);
x_f=x_f*Fs/length(m_msk)/10^6;
%绘制MSK信号的频谱
subplot(211);
plot(x_f,m_msk);axis([0 Fs/2/10^6 -80 0]);
legend('MSK信号频谱');
xlabel('频率(MHz)');ylabel('幅度(dB)');grid on;

%绘制MSK信号的时域波形
subplot(212);
%设置横坐标单位为us
LT=1000;
x_t=0:1/Fs:(LT-1)/Fs;
x_t=x_t*10^6;
plot(x_t,msk(100:100+LT-1)) %x,y值与默认的之间值三者一一对应
legend('MSK信号时域波形');
xlabel('时间(us)');ylabel('幅度(V)');

N=35000; %符号数 
K=4;     %每个符号采4个样点
Ns=K*N;  %总的采样点数

w=[0.5,zeros(1,N-1)];  %环路滤波器输出寄存器,初值设为0.5
n=[0.7 zeros(1,Ns-1)]; %NCO寄存器,初值设为0.7
n_temp=[n(1),zeros(1,Ns-1)]; 
u=[0.6,zeros(1,2*N-1)];%NCO输出的定时分数间隔寄存器,初值设为0.6
yI=zeros(1,2*N);       %I路内插后的输出数据 
yQ=zeros(1,2*N);       %Q路内插后的输出数据
time_error=zeros(1,N); %Gardner提取的时钟误差寄存器

i=1;    %用来表示Ts的时间序号,指示n,n_temp,nco,
k=2;    %用来表示Ti时间序号,指示u,yI,yQ
ms=1;   %用来指示T的时间序号,用来指示a,b以及w
strobe=zeros(1,Ns);

c1=5.41*10^(-3);   c2=3.82*10^(-6);  %环路滤波器系数
% c1=0.0267;c2=0.00035556;

aI1=f_i(40:84/beishu:84*N/beishu); %通过分析f_i的周期为168*2,但是码元的周期仍为168,这两个的周期是不同的,看来,因为udi是码元宽度的两倍,本来是取偶数位,结果成了延迟两倍了
bQ1=f_q(40:84/beishu:84*N/beishu); 

L=length(aI1);
%仿真输入数据
aI = aI1;
bQ = bQ1;
%bQ=0*bQ;
aI=aI*0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ns=length(aI)-2; %i 已经是四倍内插的结果,那么(i+uk)Ts就是最佳内插值

while(i<ns)
    n_temp(i+1)=n(i)-w(ms);
    if(n_temp(i+1)>0)
        n(i+1)=n_temp(i+1); % n_temp 为0.2,-0.3 n为0.2,1-0.3
    else
        n(i+1)=mod(n_temp(i+1),1); %n(i+1)=0.75
        %内插滤波器模块
        FI1=0.5*aI(i+2)-0.5*aI(i+1)-0.5*aI(i)+0.5*aI(i-1);
        FI2=1.5*aI(i+1)-0.5*aI(i+2)-0.5*aI(i)-0.5*aI(i-1);
        FI3=aI(i);
        yI(k)=(FI1*u(k)+FI2)*u(k)+FI3;
        FQ1=0.5*bQ(i+2)-0.5*bQ(i+1)-0.5*bQ(i)+0.5*bQ(i-1);
        FQ2=1.5*bQ(i+1)-0.5*bQ(i+2)-0.5*bQ(i)-0.5*bQ(i-1);
        FQ3=bQ(i);
        yQ(k)=(FQ1*u(k)+FQ2)*u(k)+FQ3; 
%         yI(k)=aI(k)+(aI(k-1)-aI(k))*u(k);  %这个是不对的,没有用到当前的a(i)值
%         yQ(k)=bQ(k)+(bQ(k-1)-bQ(k))*u(k);
        strobe(k)=mod(k,2); %strobe高电平 确实是四个码元输出一次 mod取余
        %时钟误差提取模块,采用的是Gardner算法
        if(strobe(k)==0)
            %每个数据符号计算一次时钟误差
            if(k>2) %不是一开始的点
               time_error(ms)=yI(k-1)*(yI(k)-yI(k-2))+ yQ(k-1)*(yQ(k)-yQ(k-2));
%                disp([num2str(yI(k-1)),'=',num2str(yQ(k-1)),'=',num2str(time_error(ms))]);
            else
                time_error(ms)=(yI(k-1)*yI(k)+yQ(k-1)*yQ(k));
            end
            %环路滤波器,每个数据符号计算一次环路滤波器输出
            if(ms>1)
                w(ms+1)=w(ms)+c1*(time_error(ms)-time_error(ms-1))+c2*time_error(ms);
            else
                w(ms+1)=w(ms)+c1*time_error(ms)+c2*time_error(ms);
            end
            ms=ms+1;
        end
        k=k+1;
        u(k)=n(i)/w(ms);%n(i)=0.25
    end
    i=i+1;
end
figure(3);
subplot(311);plot(u);xlabel('运算点数');ylabel('分数间隔');%axis([0 15000 0 1]);%u稳定在0.5 n稳定在0.25 
subplot(312);plot(time_error);xlabel('运算点数');ylabel('定时误差');%axis([0 7500 -2 2]);
subplot(313);plot(w);xlabel('运算点数');ylabel('环路滤波器输出');%axis([0 7500 0 1]);%w稳定在0.5
% off=6;
% scatterplot(yI(1:end),1,off);画星座图







  评论这张
 
阅读(184)| 评论(3)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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