📄 main.c
字号:
#include "distortion.h"
#include "function.h"
#include <stdio.h>
#include <math.h>
#include "numden.h"
#include "vect.c"
main()
{
for(;;)
{
int k;
k=0;
c54init();
f=1500.0;
TCR=0x0114;
PRD=331;
fs=1000.0*1000.0/((PRD+1)*5)*100.0;////主频是100MHz
//采样频率设置为60.240KHz
TCR=0x0124;
input_data();
iir_filter(); //滤波器
k++;
}
}
void input_data() /* 采样子程序 */
{
int i; //定义变量
p_x=x; //定义指针数组
asm(" RSBX INTM");
IFR=0x0008; //开定时器中断
IMR=0x0008; //屏蔽定时器以外的中断
asm(" pshm ar0"); //保护ar0值
asm(" pshm ar1"); //保护ar1值
asm(" stm #008Ah,ar0"); //采样138点
asm(" mvdm _p_x,ar1"); //采样数据写到数组里
asm("qaz: idle 1"); //等待,直到产生中断
//如果intm=0,响应中断服务程序
//如果intm=1,直接执行下面程序,不进入中断服务程序
asm(" portr 0008h,*ar1+"); //读取I/O地址AD:0008h的数据
asm(" stm #0ffffh,IFR"); //清除所有中断
asm(" banz qaz,*ar0-"); //采样点数未到设定值,跳转继续采样
asm(" popm ar1"); //恢复AR1值
asm(" popm ar0"); //恢复AR0值
asm(" ssbx intm");
IMR=IMR&0xfff7; //屏蔽定时器0中断
for(i=0;i<N+10;i++)
x[i]=x[i+10]&0x00ff; //摒除采样的前10个数据,同时取采样数据低8位有效
for(i=0;i<N+mm;i++)
xin[i]=(float)x[i]-76.0;
}
void iir_filter() //IIR数字滤波
{
unsigned int k;
w[0]=0;
w[1]=0;
v[0]=0;
v[1]=0;
z[0]=0;
z[1]=0;
y[0]=0;
y[1]=0;
for(k=mm;k<N+mm;k++)
{
w[k]=(-(a[0][1]*w[k-1] +a[0][2]*w[k-2])+b[0][0]*xin[k]+b[0][1]*xin[k-1]+b[0][2]*xin[k-2])/a[0][0];
xin[k-2]=xin[k-1];
xin[k-1]=xin[k];
v[k]=(-(a[1][1]*v[k-1] +a[1][2]*v[k-2])+b[1][0]*w[k]+b[1][1]*w[k-1]+b[1][2]*w[k-2])/a[1][0];
w[k-2]=w[k-1];
w[k-1]=w[k];
z[k]=(-(a[2][1]*z[k-1] +a[2][2]*z[k-2])+b[2][0]*v[k]+b[2][1]*v[k-1]+b[2][2]*v[k-2])/a[2][0];
v[k-2]=v[k-1];
v[k-1]=v[k];
y[k]=g*(-(a[3][1]*y[k-1] +a[3][2]*y[k-2])+b[3][0]*z[k]+b[3][1]*z[k-1]+b[3][2]*z[k-2])/a[3][0];
z[k-2]=z[k-1];
z[k-1]=z[k];
y[k-2]=y[k-1];
y[k-1]=y[k];
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -