不同板卡间的同步序列出峰问题

简述

使用两块不同板卡,对前导ZC序列一收一发,在接收板上做本地相关,结果显示相关性恶化,目前推测为射频滤波器问题。

异常情况

目前有一套FMQL45T900+CX9261s的板卡,运行OFDM波形进行灵敏度测试。由于只有一套,且收发隔离度仅有约50dB,导致无法在自回环的情况下进行测试,在此情况下,使用另一套ZYNQ7035+AD9361的板卡进行发送,FMQL板卡进行接收。
测试中发现FMQL板卡在同步模块未正确同步到发送的前导序列,该发送帧丢失导致后续的接收处理不运行。
但在ZYNQ板卡或FMQL板卡上进行自收自发皆能正确同步到序列的位置。

在帧设计中,前导有4段64长度的ZC序列(由67长度的ZC序列截取得到)进行帧同步,理想情况下会出现4个同步峰,如图1所示:

图1 理想情况下同步峰情况

图1 理想情况下同步峰情况


通过ila截取一帧长度的数据,查看其前导位置,存在4*64长度的前导序列,如图2所示:

图2 接收到的前导序列

图2 接收到的前导序列


对该接收信号进行处理,得到同步情况的如图3所示,可见仅出现了3个同步峰,且同步峰位置延迟了32位。

图3 接收序列的相关情况

图3 接收序列的相关情况

测试验证

使用一套9361板卡发送,一套9361板卡与一套9261板卡接收,使用三通头连接,ila同时触发,接收到的前导信号如图4所示(位宽不同,进行了归一化):

图4 不同板卡接收前导

图4 不同板卡接收前导


两个接收信号与本地序列的相关如图5所示:

图5 (a) 9361接收信号与本地相关

图5 (a) AD9361接收信号与本地相关

图5 (b) 9261接收信号与本地相关

图5 (b) CX9261S接收信号与本地相关


可能是板卡的滤波器配置原因导致的相关峰问题。
对9361和9261的接收前导分别做FFT,并查看从9361接收信号变换至9261接收信号的幅度与相位响应,同时对两边的接收FIR滤波器做相同的处理,查看响应是否一致,如图6所示:

图6 接收信号变换的幅频响应与滤波器变换的幅频响应

图6 接收信号变换的幅频响应与滤波器变换的幅频响应


除FIR滤波器外,可能前级HBF滤波器也有影响,仍需要验证。但暂无9261s的HBF滤波器系数,后续再验证。

更新1-插值与抽取倍数互质

目前的AD9361使用16倍插值和16倍抽取,CX9261S使用16倍插值和4倍抽取,求助后得知收发芯片中插值倍数和抽取倍数最好保持互质,否则会造成频谱混叠的情况。修改9261S的抽取倍数为3倍测试,序列的相关情况如图7所示。

图7 修改9261S抽取倍数后的相关情况

图7 修改9261S抽取倍数后的相关情况


图7中可见序列出峰虽然不明显,但是峰值间隔由64变为48,降为原先的3/4;虽然插值抽、取倍的数互质后情况恶化,但应该能说明该现象和前端的HBF滤波器有关。

更新2-插值抽取仿真与相关

在无9261s的HBF系数情况下,对插值和抽取进行仿真,查看各级频谱如图8所示,和原序列做相关如图9所示:

图8 序列各级插值和抽取仿真频谱

图8 序列各级插值和抽取仿真频谱

图9 序列各级插值和抽取仿真相关

图9 序列各级插值和抽取仿真相关


从图8可见带内频谱与上采样基本一致;从图9可见相关性仍保持良好,但未做抽取时,相关结果与测试情况有些类似,可能与该方面相关,还需验证。

代码如下,在做相关时为了出峰间隔将序列4倍周期化,画频谱时直接使其等于64位本地序列。

local_pream = local;
% local_pream = repmat(local,1,4);

DAC_fs = fs*16;
ADC_fs = fs*4;

tx_fir = AD9361_tx_fir./2^16;
HB1 = [-53 0 313 0 -1155 0 4989 8192 4989 0 -1155 0 313 0 -53]./2^13;
HB2 = [-9 0 73 128 73 0 9]./2^7;
HB3 = [1 2 1]./2;

