📄 lms_predict.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 + -