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

📄 newpitch_2.c

📁 文件系统在DSP5509上的实现
💻 C
📖 第 1 页 / 共 2 页
字号:

/*******************************************************************         
                           基音检测
           
           
*******************************************************************/

#include "math.h"
#include "VoiceProcess.h"
#include "Dsplib.h"



////////////////////////////////////////////////////////////////// 
#pragma DATA_SECTION(fft,".FFT");

/*************************   *************************************/
extern Bool int_flag;  
extern float VoiceIn[WindowsLong];              //原始数据
extern float VoicePreEmphasisOut[WindowsLong];  //预加重后数据
extern float VoiceHammingOut[WindowsLong];      //加窗后数据后
extern float ALF[LpcNumber];                    //LPC系数
  
extern Uint16 ZhenYi_F;                       //帧移标志
extern float CEP[CepNumber];                  //倒谱系数
extern float PRECEPD[CepNumber];               //预测倒谱系数
extern float CORREL[CepNumber];
extern float Average;
extern int PitchDataIn[800];
extern int PitchDataVer[800];
extern Uint16 PitchPoint;

extern Uint16 SegNew;
extern int MikeOut[];

extern Uint16 RecPoint;    
extern Uint16 jishuqi;
/******************** PITCH **********************************/
DATA   fft[WindowsLong];              //傅立叶变换
DATA   fftNew[WindowsLong];  
DATA   fftError[WindowsLong];

Bool PitchFlag;                //点灯标志
 

Uint16 SpeechVal;
 

int Am[WindowsLong/2];
int VoiceCrossNew;
int VoiceCross[64];
 
long unsigned int Averagefft; 
unsigned int Maxfft;
unsigned int AverageNumber;

long unsigned int fftH,fftL;
int fftNumber;
long unsigned int fftH128,fftL18;
int fftHNumber;

int Max,MaxPitch;


#define FFTMIN     0
#define FFTMAX     200

#define FFTLIMIT   30
#define FftLength  (FFTMAX-FFTMIN)

#define AdptiveLength  64
unsigned int TimeLong=0;
float FftLong[FftLength]; 
float FftLong1[FftLength];
float fftSource[FftLength]; 

//int PitchFlagReady,PitchScore; 

#define FFTL     18
#define FFTH     50
int  PitchPre[(FFTH-FFTL)];
#define FFTA     50
int PitchNew1,PitchNew2;
int amax,bmax;
long int sum,sum1,sum2,sum3,sum4,sum5;
float SumK;
int PitchPreMax,MaxInside;

int fftTime[202];

float fftfl[256];

long int SumFftL,SumFftH;
float  SumKfftl;

int Pig;
long int Sum50;
int Averger50,Max50; 
float SumK50; 

int BellFlagL1,BellFlagH1,BellFlagL2,BellFlagH2;

///////////////////////////////////////////////////////////////

extern void SoundOut(void);
extern void AmAdjust(void);/*         调整放大倍数                */
extern void ApexP(void);


void ComputerPitch(void);
void bianliang_chushihua(void);       //数组变量初始化
 
  
     static void PitchCep(void);      // 时域--频域  
     static void SpeechNew(void);     //基音周期检测
    
  
    void  FftSubAverge(void);         // 减平均误差
    void  FftSubLong(void);           // 减长期误差
    void  FftLongInit(void);          // 初始化 FftLong[]
    static void ComputerVar(void);    // 1.  计算最大值与平均值之比;
                                      // 2.  200-38与38-15 和的比;
                                      // 3.  200-128与128-18范围内和的比
    void PitchSearchAll(void);
    void ComputerBell(void);
    
extern   void PreEmphasis2(void);  //预加重
extern   void AddHamming2(void);   //加汉明窗

   
/*********************************************************************/ 
//        基音检测主程序

void ComputerPitch(void)
{  
   PitchCep();           // 时域--频域 
 
   ComputerVar();        // 计算比值
   PitchSearchAll(); 
   SpeechNew();           //基音周期判别并设置亮灯标志
 
}


/*********************************************************************/
/*                  设置亮灯标志                                     */

/*********************************************************************/

static void SpeechNew(void)
{
 
 //判断并设置亮灯标志
    if((Maxfft>MicroMaxfft)&&(Averagefft>MicroAveragefft)
        &&(AverageNumber>MicroAverageNumber)
        &&(MaxInside==1)
        &&(PitchPreMax>1)
        &&(PitchNew1>=SpeechValMin)&&(PitchNew1<=SpeechValMax))
       
       
    {  if(SumKfftl>=SUMKL)
       {
          if(SumK50<SUM50HL)
             PitchFlag=0;
          else
          {  
            PitchFlag=1;
          }   
             
       }      
       else
       { 
        
         if(((BellFlagL1==1)||(BellFlagH1==1))
             ||((BellFlagL2==1)||(BellFlagH2==1)))  
         {
            PitchFlag=0;
         }
         else
         {
             PitchFlag=1;
         }    
       }  
    } 
    else 
    {
       PitchFlag=0;
    }
  
  // AmAdjust();                                /*   调整73311的放大倍数   */
 
}

