Archived
50 lines
1.6 KiB
Matlab
50 lines
1.6 KiB
Matlab
function [dataOut, fdTarget, samplePosTarget] = suqareShapeFreqEst(dataIn, interp, fs, fmin, fmax, fd)
|
|
%suqareShapeFreqEst - 利用星座图的集中程度在一定频率范围内使用频率步进估计方波成形信号的频偏
|
|
%
|
|
% data - input complex data, row vector
|
|
% dataLen - data length
|
|
% interp - interpolation rate
|
|
% fs - sampling rate, in Herts
|
|
% fmin - minimum estimation frequency, in Herts
|
|
% fmax - maximum estimation frequency, in Herts
|
|
% fd - estimation frequency step, in Herts
|
|
|
|
% dimension
|
|
[dataLen,channelNum] = size(dataIn);
|
|
|
|
freqList = fmin:fd:fmax;
|
|
freqNum = length(freqList);
|
|
varRecord = zeros(freqNum,interp);
|
|
|
|
dataOut = zeros(dataLen/interp,channelNum);
|
|
fdTarget = zeros(channelNum,1);
|
|
samplePosTarget = zeros(channelNum,1);
|
|
|
|
for channel = 1:channelNum
|
|
|
|
for freq = 1:freqNum
|
|
|
|
% carrier
|
|
cxr = exp(-1i*2*pi*freqList(freq)/fs*(0:dataLen-1)');
|
|
|
|
% apply frequency shift onto input data
|
|
seqRx = dataIn(:,channel).*cxr;
|
|
|
|
for samplePos = 0:interp-1
|
|
seqRxDown = downsample(seqRx,interp,samplePos); % 下采样
|
|
seqRxDownQuaterOne = abs(real(seqRxDown)) + 1i*abs(imag(seqRxDown)); % 集中到第一象限
|
|
varRecord(freq,samplePos+1) = var(seqRxDownQuaterOne);
|
|
end
|
|
|
|
end
|
|
|
|
[fdIndex, samplePosIndex] = find(varRecord==min(min(varRecord)));
|
|
fdTarget(channel) = freqList(fdIndex);
|
|
samplePosTarget(channel) = samplePosIndex-1;
|
|
|
|
cxrTarget = exp(-1i*2*pi*fdTarget(channel)/fs*(0:dataLen-1)');
|
|
seqRxTarget = dataIn(:,channel).*cxrTarget;
|
|
dataOut(:,channel) = downsample(seqRxTarget,interp,samplePosTarget(channel));
|
|
end
|
|
|
|
end |