gardner 算法matlab实现
% 仿真4比特原始数据与星座图的编码映射过程;
% 完成16QAM信号的调制解调;
% 基带信号符号速率 ps =1Mbps;
% 成形滤波器的滚降因子 a=0.8;
% 载波信号频率fc=2MHz ;
% 采样频率 Fs=8MHz ;
% 绘制16QAM信号的频谱及时域波形;
% 采用相干解调法仿真其解调过程;
% 绘制解调前后的基带信号时域波形;
% 将原始基带数据、QAM已调数据、滤波器系数写入相应的文本文件中。
clc;
close all; ps=1*10^6; %码速率为1MHz
a=0.8; %成形滤波器系数
Fs=8*10^6; %采样速率
fc=2*10^6; %载波频率
N=4000; %仿真数据的长度 t=0:1/Fs:(N*Fs/ps-1)/Fs;%产生长度为N,频率为fs的时间序列
s=randint(N,1,16); %产生随机16进制数据作为原始数据
Bs=dec2bin(s,4); %将十进制数据转换成4比特的二进制数据 %对Bs的高2比特进行差分编码
%取高2比特分别存放在A,B变量中
A=s>7;
B=(s-A*8)>3;
%差分编码后的数据存放在C,D中
C=zeros(N,1);D=zeros(N,1);
for i=2:N
C(i)=mod(((~mod(A(i)+B(i),2))&mod(A(i)+C(i-1),2)) + (mod(A(i)+B(i),2)&mod(A(i)+D(i-1),2)),2);
D(i)=mod(((~mod(A(i)+B(i),2))&mod(B(i)+D(i-1),2)) + (mod(A(i)+B(i),2)&mod(B(i)+C(i-1),2)),2);
end
%差分编码后的高2比特数据与原数据低2比特合成映射前的数据DBs
DBs=C*8+D*4+s-A*8-B*4; %完成调制前的正交同相支路数据映射
I=zeros(1,N);Q=zeros(1,N);
for i=1:N
switch DBs(i)
case 0, I(i)=3; Q(i)=3;
case 1, I(i)=1; Q(i)=3;
case 2, I(i)=3; Q(i)=1;
case 3, I(i)=1; Q(i)=1;
case 4, I(i)=-3;Q(i)=3;
case 5, I(i)=-3;Q(i)=1;
case 6, I(i)=-1;Q(i)=3;
case 7, I(i)=-1;Q(i)=1;
case 8, I(i)=3; Q(i)=-3;
case 9, I(i)=3; Q(i)=-1;
case 10,I(i)=1; Q(i)=-3;
case 11,I(i)=1; Q(i)=-1;
case 12,I(i)=-3;Q(i)=-3;
case 13,I(i)=-1;Q(i)=-3;
case 14,I(i)=-3;Q(i)=-1;
otherwise,I(i)=-1;Q(i)=-1;
end
end %对编码数据以Fs频率采样
Ads_i=upsample(I,Fs/ps);
Ads_q=upsample(Q,Fs/ps); %加噪声
% SNR=30;
% Ads_i=awgn(Ads_i,SNR);
% Ads_q=awgn(Ads_q,SNR); %设计平方根升余弦滤波器
n_T=[-2 2];
rate=Fs/ps;
T=1;
Shape_b = rcosfir(a,n_T,rate,T,'sqrt');
%对采样后的数据进行升余弦滤波;
rcos_Ads_i=filter(Shape_b,1,Ads_i);
rcos_Ads_q=filter(Shape_b,1,Ads_q); %产生同相正交两路载频信号
f0_i=cos(2*pi*fc*t);
f0_q=sin(2*pi*fc*t); %产生16QAM已调信号
qam16=rcos_Ads_i.*f0_i+rcos_Ads_q.*f0_q;
figure;
plot(qam16);
srdata = rcos_Ads_i + rcos_Ads_q * 1i;
scatterplot(srdata(length(srdata)*0.9:2:length(srdata))); %%%%% 仿真输入测试的PSK基带数据 %%%
bitstream=randint(1,N,2);
psk2=pskmod(bitstream,2);
xI=zeros(1,Ns);
xQ=zeros(1,Ns);
xI(1:8:8*N)=real(psk2);%8倍插值
xQ(1:8:8*N)=imag(psk2);
%截短后的根升余弦匹配滤波器
h1=rcosfir(0.8,[-8,8],4,1,'sqrt');
hw=kaiser(65,3.97);
hh=h1.*hw.';
aI1=conv(xI,hh);
bQ1=conv(xQ,hh);
L=length(aI1);
%仿真输入数据
% aI=[aI1(22:2:L),0,0];%2倍抽取
% bQ=[bQ1(22:2:L),0,0];
%
% scatterplot(psk2(length(psk2)*0.5:length(psk2))); aI=real(srdata(202:2:length(srdata)));%2倍抽取?为何先8倍插值,再2倍抽取?
bQ=imag(srdata(202:2:length(srdata)));
ma=max(abs(aI));mb=max(abs(bQ));
m=max(ma,mb);
aI=aI/m;bQ=bQ/m;
%
N=floor(length(aI)/4);
Ns=4*N; %总的采样点数 bt=0.001;
c2=2^(-14);
c1=2^(-6);
% c1=8/3*bt;
% c2=32/9*bt*bt;
i=3; %用来表示Ts的时间序号,指示n,n_temp,nco, w=[0.5,zeros(1,N-1)]; %环路滤波器输出寄存器,初值设为0.5
n=[0.7 zeros(1,Ns-1)]; %NCO寄存器,初值设为0.9
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提取的时钟误差寄存器 ik=time_error;
qk=time_error; k=1; %用来表示Ti时间序号,指示u,yI,yQ
ms=1; %用来指示T的时间序号,用来指示a,b以及w
strobe=zeros(1,Ns); ns=length(aI)-2;
while(i<ns)
n_temp(i+1)=n(i)-w(ms);
% n_temp(i+1)=n(i)-0.5;
if(n_temp(i+1)>0)
n(i+1)=n_temp(i+1);
else
n(i+1)=mod(n_temp(i+1),1);
%内插滤波器模块
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;
strobe(k)=mod(k,2);
%时钟误差提取模块,采用的是Gardner算法
if(strobe(k)==0)
%取出插值数据
ik(ms)=yI(k);
qk(ms)=yQ(k); %每个数据符号计算一次时钟误差
if(k>2)
Ia=(yI(k)+yI(k-2))/2;
Qa=(yQ(k)+yQ(k-2))/2;
time_error(ms)=[yI(k-1)-Ia ] *(yI(k)-yI(k-2))+[yQ(k-1)-Qa] *(yQ(k)-yQ(k-2));
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-1);
%w(ms+1)=w(ms)+c1*(time_error(ms)-time_error(ms-1));
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);
u(k) = 0.5* n(i);%%近视运算
end
i=i+1;
end
%
figure;
subplot(311);plot(u);xlabel('运算点数');ylabel('分数间隔');
subplot(312);plot(time_error);xlabel('运算点数');ylabel('定时误差');
subplot(313);plot(w);xlabel('运算点数');ylabel('环路滤波器输出');
%
%
%
iq=ik+qk*sqrt(-1);
L=length(iq)
% off=6;
scatterplot(iq(1:end));
scatterplot(iq(L*0.5:end));
scatterplot(iq(L*0.9:end));
gardner 算法matlab实现的更多相关文章
- 标准差分进化算法matlab程序实现(转载)
标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...
- 密度峰值聚类算法MATLAB程序
密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...
- GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)
以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...
- 每天进步一点点------Alpha半透明图形叠加算法Matlab+Verilog实现
Alpha图形叠加算法Matlab+Verilog实现 1.1. Alpha算法的研究 Alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明.不透明和半透明区域, ...
- 医学CT图像特征提取算法(matlab实现)
本科毕设做的是医学CT图像特征提取方法研究,主要是肺部CT图像的特征提取.由于医学图像基本为灰度图像,因此我将特征主要分为三类:纹理特征,形态特征以及代数特征,每种特征都有对应的算法进行特征提取. 如 ...
- 蚁群算法matlab实现
大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下用matlab实现蚁群算法: %蚂蚁算法test %用产生的一个圆上的十个点来检验蚂蚁 ...
- 多源最短路Floyd 算法————matlab实现
弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计 ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- k-means算法MATLAB和opencv代码
上一篇博客写了k-means聚类算法和改进的k-means算法.这篇博客就贴出相应的MATLAB和C++代码. 下面是MATLAB代码,实现用k-means进行切割: %%%%%%%%%%%%%%%% ...
随机推荐
- Java8新特性(一)_interface中的static方法和default方法
什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Colle ...
- Spring cloud zuul跨域(二)
使用 CorsFilter 解决ajax跨域问题 直接在zuul的main下面,创建corsFilter就可以了. @SpringBootApplication @EnableZuulProxy ...
- 特殊计数序列——第二类斯特林(stirling)数
计算式 \[ S(n,m)=S(n-1,m-1)+mS(n,m) \] \(S(0,0)=1,S(i,0)=0(i>0)\) 组合意义 将\(n\)个不可分辨的小球放入\(m\)个不可分辨的盒子 ...
- python3 实例方法、类方法和静态方法
#!/usr/bin/env python3.6 #-*- coding:utf-8 -*- # class Person(object): city = 'Beijing' def __init__ ...
- 20165223 《信息安全系统设计基础》 stat命令的实现-mysate
学习使用stat(1),并用C语言实现 1. 提交学习 stat(1) 的截图 2. man -k ,grep -r的使用 ...
- CF 441E Valera and Number
CF 441E Description 一共执行\(k\)次,每次有\(p\%\)把\(x * 2\),有\((100 - p)\%\)把\(x + 1\).问二进制下\(x\)末尾期望\(0\)的个 ...
- iOS程序员 如何做到升职加薪,5年 开发经验 码农 笔记送给你!
前言: 对于我们绝大多数人来说,工作最基本的意义是我们可以通过自己的劳动换取酬劳来养活自己,尤其是对于刚毕业的学生,拥有一份全日制的工作意味着自己走出校园,踏上社会,自己真正开始独立起来. 在养活自己 ...
- Python的安装与小程序的编写
Python的安装 在此之前,我完全不了解Python,为了完成任务,在慌忙之中了解了一下Python,通过百度,一步步安装好Python 过程 1.从官网中找到下载菜单并下载最新版本 2.双击pyt ...
- hadoop生态之mapReduce-Yarn
一.inputSplit 1.什么是block 块是以 block size 进行划分数据. 因此,如果群集中的 block size 为 128 MB,则数据集的每个块将为 128 MB,除非最后一 ...
- 关于word-break和word-wrap的使用和区别
当一段文字有一个长长长的英文单词的情况下使用这两个属性的区别: word-wrap: 哈哈哈, aaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb word-break: ...