void ComputerBell(void)
{   
   int a,i;
   a=0;
   for(i=BellSpeech1-15;i<=BellSpeech1+15;i++)
   {
     if(fft[i]>a)
     {
      a=fft[i];
      BellFlagL1=i;
     }
   }
   if((a>=BellAm1)&&(BellFlagL1<=BellSpeech1+3)
       &&(BellFlagL1>=BellSpeech1-3))
   { 
     BellFlagL1=1;
   }
   else
   { 
     BellFlagL1=0;
   }       
   
   a=0;
   for(i=2*BellSpeech1-15;i<=2*BellSpeech1+15;i++)
   {
     if(fft[i]>a)
     {
      a=fft[i];
      BellFlagH1=i;
     }
   }
   if((a>=BellAm1)&&(BellFlagH1<=2*BellSpeech1+5)
       &&(BellFlagH1>=2*BellSpeech1-5))
   { 
     BellFlagH1=1;
   }
   else
   { 
     BellFlagH1=0;
   }       

    a=0;
   for(i=BellSpeech2-15;i<=BellSpeech2+15;i++)
   {
     if(fft[i]>a)
     {
      a=fft[i];
      BellFlagL2=i;
     }
   }
   if((a>=BellAm2)&&(BellFlagL2<=BellSpeech2+3)
       &&(BellFlagL2>=BellSpeech2-3))
   { 
     BellFlagL2=1;
   }
   else
   { 
     BellFlagL2=0;
   }       
   
   a=0;
   for(i=2*BellSpeech2-20;i<=2*BellSpeech2+20;i++)
   {
     if(fft[i]>a)
     {
      a=fft[i];
      BellFlagH2=i;
     }
   }
   if((a>=BellAm2)&&(BellFlagH2<=2*BellSpeech2+5)
       &&(BellFlagH2>=2*BellSpeech2-5))
   { 
     BellFlagH2=1;
   }
   else
   { 
     BellFlagH2=0;
   }       
   
}


//////////////////////////////////////////////////////////////////////////
// 1. 将fft[]数据作平滑处理,
// 2. 求出200-18内的最大值bmax
// 3. 将512-200内的fft[]数据清零
// 4. 200-18 内的fft[]数据求和

//////////////////////////////////////////////////////////////////////////
void PitchSearchAll(void)
{
   int i,j,a,b,c,n; 
   Pig=1;
              
   for(i=0;i<18;i++)
   {
     fft[i]=0;                //清0
   } 
   
   for(i=200;i<512;i++)
   {
     fft[i]=0;                //清0
     if(int_flag==1)SoundOut();
   } 
   
   for(i=0;i<(FFTH-FFTL);i++)
    {
      PitchPre[i]=0;           //清0 
    }
   
     
/*   for(i=19;i<200;i++)
   {
     fftTime[i]=0.25*fft[i-1]+0.5*fft[i]+0.25*fft[i+1];
     if(int_flag==1)SoundOut(); 
   }                            //滤波
   
   for(i=18;i<200;i++)
   {
     fft[i]=4*fftTime[i+1];
     if(int_flag==1)SoundOut(); 
   }  
   
   
   fft[0]=0;                   //回送数据
   fft[1]=0;
   fft[199]=0;                   //回送数据
   fft[200]=0;
*/   
   for(i=18;i<200;i++)
   {
     if(fft[i]<0)
       fft[i]=-fft[i];                //清0
     if(int_flag==1)SoundOut();
   } 
  
  
  
   Sum50=0;
   for(i=18;i<=40;i++)
   {
     Sum50+=fft[i];
   } 
   
   Averger50=Sum50/22; 
   
   Max50=0;
   for(i=18;i<=40;i++)
   {
     if(fft[i]>Max50)
     {  Max50=fft[i];
     } 
   } 
   
   SumK50=(float)Max50/Averger50;
  
   ComputerBell();   
  
        
   amax=0;
   for(i=18;i<200;i++)
   {
     if(fft[i]>amax)
     {  amax=fft[i];
        bmax=i;
     } 
     if(int_flag==1)SoundOut();
   }                          //求出200-18内的最大值bmax
   
  
   sum=0;
   for(i=18;i<200;i++)
   {
      sum+=fft[i];
   }                           //求总和
   
   
   SumFftL=0;
   for(i=FFTL;i<FFTH;i++)
   {
     SumFftL+=fft[i];
   }   
   
   SumKfftl=(float)SumFftL/sum;
   
   
    
   for(i=FFTL;i<FFTH;i++)
   {
     if(int_flag==1)SoundOut();
      n=1;
      c=0;
      for(n=1;n*i<192;n++)
      {  
         
         a=0;
         for(j=n*i-5;j<n*i+5;j++)
         { 

⌨️ 快捷键说明

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