热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于matlab频率估计算法对比,包括统计M.Westlund算法,BTDT,CZT,ZOOMFFT等的

基于matlab频率估计算法对比,包括统计M.Westlund算法,BTDT,CZT,ZOOM-FFT等的-1.软件版本matlab2017b2.仿真对比分析1统计同步算法


1.软件版本

matlab2017b


2.仿真对比分析

1统计同步算法 

       统计同步算法的基本思路,主要是通过多次采样测试,然后计算对应的概率分布,来确定其同步时刻。测试信号和频率点为:

最后得到的信号的眼图为:

 

 

     其主要思路,其实就是对一段正弦信号进行多次采样,然后计算每次采样后得到的跟踪结论,然后计算对应的概率分布情况,最后根据其概率密度函数得到最后的时钟跟踪点。

clc;
clear;
close all;
warning off;
addpath 'func\'
%======================统计算法实现===========================
%测试次数
Sample_Time = 100;
for j = 1:Sample_Time
j
RandStream.setDefaultStream(RandStream('mt19937ar','seed',j));
%产生伪随机数
freqcarrier = 40e6+round(5000*randn(1,1));
freqSignal = 10e6;
freqSample = 640e6;
K = floor(freqSample/freqSignal);
numSample = 256;
periodSample = 1/freqSample;
sampleIndex = 0:numSample-1;
timeSequence = sampleIndex/freqSample;
Data1 = 2*(randn(1,numSample)>=0.5)-1;
Data1s = func_samples(Data1,K);
%模拟伪随机数,即随机数以周期性出现
msg2 = [Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s];
b = hanning(127);
msg = filter(b,1,msg2);
msg = msg/max(msg);
msg(1:1024) = [];
%调制
ff = cos(2*pi*freqcarrier.*[0:length(msg)-1]/freqSample);
signalSample = msg.*ff;
t = length(signalSample);
[f,sf] = T2Fv2(t,signalSample);
figure(1);
subplot(311);
plot(msg);
title('测试随机数');
axis([1,length(msg),-1.5,1.5]);
subplot(312);
plot(f,abs(sf));
xlabel('频率 Mhz');
subplot(313);
plot(sf);
xlabel('归一化频率 点数');
%==========================计算Fcourse========================
sf1(1) = 0;
index = find(sf== max(sf));
I = 3;
Fcourse = index;
tic;


Fth = Fcourse;
N = length(signalSample);

Ntemp = N*(Fcourse-0.5)/Fth;
numTemp = round(Ntemp);
[ftemp,sftemp]= T2Fv2(t,signalSample(1:N));
sftemp(1) = 0;
indexTemp = find(sftemp== max(sftemp));
if sftemp(indexTemp) > sftemp(indexTemp-1)
Fth = Fth+0.1;
else
Fth = Fth-0.1;
end
Fpresize2(j)=Fth;
t(j) = toc;
end
figure;
hist(Fpresize2,10);
%计算概率分布
[m,n] = hist(Fpresize2,100);
[V,I] = max(m);
Fpresize = Fpresize2(I);
fprintf('%12.8f',Fpresize);

figure;
%恢复眼图
delta = (16320)/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(211)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('标准眼图');
grid on;
%恢复眼图
delta = Fpresize/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(212)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('同步之后眼图');
grid on;
p=100*abs(Fpresize-16320)/16320;
fprintf('估计精度:');
fprintf('%2.4f',p);
fprintf('%%\n');
t2 = mean(t);
fprintf('仿真时间:');
fprintf('%2.4f',t2);
fprintf('s\n');
save r4.mat t2 p

BTDT:

这个部分的仿真结果如下所示:

 

 

 

    BTDT的基本步骤如下所示:

    同步方案中,为了重建眼图,需要确定采样步长ΔtΔt是通过Δt = FT/N来确定的,T为信号周期的步长,N是采样点的数目,F是采样数据的包络。通过对这些采样的数据进行傅立叶变换,我们可以利用数值的方法确定包络的数目F’可是离散傅立叶变换的谱分辨率有限,实际的FF’- 0.5 to F’+0.5之间。为重建眼图,我们必须得到精确的F值。

    实际的F值可以采用我们最近提出的二进制数据截断法BTDT迅速而有效地得到其工作原理如下:首先采样得到的数据的长度被截断为Nth = N/2F,因而数据的的数目减为N’ =N-Nth。接着对截断的数据进行傅立叶变换来计算其功率谱,并比较P(F’)  P(F’-1)P(f)为频率f的谱功率。如果P(F’-1) > P(F’),实际的F值应该位于小于F’的范围内。

      相反,如果P(F’-1) < P(F’),如果F值应该高于F’。以相同的方式,我们重复截短数据Nth =N*[Fth-(F’-0.5)]/Fth 倍,Fth为预测的F范围的中心频率。经过m次迭代计算,F的准确度提高了2m倍。采用BTDT方法,采用标准的台式机,眼图重建可以在<0.3s的时间内完成,因此使每次扫描的实时再同步成为可能。

