📄 iir.c
字号:
/*******************************************************************/
#include "exp1_2407.h"
#include "math.h"
#define pi 3.1415927
/*******************************************************************/
int px[256];
int py[256];
double fs,nlpass,nlstop,nhpass,nhstop,a[3],b[3],x,y;
void sys_ini() //系统初始化子程序
{
asm(" setc INTM"); //禁止所有中断
asm(" clrc SXM"); //抑制符号位扩展
asm(" clrc OVM"); //累加器中结果正常溢出
* SCSR1=0x81FE; //配置时钟锁相为4倍频CLKOUT=4*7.3728=29.4912M,使能外部模块
* WDCR=0x00EF; //禁止看门狗
WSGR=0x0049; //io、ram、program都设为1等待读写
* IFR=0xFFFF; //清除所有中断标志,"写1清0"
}
void adc_ini() //ADC初始化子程序
{
* ADCTRL1=0x25C0; //仿真器挂起时,完成最后一次ad,start_stop运行模式,
//高中断优先级,双排序模式,禁用其他模式
* ADCTRL2=0x0202; //禁用中断模式,清中断标志
* MAXCONV=0x0000; //启用排序器1,最大转换数为1
* CHSELSEQ1=0x0000; //选择模拟输入通道为0通道
}
void read_ad()
{
int a;
* ADCTRL2|=0x2000; //软件启动eoc1--ad转换器
for(a=0;a<256;a++)
{
px[a]=(* RESULT0>>6); //读出ad结果
}
return;
}
interrupt void nothing()
{
return;
}
void biir2lpdes(double fs, double nlpass, double nlstop, double a[], double b[])
{
int i,u,v;
double wp,omp,gsa,t;
wp=nlpass*2*pi;
omp=tan(wp/2.0);
gsa=omp*omp;
for (i=0; i<=2; i++)
{
u=i%2;
v=i-1;
a[i]=gsa*pow(2,u)-sqrt(2)*omp*v+pow(-2,u);
}
for (i=0; i<=2; i++)
{ u=i%2;
b[i]=gsa*pow(2,u);
}
t=a[0];
for (i=0; i<=2; i++)
{ a[i]=a[i]/t;
b[i]=b[i]/t;
}
}
int main(void)
{
int j,k=0;
int n,x_ad,y_da;
double w2,w1,w0;
w2=w1=w0=0.0;
sys_ini();
adc_ini();
for (;;)
{
fs=16000;
/* IIR LP filter */
nlpass = 0.02;
nlstop = 0.22;
biir2lpdes(fs,nlpass,nlstop,a,b);
for (j=0; j<=4; j++)
{
read_ad();
for (n=0; n<=255; n++)
{
x_ad = px[n];
x = x_ad/1023.0;
w2=x-a[1]*w1-a[2]*w0;
y=b[0]*w2+b[1]*w1+b[2]*w0;
w0=w1;
w1=w2;
y_da=(int)(y*1023.0);
py[n] = y_da;
}
k=k;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -