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

📄 lms_predict.c

📁 针对TI公司的DSK6711所发展的适应性调适范例
💻 C
字号:

// lms predictor 
// (sinusoidal noise canceller)

#include <stdio.h>
#include <c6x.h>
#include "c6711dsk.h"
#include "lms_predict.h"

// MU      : step size prameter    
// ADPFLEN : LMS adaptive filter length  
// DLYLEN  : delay length
#define MU       0.002         
#define ADPFLEN  80                     
#define DLYLEN   7

float adpf_buf[ADPFLEN];
float adpf_coef[ADPFLEN];
float dly_buf[DLYLEN];     
int   ptr_adpf;
int   ptr_dly;

//================================================================

int main() {                          

  int temp;

  CSR=0x100;        // disable all interrupts

  *(unsigned int *)EMIF_GCR   =0x3300;        // EMIF global control
  *(unsigned int *)EMIF_CE0   =0x30;          // EMIF CE0control
  *(unsigned int *)EMIF_CE1   =0xffffff03;    // EMIF CE1 control, 8bit async
  *(unsigned int *)EMIF_SDCTRL=0x07117000;    // EMIF SDRAM control
  *(unsigned int *)EMIF_SDRP  =0x61a;         // EMIF SDRM refresh period
  *(unsigned int *)EMIF_SDEXT =0x54519;       // EMIF SDRAM extension

  mcbsp0_init();

  temp=*(unsigned int *)IML&0xfc1fffff;  // read interrupt multipexer (IML)
  temp=temp|0x01a00000;                  // INTSEL8 value
  *(unsigned int*)IML=temp;              // set interrupt multiplexer (IML)
  ICR=0xffff;                            // clear all pending interrupt
  IER=IER|0x102;                         // enable NMI & INT8                 

  init_dly();
  init_adpf();        
  
  CSR=CSR|1;                             // enable interrupt (global)   

  // forever loop
  while(1) {
    ;
  }

}

//================================================================

void mcbsp0_init(void) {
  // mcbsp0 initialize
  *(unsigned int *)McBSP0_SPCR=0;         // reset serial port
  *(unsigned int *)McBSP0_PCR =0;         // set pin control reg.;
  *(unsigned int *)McBSP0_RCR =0x10040;   // set rx control reg. one 16 bit data/frame
  *(unsigned int *)McBSP0_XCR =0x10040;   // set tx control reg. one 16 bit data/frame
  *(unsigned int *)McBSP0_DXR =0;         // clear DXR
  *(unsigned int *)McBSP0_SPCR=0x12001;   // setup SP control reg.;
  // codec initialize
  mcbsp0_write(1);
  mcbsp0_write(0x0380);
  mcbsp0_write(1);
  mcbsp0_write(0x0306);
  mcbsp0_write(1);
  mcbsp0_write(0x0400);                   // mic preamp gain=0dB (line input level)
  mcbsp0_write(1);
  mcbsp0_write(0x0586);                   // DAC gain=12dB
  mcbsp0_read();  mcbsp0_read();  mcbsp0_read();  mcbsp0_read();    // waiting....
}

//================================================================

void mcbsp0_write(int out_data) {
  while ((*(unsigned int *)McBSP0_SPCR&0x20000)==0) {
    ;
  };
  *(unsigned int *)McBSP0_DXR = out_data;
}

//================================================================

int mcbsp0_read(void) {
  while ((*(unsigned int *)McBSP0_SPCR&0x2)==0) {
    ;
  };
  return *(unsigned int *)McBSP0_DRR;
}

//================================================================

interrupt void mcbsp0_rx_intr(void) {
  int temp;
  float d, e, x;   

  temp=*(unsigned int *)McBSP0_DRR;               // read A/D           
  d=temp/32000.0;      
  x=dly(d);               
  e=adpf(x, d);
  temp=e*32000.0;           
  *(unsigned int *)McBSP0_DXR=temp&0xfffe;        // write D/A
}

//================================================================

void init_adpf(void) {
  int i;

  ptr_adpf=0;
  for (i=0; i<ADPFLEN; i=i+1) {
    adpf_buf[i]=0.0;
    adpf_coef[i]=0.0;
  }                  
}

//================================================================

float adpf(float x, float d) {
  float y;
  float e;
  int i;
  int iptr;                 
               
  adpf_buf[ptr_adpf]=x;
  ptr_adpf=(ptr_adpf+1)%ADPFLEN;

  iptr=ptr_adpf;
  y=0.0;
  for (i=0; i<ADPFLEN; i=i+1) {
    y=y+adpf_buf[iptr]*adpf_coef[i];
    iptr=(iptr+1)%ADPFLEN;
  }

  iptr=ptr_adpf;
  e=d-y;
  for (i=0; i<ADPFLEN; i=i+1) { 
    adpf_coef[i]=adpf_coef[i]+2*MU*e*adpf_buf[iptr];
    iptr=(iptr+1)%ADPFLEN;
  }
  
  return e;
}

//================================================================

void init_dly(void) {
  int i;

  ptr_dly=0;
  for (i=0; i<DLYLEN; i=i+1) {
    dly_buf[i]=0.0;
  }
}

//================================================================

float dly(float in) {
  float out;

  out=dly_buf[ptr_dly];
  dly_buf[ptr_dly]=in;
  ptr_dly=(ptr_dly+1)%DLYLEN;
  return out;
}

⌨️ 快捷键说明

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