码元速率估计-速率信号法

速率信号法

源自师姐论文《卫星信号频谱监测系统关键技术研究与实现-董雪》

速率信号法的实现

思想

算法思想看论文,这里主要就是注意index那里的细节,记得减1.

没有用czt细化频谱,用了zoomfft来细化,这个方法更加容易工程实现。所有的频谱变换全部只用移动数组就可以,不用去做指数计算。减少计算量。zoomfft原理可以参考了这里

问题:为什么细化后得到的结果不对,和估计的结果值有所偏差,目前还没想明白。可能在计算一些地方的时候的近似运算会导致这个结果。

源代码

% 测试速率信号法
clc
clear all
close all

sr = 1000;
fs = 8e3;

N = sr;

srcData = randsrc(1, N, [0:3]);
modData = pskmod(srcData, 4);
% 脉冲成型滤波器
ipoint = fs / sr;
span = 21;
pointFir = span * ipoint;
upData = upsample(modData, ipoint);
sendPulser = rcosdesign(0.5, span, ipoint, 'sqrt');
sendData = conv(upData, sendPulser);
% 形成发射信号,这里主要减去卷积带来的时延部分,详细请看数字信号处理
sendData = sendData(pointFir/2 + 1 : end - pointFir/2);


% 计算速率信号
for i = 1:length(sendData) %求得速率信号
    if(i= length(res) 的n值
n=n-1;
len=2^n;
% 数据长度改变,分辨率发生变化
df = fs / len;

res=res(1:len);
freResponse = fft(res);
ampResponse = abs(freResponse);
% 显示频谱, 去除0频后,最大的频率分量就是码元速率的粗估计
plot((0:length(ampResponse)-1)*df, ampResponse);
% 去除0频
a = ampResponse(1);
ampResponse(1) = 0;
[~, index] = max(ampResponse);
ampResponse(1) = a;
% 这里有个细节,注意matlab是从1到index开始取得,这样的话就会错过0频,
% 所以我们的index转频率的时候,要记得-1
coarseSymbolRate = (index-1) * df


% 细化频谱
% 设置细化倍数,需要设置为2的n次幂
m = 64;
n0 = len / m;

% 移动右侧频谱到0频的右边
n02 = n0 / 2;
right = index + n02;
tmp = right + 1 - index;
assert(tmp == n02+1);
freResponse(1:tmp) = freResponse(index:right);
% 左侧频谱到负频率
left = index - n02 + 1;
tmp = n02 - 1;
assert(tmp == (index - left));
freResponse((length(freResponse) - tmp+1):end) = freResponse(left:(index-1));
freResponse(right+1:end-tmp) = 0;

% ifft
timeSignal = ifft(freResponse);
% 下采样
downTimeSignal = downsample(timeSignal, m);
downTimeSignalFreqResponse = fft(downTimeSignal, len);
leftFreq = (left-1) * df;
rightFreq = (right-1) * df;
downTimeSignalFreqResponse = circshift(downTimeSignalFreqResponse, floor(len/2));
f = linspace(leftFreq, rightFreq, len);
ampDownTimeSignalFreqResponse = abs(downTimeSignalFreqResponse);
figure()
plot(f, ampDownTimeSignalFreqResponse);
[~, index] = max(ampDownTimeSignalFreqResponse);
df = (rightFreq - leftFreq) / len;
accurateSr = (index - 1) * df + leftFreq
% 频谱图中最大点就是结果

你可能感兴趣的:(matlab)