m基带信号的软同步接收系统matlab性能仿真,对比统计同步,BTDT,CZT,ZOOM-FFT以及频谱细化法

58 阅读5分钟

1.算法仿真效果

matlab2022a仿真结果如下:

93967d3f430cea0d822fc05e51f29ec6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

统计同步

3c4be51018272b9218df0665a31f522d_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

BTDT

8ba4a7727d8e83c159488ac4cec9bba4_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

CZT

eac7b62911cd40a36cd4d90a10e11e02_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

ZOOM-FFT

 

59476777e3e3377c7e95d71a5fd17a4a_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg

 

频谱细化法

903278ba5ffc654deea6c60f84dac753_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.jpg  

2.算法涉及理论知识概要

        基带信号的软同步接收系统是通信系统中非常重要的一部分。在多种通信系统中,如无线通信、光纤通信等,接收到的信号一般都是基带信号。为了有效地处理这些信号,需要对其进行同步接收。这里的“同步”指的是将接收到的信号与发送端的信号在时间上对齐。在多种基带信号同步接收技术中,以下五种方法较为常见:统计同步、BTDT、CZT、ZOOM-FFT以及频谱细化法。下面我们来详细介绍这些方法的原理和数学公式。

 

        统计同步:这种方法是基于信号统计特性的同步算法。其基本原理是:在接收到的信号序列中,通过寻找最有可能的抽样点位置来实现信号同步。具体来说,假设接收到的信号为y(t),先对其进行滑动窗口处理(窗口长度为N),得到一系列的子序列y(n), n=tN。接着对每个子序列进行能量计算,得到En=Σ|y(n)|²。选择具有最大能量的子序列作为同步点,即选取t0使得Emax=maxEn。用t0乘以N,即可得到信号同步点的时间。

 

        BTDT:BTDT(基于时域的自适应阈值)是一种在时域上对信号进行同步跟踪的方法。其基本原理是:通过对接收到的信号进行自适应阈值处理,得到一个时域的门限,然后利用这个门限对信号进行二值化,进而找到信号的同步点。具体来说,假设接收到的信号为y(t),首先计算其能量E=Σ|y(t)|²,然后根据阈值公式T=αE计算阈值(其中α为常数)。接着对信号进行二值化处理,即当|y(t)|²>T时,令y(t)=1;当|y(t)|²<T时,令y(t)=0。最后通过滑动窗口(窗口长度为N)找到连续为1的子序列,该子序列的起点即为信号的同步点。

 

        CZT:CZT(基于变换域的自适应阈值)是一种在变换域上对信号进行同步跟踪的方法。其基本原理是:通过对接收到的信号进行快速傅里叶变换(FFT),将其从时域转换到频域,然后在频域上对信号进行阈值处理,进而找到信号的同步点。具体来说,假设接收到的信号为y(t),首先对其进行FFT处理,得到频域表示Y(f)。接着根据阈值公式T=αE(f)计算每个频率分量的阈值(其中α为常数,E(f)为每个频率分量的能量)。对每个频率分量进行二值化处理,即当|Y(f)|²>T时,令Y(f)=1;当|Y(f)|²<T时,令Y(f)=0。最后将所有频率分量的二值化结果进行逆FFT处理,得到时域上的二值化信号。通过滑动窗口找到连续为1的子序列,该子序列的起点即为信号的同步点。

 

        ZOOM-FFT:ZOOM-FFT(变步长快速傅里叶变换)是一种加速FFT运算的方法。其基本原理是:通过对FFT运算进行变步长优化,使得在频率较高或较低的部分使用较小的窗口大小(即步长),而在频率适中的部分使用较大的窗口大小,以此来提高FFT运算的速度和精度。具体来说,假设接收到的信号为y(t),首先对其进行分段处理,将整个信号分成若干段(每段长度为N),然后在每段上分别进行FFT运算。对于频率较低的部分(即前几段),使用较小的窗口大小(即步长),对于频率较高的部分(即后几段),使用较大的窗口大小。通过这种方式,可以在保证精度的同时提高运算速度。

 

       频谱细化法:频谱细化法是一种通过对接收到的信号进行多次频谱分析,找到最接近真实频率的谱峰位置来实现信号同步的方法。其基本原理是:假设接收到的信号为y(t),先对其进行傅里叶变换得到频谱Y(f),然后在一定频率范围内对频谱进行多次细化分析(如采用FFT或其他快速算法),找到最接近真实频率的谱峰位置。该谱峰位置对应的频率即为信号的同步点。

 

3.MATLAB核心程序 `..........................................................................

b             = hanning(127);

msg           = filter(b,1,msg2);

msg           = msg/max(msg);

msg(1:1024)   = [];

%调制

ff            = cos(2pifreqcarrier.*[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`