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

📄 main.c

📁 TI公司TMS320VC5402 DSP 上的FIR滤波C语言版本
💻 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 + -