⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 简易频谱分析.c

📁 音频信号分析仪设计原码
💻 C
📖 第 1 页 / 共 2 页
字号:
  for(i=0;i<256;i++)
     {
     dispbuf2[i]=dispbuf1[i];
     dispbuf1[i]=0;
     }
else
  for(i=0;i<256;i++)
     {
     dispbuf1[i]=dispbuf2[i];
     dispbuf2[i]=0;
     }
}

//读取fstart到fend,步进为step的数据,如果type=1;写入dispbuf1 
uint readdate(uint fstart,uint fend,uint estep,uint type)
{
uint i,j;
uint max;
uint maxbuf1;
uint maxbuf2=0;
uint dstep;
if(aotostep)
   {
   estep=(2*fd/255);
   dstep=1;
   }
else
   {
   dstep=2*fd;
   dstep/=step;
   }
writestatus(1);//启动
for(i=fstart,j=0;i<fend;i+=estep,j+=dstep)
   {
    sendfreq(i);
    while(readstatus())
      clrWatchDog();
    maxbuf1=readonedate(j);
    if(maxbuf2<maxbuf1)
       {
        maxbuf2=maxbuf1;
        max=j;
       }
    if(type)
       dispbuf1[j]=maxbuf1;
    }
return max;    
}

void sendfreq(uint date)//写入频率控制字
{
float buf=(float)(date*60e6);
date=(uint)buf/2e27;
PA=date;
writedate();
}

uint readstatus()//读FPGA状态
{
if(readonedate(0x100))
  return 1;
else
  return 0;
}

void writestatus(uint date)//写FPGA状态
{
PA=0x101;//复位启动
alechontrol();
PA=date;
writedate();
}

void initIO()//初始化端口
{
ioawrite();
iobinit();
}

void ioawrite()//A设置为输出
{
PADIR=0xffff;
PAATB=0xffff;
PA=0xffff;
}

void ioaread()//A设置为输入 
{
PADIR=0x0000;
PAATB=0x0000;
PA=0xffff;
}

void iobinit()
{
PBDIR=0xdf0f;//接键盘和控制端口
PBATB=0xdf0f;
PB=0xffff;
}

uint readonedate(uint addr)//从FPGA读入一个数据
{
uint buf;
PA=addr;
alechontrol();
ioaread();
readedate();
buf=PA;
ioawrite();
return (buf&0xff);              
}

void displaycrt()//示波器显示
{
uint i;
for(i=0;i<256;i++)
  {
   PA=i;
   writexchannel();
   if(bdallow)
     PA=dispbuf1[i];
   else
     PA=(dispbuf1[i]*255/bufmax);
   writeychannel();
  }
}

void delayxms(uint x)
{
uint y;
while(x--)
 {
  y=0xff;
  while(y--)
     clrWatchDog();
 }
}

void initdispdate()
{
dispnumber(addr[0],0,fobuf[0]);
dispnumber(addr[1],0,fobuf[1]);
dispnumber(addr[2],0,fobuf[2]);
dispnumber(addr[3],0,fobuf[3]);
dispnumber(addr[4],0,fobuf[4]);
dispnumber(addr[0],1,fdbuf[0]);
dispnumber(addr[1],1,fdbuf[1]);
dispnumber(addr[2],1,fdbuf[2]);
dispnumber(addr[3],1,fdbuf[3]);
dispnumber(addr[4],1,fdbuf[4]);
dispnumber(addr[0],2,fsbuf[0]);
dispnumber(addr[1],2,fsbuf[1]);
dispnumber(addr[2],2,fsbuf[2]);
dispnumber(addr[3],2,fsbuf[3]);
dispnumber(addr[4],2,fsbuf[4]);
dispwavetype(hzaddr,0,wavetype);
}