local_up2 = resample(local_pream,2,1,tx_fir);
local_up4 = resample(local_up2,2,1,HB1);
local_up8 = resample(local_up4,2,1,HB2);
local_up16 = resample(local_up8,2,1,HB3);

tx_length = length(local_up16);

T_tx = (1:tx_length)./DAC_fs;
T_rx = 1/ADC_fs:1/ADC_fs:T_tx(end);

rx_idx = 1:4:tx_length;

rx_local = local_up16(rx_idx);
rx_local_down2 = resample(rx_local,1,2);
rx_local_down4 = resample(rx_local_down2,1,2,CX9261_rx_fir(1:64));


local_length = length(local_pream);
local_index = (-local_length/2:local_length/2-1)/local_length*fs;
local_am = abs(fftshift(fft(local_pream)));
tiledlayout(2,2, 'TileSpacing', 'compact', 'Padding', 'compact');
nexttile;
plot(local_index,local_am);
title('原始序列幅度谱');

local_up16_length = length(local_up16);
local_up16_index = (-local_up16_length/2:local_up16_length/2-1)/local_up16_length*fs*16;
local_up16_am = abs(fftshift(fft(local_up16)));
nexttile;
plot(local_up16_index,local_up16_am);
xlim([-fs/2 fs/2]);
title('上采样16倍的ADC发送序列幅度谱');

rx_local_length = length(rx_local);
rx_local_index = (-rx_local_length/2:rx_local_length/2-1)/rx_local_length*fs*4;
rx_local_am = abs(fftshift(fft(rx_local)));
nexttile;
plot(rx_local_index,rx_local_am);
xlim([-fs/2 fs/2]);
title('DAC接收序列幅度谱');

rx_local_down4_length = length(rx_local_down4);
rx_local_down4_index = (-rx_local_down4_length/2:rx_local_down4_length/2-1)/rx_local_down4_length*fs;
rx_local_down4_am = abs(fftshift(fft(rx_local_down4)));
nexttile;
plot(rx_local_down4_index,rx_local_down4_am);
xlim([-fs/2 fs/2]);
title('DAC下采样后序列幅度谱');

figure;
tiledlayout(2,2, 'TileSpacing', 'compact', 'Padding', 'compact');
nexttile;
[local_val,local_lag] = xcorr(local_pream,local);
plot(local_lag,abs(local_val));
title('原序列相关');

nexttile;
[local_up16_val,local_up16_lag] = xcorr(local_up16,local);
plot(local_up16_lag,abs(local_up16_val));
title('原序列上采样16倍后相关');

nexttile;
[rx_local_val,rx_local_lag] = xcorr(rx_local,local);
plot(rx_local_lag,abs(rx_local_val));
title('接收序列相关');

nexttile;
[rx_local_down4_val,rx_local_down4_lag] = xcorr(rx_local_down4,local);
plot(rx_local_down4_lag,abs(rx_local_down4_val));
title('接收序列下采样4倍后相关');

仿真验证发送使用16倍上采样,接收使用3倍降采样的情况。对中间的信号进行3/16采样实现后,再在基带进行3倍下采样。

图10 接收端3倍下采样结果

图10 接收端3倍下采样结果


从图10可见对频谱和峰值并无明显影响,不能说明图7的测试现象,还存在其它原因需要查找。

更新3 仿真与实际接收序列波形对比

对比9361仿真的发送、接收与实际接收序列的时域波形如图11所示,幅频、相频谱如图12所示:

图11 序列时域波形

图11 仿真与9361接收序列时域波形

图12 序列频域波形

图12 仿真与9361接收序列频域波形

从图11、12中可见AD9361仿真与实际接收的波形幅度谱较相似,相位谱有畸变,相位差值如图13所示:
图13 仿真和实际接收序列的相位差值

图13 仿真和9361接收序列的相位差值

从图13中可见,相位的变化主要是由群延时造成的,因此可以认为仿真结果与实际接收结果相似。

% local_pream = local;
local_pream = repmat(local,1,4);

DAC_fs = fs*16;
ADC_fs = fs*4;

tx_fir = AD9361_tx_fir./2^16;
HB1 = [-53 0 313 0 -1155 0 4989 8192 4989 0 -1155 0 313 0 -53]./2^13;
HB2 = [-9 0 73 128 73 0 9]./2^7;
HB3 = [1 2 1]./2;

