Matlab的粗调频率补偿功能的理解与转换

信息处理 matlab 离散信号 数字通信 C 模拟链接
2022-02-02 02:22:01

我正在尝试理解并转换为 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);

该文件指出,估计值由下式给出:

estimate=fsampπ(L+1)arg{k=1LR(k)}

在哪里

L=round(fsampfmax)1

R(k)=1Nki=k+1Nririk, 自相关函数,

rk=ej(2πΔfkTs+θ), 接收信号模型

rk=ej(2πΔfkTs+θ), 是的复共轭rk

N=L+1M, 样本数

M=4, 因为对于 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 中给定复杂数组相同的估计值。我一定做错了什么,但这对我来说并不明显。

0个回答
没有发现任何回复~