clc;
clear;
close all;
warning off;
addpath 'func\'
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));
%产生伪随机数
freqcarrier = 40e6;
freqSignal = 10e6;
freqSample = 640e6;
K = freqSample/freqSignal;
numSample = 256;
periodSample = 1/freqSample;
sampleIndex = 0:numSample-1;
timeSequence = sampleIndex/freqSample;
Data1 = 2*(randn(1,numSample)>=0.5)-1;
Data1s = func_samples(Data1,K);
%模拟伪随机数,即随机数以周期性出现
msg2 = [Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s];
b = hanning(127);
msg = filter(b,1,msg2);
msg = msg/max(msg);
msg(1:1024) = [];
%调制
ff = cos(2*pi*freqcarrier.*[0:length(msg)-1]/freqSample);
signalSample = msg.*ff;
t = length(signalSample);
[f,sf] = T2Fv2(t,signalSample);
figure;
subplot(311);
plot(msg);
title('测试随机数');
axis([1,length(msg),-1.5,1.5]);
subplot(312);
plot(f,abs(sf));
xlabel('频率 Mhz');
subplot(313);
plot(sf);
xlabel('归一化频率 点数');
%==========================计算Fcourse========================
sf1(1) = 0;
index = find(sf== max(sf));
I = 3;
Fcourse = index;
tic;
%==========================利用BTDT计算Fpresize================
Fth = Fcourse;
N = length(msg);
for k = 1:I
Ntemp = N*(Fcourse-0.5)/Fth;
numTemp = round(Ntemp);
[ftemp,sftemp]=T2Fv2(t,signalSample(1:numTemp));
sftemp(1) = 0;
indexTemp = find(sftemp== max(sftemp));
if sftemp(indexTemp)>sftemp(indexTemp-1)
Fth = Fth+(0.5)^(k+1);
else
Fth = Fth-(0.5)^(k+1);
end
end
format long;
Fpresize = Fth;
fprintf('%6.5f\n',Fpresize);
clc;
t=toc;
figure;
%恢复眼图
delta = (Fcourse)/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(211)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('标准眼图');
grid on;
%恢复眼图
delta = Fpresize/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(212)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('同步之后眼图');
grid on;
p=100*abs(Fpresize-Fcourse)/Fcourse;
fprintf('估计精度:');
fprintf('%2.4f',p);
fprintf('%%\n');
fprintf('仿真时间:');
fprintf('%2.4f',t);
fprintf('s\n');
save r2.mat t p

CZT:

这个部分的仿真结果如下所示:

 

 

 

CZT的基本步骤如下所示:

http://d.wanfangdata.com.cn/Periodical_zjbgcxyxb201201013.aspx

