📄 main.c
字号:
#include "global.c"
#include "math.h"
float outdata[64];
#define pi 3.1415926 //定义常量
#define r 6 //频谱分析的旋转因子,64点的FFT变换
#define N 64 //频谱分析数组长度
float data2_real[N]; //定义FFT变换的实部
float data2_imag[N]; //定义FFT变换的虚部
unsigned int x[N+10]; //定义输入数组
float xin[N];
unsigned int *p_x;
double f;
double fs;
void vect(); //中断向量子程序
void fft(); //FFT变换子程序
extern void input_data();
extern void c54init();
main()
{
for(;;)
{
int k,n,i;
k=0;
c54init();
f=1500.0;
/*
// frequency_sel(); //重新采样
TCR=0x0114;
PRD=331;
fs=1000.0*1000.0/((PRD+1)*5)*100.0;////主频是100MHz
//采样频率设置为60.240KHz
TCR=0x0124;
// input_data();
*/
for(i=0;i<64;i++)
{ xin[i]=sin(3.14*2*i/64)+sin(3*3.14*2*i/64)+sin(5*3.14*2*i/64);
}
fft();
for(n=0;n<N;n++)
{
outdata[n]=sqrt(data2_real[n]*data2_real[n]+data2_imag[n]*data2_imag[n]);
}
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 #004ah,ar0"); //采样74点
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;i++)
xin[i]=(float)x[i]-60.0;
}
void fft()
{
int i,j,k,bfsize,NV2,NM1,a,b,c;
float co_real,co_imag;
for(i=0;i<N;i++)
data2_real[i]=xin[i];
for(i=0;i<N;i++) data2_imag[i]=0;
for(k=0;k<r;k++)
{
for(j=0;j<1<<k;j++)
{
bfsize=1<<(r-k);
for(i=0;i<bfsize/2;i++)
{
a=i+j*bfsize;
b=a+bfsize/2;
c=i*(1<<k);
co_real=data2_real[a]-data2_real[b];
co_imag=data2_imag[a]-data2_imag[b];
data2_real[a]=(data2_real[a]+data2_real[b])/2;
data2_imag[a]=(data2_imag[a]+data2_imag[b])/2;
data2_real[b]=(co_real*cos1[c]-co_imag*sin1[c])/20000.0;
data2_imag[b]=(co_real*sin1[c]+co_imag*cos1[c])/20000.0;
}
}
}
NV2=N/2;NM1=N-1;k=0;
i=j=1;
while(i<=NM1)
{
if(i<j)
{
co_real=data2_real[j-1]; co_imag=data2_imag[j-1];
data2_real[j-1]=data2_real[i-1]; data2_imag[j-1]=data2_imag[i-1];
data2_real[i-1]=co_real; data2_imag[i-1]=co_imag;
}
k=NV2;
while(k<j)
{
j-=k;
k/=2;
}
j+=k;
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -