📄 main.c
字号:
#include "distortion.h"
#include "function.h"
#include <stdio.h>
#include <math.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();
lowpass_filter(); //低通滤波器
//highpass_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 #00c1h,ar0"); //采样193点
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+mm;i++)
x[i]=x[i]&0x00ff; //摒除采样的前10个数据,同时取采样数据低8位有效
for(i=0;i<N+mm;i++)
xin[i]=(float)x[i]-80.0;
}
void lowpass_filter() //低通数字滤波
{
int i,j; //定义变量
float wc; //定义数字滤波器截至频率
wc=2.5*pi*2*1500.0/fs;
for(i=0;i<mm;i++)
{
if(i==(mm-1)/2) h[i]=wc/(pi);
//else h[i]=sin(wc*(i-(mm-1)/2))*(0.54-0.46*cos(2.0*pi*i/(mm-1)))/(pi*(i-(mm-1)/2));
else h[i]=sin(wc*(i-(mm-1)/2))*(0.42-0.50*cos(2.0*pi*i/(mm-1))+0.08*cos(4.0*i*pi/(mm-1)))/(pi*(i-(mm-1)/2));
//else h[i]=sin(wc*(i-(mm-1)/2))*(0.35875-0.48829*cos(2.0*pi*i/(mm-1))+0.14128*cos(4*i*pi/(mm-1))-0.01168*cos(6*pi*i/(mm-1)))/(pi*(i-(mm-1)/2));
//w[i]=0.42-0.5*cos(2*i*pi/(mm-1))+0.08*cos(4*i*pi/(mm-1));
//w[i]=0.50-0.5*cos(2*i*pi/(mm-1));
//w[i]=0.35875-0.48829*cos(2*i*pi/(N-1))+0.14128*cos(4*i*pi/(N-1))-0.01168*cos(6*pi*i/(N-1));
}
for(i=mm;i<(N+mm);i++)
{
data2_imag[i]=((float)xin[i-1]*2.000/256.0)*h[0];
for(j=0;j<mm-1;j++)
{data2_imag[i]=(((float)xin[i-j-1]*2.000/256.0)*h[j+1]+data2_imag[i]);}
data2_imag[i-mm]=data2_imag[i]/20000.0;
}
}
/*高通滤波器*/
void highpass_filter()
{
int i,j;
float wc; //定义数字滤波器截至频率
wc=0.25*pi*2*15000.0/fs;
for(i=0;i<mm;i++)
{
if(i==(mm-1)/2) h[i]=1-wc/(pi);
//else h[i]=sin(wc*(i-(mm-1)/2))*(0.54-0.46*cos(2.0*pi*i/(mm-1)))/(pi*(i-(mm-1)/2));
else h[i]=(sin(pi*(i-(mm-1)/2))-sin(wc*(i-(mm-1)/2)))*(0.42-0.50*cos(2.0*pi*i/(mm-1))+0.08*cos(4.0*i*pi/(mm-1)))/(pi*(i-(mm-1)/2));
//布莱克曼窗
//else h[i]=sin(wc*(i-(mm-1)/2))*(0.35875-0.48829*cos(2.0*pi*i/(mm-1))+0.14128*cos(4*i*pi/(mm-1))-0.01168*cos(6*pi*i/(mm-1)))/(pi*(i-(mm-1)/2));
//w[i]=0.42-0.5*cos(2*i*pi/(mm-1))+0.08*cos(4*i*pi/(mm-1));
//w[i]=0.50-0.5*cos(2*i*pi/(mm-1));
//w[i]=0.35875-0.48829*cos(2*i*pi/(N-1))+0.14128*cos(4*i*pi/(N-1))-0.01168*cos(6*pi*i/(N-1));
}
for(i=mm;i<(N+mm);i++)
{
data2_imag[i]=((float)xin[i-1]*2.000/256.0)*h[0];
for(j=0;j<mm-1;j++)
{data2_imag[i]=(((float)xin[i-j-1]*2.000/256.0)*h[j+1]+data2_imag[i]);}
data2_imag[i-mm]=data2_imag[i]/20000.0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -