首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将matlab的AGC函数转换为C

将matlab的AGC函数转换为C
EN

Stack Overflow用户
提问于 2019-11-15 02:21:11
回答 2查看 782关注 0票数 0

我试图从Matlab的通信工具箱中翻译自动增益控制块。这是文件,但相关部分概述如下:

方框图

,其中

这是我写的代码:

代码语言:javascript
运行
复制
double AGC_Detector(int N, float complex* input, int ndx)
{
   double samp = 0;
   for(int i = ndx*N; i < (ndx+1)*(N-1); i++)
   {
       samp += cabs(input[i])*cabs(input[i]);
   }
   samp = samp/N;
   return samp;
}

void use_AGC(float complex* input, 
             float complex* output, 
             double step, 
             double desired_pwr, 
             int avrg_len, 
             int max_pwr, 
             int len)
{
   double z = 0;
   double e = 0;
   double g = 0;
   double prev_g = 0;
   double dtctr = 0;

   for(int i = 0; i < len; i++)
   {
       dtctr = AGC_Detector(avrg_len,input,i);
       z = dtctr * exp(2*prev_g);
       e = desired_pwr - log(z);
       g = prev_g + step*e;
       if(g > max_pwr)
       {
           g = max_pwr;
       }
       prev_g = g;
       output[i] = input[i] * exp(prev_g);
   }
}

但是,在Matlab中,对于相同的值,我没有得到相同的输出。我做错了什么?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-20 03:24:18

我想通了。下面的代码为给定的一组复杂数据提供了与matlab相同的输出。

代码语言:javascript
运行
复制
double AGC_Detector(double complex input, double* sum, double state[], unsigned int* idx, int N)
{
    unsigned int first;
    unsigned int nth;
    double output;
    double val = cabs(input)*cabs(input);
    *sum += val;
    output = (*sum)*(1.0/N);
    *sum -= state[*idx-1];

    if(*sum < 0.0){*sum = 0.0;}

    state[*idx-1] = val;
    first = *idx;
    nth = first + 1;

    if(nth < first){nth = 0xFFFFFFFF;}

    *idx = nth;

    if(*idx > N-1){*idx = 1;}

    return output;
}


void use_AGC(double complex* input, double complex* output, double step, double desired_pwr, int avrg_len, int max_pwr, int len)
{
    unsigned int idx = 1;
    int filt_len = avrg_len-1;
    double K = step;
    double g = 0;
    double sum = 0;
    double dtctr = 0;
    double filterState[filt_len];

    for(int i = 0; i < filt_len; i++){filterState[i] = 0;}

    for(int i = 0; i < avrg_len; i++)
    {
        dtctr = AGC_Detector(input[i], &sum, filterState, &idx, avrg_len);
        output[i] = input[i] * exp(g);
        dtctr = log(dtctr);
        g += K*(desired_pwr - (dtctr + 2.0*g));
        if(g > max_pwr){g = max_pwr;}
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-11-15 13:13:25

也许这不是唯一的错误,但我注意到,在Matlab文档中,AGC检测器的和从ndx*N(ndx+1)N-1,但在C代码中,从ndx*N(ndx+1)(N-1)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58869440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档