📄 newpitch_2.c
字号:
/*******************************************************************
基音检测
*******************************************************************/
#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 + -