local_up2 = resample(local_pream,2,1,tx_fir);
local_up4 = resample(local_up2,2,1,HB1);
local_up8 = resample(local_up4,2,1,HB2);
local_up16 = resample(local_up8,2,1,HB3);

rx_fir = AD9361_rx_fir./2^16;
rx_HB1 = [-8 0 42 0 -147 0 619 1013 619 0 -147 0 42 0 -8]./2^11;
rx_HB2 = [-9 0 73 128 73 0 9]./2^8;
rx_HB3 = [1 4 6 4 1]./2^4;

local_HB3 = resample(local_up16,1,2,rx_HB3);
local_HB2 = resample(local_HB3,1,2,rx_HB2);
local_HB1 = resample(local_HB2,1,2,rx_HB1);
local_rx = resample(local_HB1,1,2,rx_fir);
tiledlayout(3,2, 'TileSpacing', 'compact', 'Padding', 'compact');
nexttile;
plot(real(local_pream));
title('仿真发送的序列实部');
nexttile;
plot(imag(local_pream));
title('仿真发送的序列虚部');
nexttile;
plot(real(local_rx));
title('仿真接收的序列实部');
nexttile;
plot(imag(local_rx));
title('仿真接收的序列虚部');
nexttile;
plot(imag(msg_zynq1(frame_start_local:frame_start_local+64*4-1)));
title('实际接收的序列实部');
nexttile;
plot(imag(msg_zynq1(frame_start_local:frame_start_local+64*4-1)));
title('实际接收的序列虚部');

local_rx_fft = fftshift(fft(local_rx(1:64)));
msg_zynq1_fft = fftshift(fft(msg_zynq1(frame_start_local:frame_start_local + 64 -1)));
fft_length = 64;
f = (-fft_length/2 : fft_length/2-1)/fft_length*fs;

tiledlayout(2,2, 'TileSpacing', 'compact', 'Padding', 'compact');
nexttile;
plot(f,10*log10(abs(local_rx_fft)));
title('仿真接收序列幅频谱');
nexttile;
plot(f,angle(local_rx_fft)./pi);
title('仿真接收序列相频谱');
nexttile;
plot(f,10*log10(abs(msg_zynq1_fft)));
title('实际接收序列幅频谱');
nexttile;
plot(f,angle(msg_zynq1_fft)./pi);
title('实际接收序列相频谱');

angle_diff = (angle(msg_zynq1_fft) - angle(local_rx_fft))./pi;
%化到(-pi,pi)区间内,并对异常值进行处理
angle_diff(angle_diff >= 1) = angle_diff(angle_diff >= 1) - 1;
angle_diff(angle_diff <= -1) = angle_diff(angle_diff <= -1) + 1;
angle_diff([11 15 20 24 26 27 49]) = angle_diff([11 15 20 24 26 27 49]) - 1;
angle_diff([32 34 42]) = angle_diff([32 34 42]) + 1;
figure;
plot(angle_diff);
title('仿真和实际接收的相位差值');

对9261接收的数据做相同的处理,其幅频谱、相频谱如图14所示,相位差值如图15所示.

图14 9261S序列频域波形

图14 仿真与9261S接收序列频域波形

图15 9261S序列相位差

图15 9261S接收序列相位差

从图14、15中可见9261S接收的幅度谱与仿真相似,但群时延非常数,造成了相关性恶化的问题,还需要具体探查是何原因造成的。
图13、图15对比的是实际接收信号与仿真接收信号的相位差,与发送信号的相位差如图16所示:

图16 发送序列与接收信号的相位差

图16 发送序列与接收信号的相位差


从图16中可见,理想发送序列与AD9361的接收群时延为常数,与CX9261S的接收群时延非常数。

使用CX9261S自回环收序列的频域波形、与发送序列的相位差如图17、18所示。

图17 仿真序列频域波形与CX9261S自发自收序列频域波形

图17 仿真序列频域波形与CX9261S自回环收序列频域波形

图18 CX9261S自回环收序列与发送序列相位差

图18 CX9261S自回环收序列与发送序列相位差

从图18中可见,CX9261S自发自收的群延时为常数,因此序列可以有良好的相关性。

posted @ 2025-03-26 14:48  吃饱就睡yess  阅读(64)  评论(0)    收藏  举报