我正在尝试理解并转换为 C Matlab 的粗略频率补偿器,其文档可在此处找到:文档
Matlab 的设计本身基于 IEEE 论文:Carrier Frequency Recovery in All-Digital Modems for Burst-Mode Transmissions
我想翻译基于相关性的 QPSK 调制算法;例如,在 Matlab 中调用此类对象将如下所示:
cfc = comm.CoarseFrequencyCompensator('Modulation', 'QPSK', ...
'Algorithm', 'Correlation-based', ...
'MaximumFrequencyOffset', 12.5e3, ...
'SampleRate',400000);
该文件指出,估计值由下式给出:
在哪里
, 自相关函数,
, 接收信号模型
, 是的复共轭
, 样本数
, 因为对于 QPSK 有四个可能的符号
我的 C 代码:
double complex autocorrelation_func(double complex* input,
double complex* conjinput,
int k, int input_size)
{
double complex auto_corr_sum = 0+0*I;
for(int i = 0 + k; i < input_size; i++ )
{
auto_corr_sum += input[i]*conjinput[i];
}
auto_corr_sum *= (1/(input_size-k));
return auto_corr_sum;
}
double coarse_freq_comp(double complex* input,
double complex* output,
int input_size, int mod_order,
double max_freq_offset,
double sample_rate )
{
int auto_corr_seq = round(sample_rate/max_freq_offset)-1;
int num_samples = (auto_corr_seq+1)/mod_order;
double mult_const = sample_rate/((auto_corr_seq+1)*M_PI);
double complex input_conjugated[input_size];
double complex auto_corr_sum = 0 + 0*I;
double offset_est = 0;
for(int ndx = 0; ndx < input_size; ndx++)
{
input_conjugated[ndx] = conj(input[ndx]);
}
for(int i = 0; i < num_samples; i++)
{
auto_corr_sum += autocorrelation_func(input, input_conjugated, i, input_size);
}
offset_est = mult_const*catan(auto_corr_sum);
return offset_est;
}
问题:
如何将估计值应用于输入信号以获得补偿的输出信号?
我的 C 代码有什么问题?我没有得到与 Matlab 中给定复杂数组相同的估计值。我一定做错了什么,但这对我来说并不明显。