?? main.c
字號:
#include "distortion.h"
#include "function.h"
#include <stdio.h>
#include <math.h>
#include "sincos.h"
#include "vect.c"
main()
{
for(;;)
{
int k,n;
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();
fft();
for(n=0;n<N;n++)
{
data2_real[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 + -