clc;
clear;
close all;
warning off;
addpath 'func\'
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));
%产生伪随机数
freqcarrier = 40e6;
freqSignal = 10e6;
freqSample = 640e6;
K = freqSample/freqSignal;
numSample = 256;
periodSample = 1/freqSample;
sampleIndex = 0:numSample-1;
timeSequence = sampleIndex/freqSample;
Data1 = 2*(randn(1,numSample)>=0.5)-1;
Data1s = func_samples(Data1,K);
%模拟伪随机数,即随机数以周期性出现
msg2 = [Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s];
b = hanning(127);
msg = filter(b,1,msg2);
msg = msg/max(msg);
msg(1:1024) = [];
%调制
ff = cos(2*pi*freqcarrier.*[0:length(msg)-1]/freqSample);
signalSample = msg.*ff;
t = length(signalSample);
[f,sf] = T2Fv2(t,signalSample);
figure;
subplot(311);
plot(msg);
title('测试随机数');
axis([1,length(msg),-1.5,1.5]);
subplot(312);
plot(f,abs(sf));
xlabel('频率 Mhz');
subplot(313);
plot(sf);
xlabel('归一化频率 点数');
%==========================计算Fcourse========================
sf1(1) = 0;
index = find(sf== max(sf));
I = 3;
Fcourse = index;
tic;
%==========================CZT实现===========================
F1 = 2e7;%细化频率段起点
F2 = 6e7;%细化频率段终点
M = 2^16;%细化频段的频点数,(这里其实就是细化精度)
w = exp(-j*2*pi*(F2-F1)/(freqSample*M));%细化频段的跨度(步长)
a = exp(j*2*pi*F1/freqSample);%细化频段的起始点,这里需要运算一下才能代入czt函数
xk = czt(signalSample,M,w,a);
h = 0:1:M-1;%细化频点序列
deltaFreq = freqSample/length(signalSample);
index1 = F1/deltaFreq;
index2 = F2/deltaFreq;
f0 =(F2-F1)/M*h+F1;%细化的频率值
f00 =(index2-index1)/M*h+index1;%细化的频率值
Fpresize = f00(find(xk==max(xk))-1);%%%%不对
fprintf('%6.5f',Fpresize);
t=toc;
figure;
%恢复眼图
delta = (Fcourse)/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(211)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('标准眼图');
grid on;
%恢复眼图
delta = Fpresize/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(212)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('同步之后眼图');
grid on;
p=100*abs(Fpresize-Fcourse)/Fcourse;
fprintf('估计精度:');
fprintf('%2.4f',p);
fprintf('%%\n');
fprintf('仿真时间:');
fprintf('%2.4f',t);
fprintf('s\n');
save r3.mat t p

ZOOM_FFT

这个部分的仿真结果如下所示:

 

 

 

clc;
clear;
close all;
warning off;
addpath 'func\'
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));
%产生伪随机数
freqcarrier = 40e6;
freqSignal = 10e6;
freqSample = 640e6;
K = freqSample/freqSignal;
numSample = 256;
periodSample = 1/freqSample;
sampleIndex = 0:numSample-1;
timeSequence = sampleIndex/freqSample;
Data1 = 2*(randn(1,numSample)>=0.5)-1;
Data1s = func_samples(Data1,K);
%模拟伪随机数,即随机数以周期性出现
msg2 = [Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s,Data1s];
b = hanning(127);
msg = filter(b,1,msg2);
msg = msg/max(msg);
msg(1:1024) = [];
%调制
ff = cos(2*pi*freqcarrier.*[0:length(msg)-1]/freqSample);
signalSample = msg.*ff;
t = length(signalSample);
[f,sf] = T2Fv2(t,signalSample);
figure;
subplot(311);
plot(msg);
title('测试随机数');
axis([1,length(msg),-1.5,1.5]);
subplot(312);
plot(f,abs(sf));
xlabel('频率 Mhz');
subplot(313);
plot(sf);
xlabel('归一化频率 点数');
%==========================计算Fcourse========================
sf1(1) = 0;
index = find(sf== max(sf));
I = 3;
Fcourse = index;
tic;
%==========================ZOOMFFT===========================
F1 = 2e7;%细化频率段起点
F2 = 6e7;%细化频率段终点
M = 2^16;%细化频段的频点数,(这里其实就是细化精度)
fi = 1e8; %最小细化截止频率
np = 32; %放大倍数
nfft = M;
clc;
xk = zfft_m(signalSample,fi,freqSample,nfft,np);
t=toc;
h = 0:1:M-1;%细化频点序列
deltaFreq = freqSample/length(signalSample);
index1 = F1/deltaFreq;
index2 = F2/deltaFreq;
f0 = (F2-F1)/M*h+F1;%细化的频率值
f00 = (index2-index1)/M*h+index1;%细化的频率值
Fpresize = f00(find(xk==max(xk))+1);
fprintf('%6.5f',Fpresize);
figure;
%恢复眼图
delta = (Fcourse)/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(211)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('标准眼图');
grid on;
%恢复眼图
delta = Fpresize/length(msg);
Xpoint = mod((1:length(msg))*delta,64);
Ypoint = msg;
subplot(212)
tip = ceil((1:length(msg))*delta);
for k = 1:max(tip)
indexSS = find(tip==k);
plot(Xpoint(indexSS),Ypoint(indexSS));
hold on;
end
axis([2.3,18.4,-0.96,0.96]);
title('同步之后眼图');
grid on;
p=100*abs(Fpresize-Fcourse)/Fcourse;
fprintf('估计精度:');
fprintf('%2.4f',p);
fprintf('%%\n');
fprintf('仿真时间:');
fprintf('%2.4f',t);
fprintf('s\n');
save r4.mat t p

A15-03





推荐阅读
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
空灵一_一_379
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有