void key()
   {
   uint i=0;
   uint j;
   uint buf;
   uint tmp;
   i=0;
   clrline1;
   readkey;
   if(j!=nokey)
     {
      delayxms(40);
      buf=j&0xf000;
      tmp=j;
      while(j!=nokey)
       {
        PB|=nokey;
        readkey;
        clrWatchDog();
        if(tmp!=j)
            break;
       }
      if(j==nokey)
        keybuf=getkey(buf,i);
      else 
        keybuf=0xff;
     }
   else
     {//4
      i++;
      setline1;
      clrline2;
      readkey;
      if(j!=nokey)
         {
         delayxms(40);
         buf=j&0xf000;
         tmp=j;
         while(j!=nokey)
           {
           PB|=nokey;
           readkey;
           clrWatchDog();
           if(tmp!=j)
              break;
           }
           if(j==nokey)
             keybuf=getkey(buf,i);
           else
             keybuf=0xff;
         }
       else
         {//3
         i++;
         setline2;
          clrline3;
          readkey;
         if(j!=nokey)
           {
            delayxms(40);
            buf=j&0xf000;
            tmp=j;
           while(j!=nokey)
             {
             PB|=nokey;
             readkey;
             clrWatchDog();
             if(tmp!=j)
               break;
             }
             if(j==nokey)
               keybuf=getkey(buf,i);
             else
               keybuf=0xff;
            }
          else
            {//2
            i++;
            setline3;
            clrline4;
            readkey;
            if(j!=nokey)
              {
               delayxms(40);
               buf=j&0xf000;
               tmp=j;
               while(j!=nokey)
                 {
                 PB|=nokey;
                 readkey;
                 clrWatchDog();
                 if(tmp!=j)
                    break;
                 }
                if(j==nokey)
                  keybuf=getkey(buf,i);
                else
                  keybuf=0xff;
               }
             }//2
           }//3
          }//4
       }//5 

uint getkey(uint j,uint i)
   {
   uint k;
   switch(j)
    {
    case 0xe000:k=i*4+0;break;
    case 0xd000:k=i*4+1;break;
    case 0xb000:k=i*4+2;break;
    case 0x7000:k=i*4+3;break;
    default:k=0xff;
    }
   return k;
   }
   
void displaymenu()
  {
  write_word(0x00,0x00,0xd6d0);//中心频率:
  write_word(0x01,0x00,0xd0c4);
  write_word(0x02,0x00,0xc6b5);
  write_word(0x03,0x00,0xc2ca);
  dispnumber(0x08,0x00,0x000a);
  
  write_word(0x00,0x01,0xc9a8);//扫频带宽:
  write_word(0x01,0x01,0xc6b5);
  write_word(0x02,0x01,0xb4f8);
  write_word(0x01,0x01,0xbfed);
  dispnumber(0x08,0x00,0x000a);
  
  write_word(0x00,0x02,0xb2bd);//步进频率
  write_word(0x01,0x02,0xbdf8);
  write_word(0x02,0x02,0xc6b5);
  write_word(0x03,0x02,0xc2ca);
  dispnumber(0x08,0x00,0x000a);
  
  write_word(0x00,0x03,0xcab5);//实际频率
  write_word(0x01,0x03,0xbcca);
  write_word(0x02,0x03,0xc6b5);
  write_word(0x03,0x03,0xc2ca);
  dispnumber(0x08,0x00,0x000a);
  }

void datecheck()
{
uint i;
uint dispmax=0;
uint count;
uint mstep=(2*fd/255);
for(i=0;i<256;i++)
   {
   if(dispbuf1[i]<50)
      dispbuf1[i]=0;
   }
for(i=0;i<256;i++)
   {
   if(dispmax<dispbuf1[i])
      dispmax=i;
   }
if((i==0)&(dispbuf1[i]==0))
   {
   wavetype=NONE;
   dispnumber(addr[0],3,0);
   dispnumber(addr[1],3,0);
   dispnumber(addr[2],3,0);
   dispnumber(addr[3],3,0);
   dispnumber(addr[4],3,0);
   goto end;
   }
else if(aotostep)
   fr=fo+i*mstep;
else if(aotostep==0)
   fr=fo+i*step;
frbuf[0]=fr/10000;
fr%=10000;
frbuf[1]=fr/1000;
fr%=1000;
frbuf[2]=fr/100;
fr%=100;
frbuf[3]=fr/10;
frbuf[4]=fr%10;
dispnumber(addr[0],3,frbuf[0]);
dispnumber(addr[1],3,frbuf[1]);
dispnumber(addr[2],3,frbuf[2]);
dispnumber(addr[3],3,frbuf[3]);
dispnumber(addr[4],3,frbuf[4]);
count=0;
for(i=0;i<256;i++)
  {
  if(dispbuf1[i]>100)
     {
     count++;
     while(dispbuf1[i]>100)
        i++;
     }
  }
if(count==0)
   wavetype=NONE;
else if(count==1)
   wavetype=AM;
else if(count==3)
   wavetype=TM;
else if((count>=5)&((count%2)!=0))
  wavetype=FM;
else 
  wavetype=OM;
end:
dispwavetype(hzaddr,0,wavetype);  
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -