⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 marburg.c

📁 AR模型参数的FORTRAN和C两种语言的几种算法(BURG
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "msp.h"
void marburg(complex x[],complex a[],complex ef[],complex eb[],
int n,int ip,float *ep,int *ierror)
{
/*----------------------------------------------------------------------
   Routine marburg: To estimate the AR parameters by Burg algorithm.
   Input Parameters:
          n  : Number of data samples
          ip : Order of autoregressive process
          x  : Array of complex data samples x(0) through x(n-1)
   Output Parameters:
         ep  : Real variable representing driving noise variance
          a  : Array of complex AR parameters a(0) to a(ip)
    ierror=0 : No error
          =1 : ep<=0 .

        ef   : complex work array. ef[0] to ef[n-1]
        eb   : complex work array. eb[0] to eb[n-1]
                                       in chapter 12
----------------------------------------------------------------------*/
        complex sum;
        int i,m;
        float r0,den;
        *ierror=1;
        a[0].real=1.;
        a[0].imag=0.0;
        r0=0.;
        for(i=0;i<n;i++)
           {r0+=pow(mabs(x[i]),2);
            ef[i].real=x[i].real;
            ef[i].imag=x[i].imag;
            eb[i].real=x[i].real;
            eb[i].imag=x[i].imag;
            }
        den=0.0;
        r0/=(float)(n);
        sum.real=0.0;
        sum.imag=0.0;
        for(i=1;i<n;i++)
           {den+=pow(mabs(ef[i]),2)+pow(mabs(eb[i-1]),2);
            sum.real+=ef[i].real*eb[i-1].real+ef[i].imag*eb[i-1].imag;
            sum.imag+=-ef[i].real*eb[i-1].imag+ef[i].imag*eb[i-1].real;
            }
        sum.real*=-2.;
        sum.imag*=-2.;
        a[1].real=sum.real/den;
        a[1].imag=sum.imag/den;
        *ep=r0*(1.-pow(mabs(a[1]),2));
        for(i=n-1;i>=1;i-=1)
           {sum.real=ef[i].real;
            sum.imag=ef[i].imag;
            ef[i].real=sum.real+a[1].real*eb[i-1].real-
                                a[1].imag*eb[i-1].imag;
            ef[i].imag=sum.imag+a[1].real*eb[i-1].imag+
                                a[1].imag*eb[i-1].real;
            eb[i].real=eb[i-1].real+a[1].real*sum.real+
                                a[1].imag*sum.imag;
            eb[i].imag=eb[i-1].imag+a[1].real*sum.imag-
                                a[1].imag*sum.real;
            }
/*-------------------------------------------------------------------*/
        for(m=2;m<=ip;m++)
           {sum.real=0.0;
            sum.imag=0.0;
            for(i=m;i<n;i++)
               {sum.real+=ef[i].real*eb[i-1].real+
                          ef[i].imag*eb[i-1].imag;
                sum.imag+=-ef[i].real*eb[i-1].imag+
                          ef[i].imag*eb[i-1].real;
                }
            sum.real*=-2.;
            sum.imag*=-2.;
            den=(1.-pow(mabs(a[m-1]),2))*den-
                 pow(mabs(ef[m-1]),2)-pow(mabs(eb[n-1]),2);
            a[m].real=sum.real/den;
            a[m].imag=sum.imag/den;
            (*ep)*=1.-pow(mabs(a[m]),2);
            if(*ep<=0) return;
            for(i=1;i<m;i++)
               {x[i].real=a[i].real+a[m].real*a[m-i].real+
                          a[m].imag*a[m-i].imag;
                x[i].imag=a[i].imag-a[m].real*a[m-i].imag+
                          a[m].imag*a[m-i].real;
                }
            for(i=1;i<m;i++)
               {a[i].real=x[i].real;
                a[i].imag=x[i].imag;
                }
            for(i=n-1;i>=m;i-=1)
               {sum.real=ef[i].real;
                sum.imag=ef[i].imag;
                ef[i].real=sum.real+a[m].real*eb[i-1].real-
                           a[m].imag*eb[i-1].imag;
                ef[i].imag=sum.imag+a[m].real*eb[i-1].imag+
                           a[m].imag*eb[i-1].real;
                eb[i].real=eb[i-1].real+a[m].real*sum.real+
                           a[m].imag*sum.imag;
                eb[i].imag=eb[i-1].imag+a[m].real*sum.imag-
                           a[m].imag*sum.real;
                }
          }
        *ierror=0;
        return;
        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -