?? 新建 文本文檔.txt
字號(hào):
//////////譜減SS//////////////
void CWaveDlg::Ondenoise()
{
// TODO: Add your control notification handler code here
int i,j,FrameNum=nDataSize/256;
long nDataSize_temp=nDataSize;
short *SpeechTmp1,*SpeechTmp2,*start,*temp;
SpeechTmp1=new short[nDataSize];
temp=SpeechTmp1;
start=pSpeech;
SpeechTmp2=pSpeech;
int length =DEFAULT_LENGTH;
int shift=DEFAULT_SHIFT;
double smul=DEFAULT_MULTIPLE;
double lambda=DEFAULT_SMOOTHING;
double *temp1,sum1=0,sum2=0,sum3=0,h=0;
double win[256], frame[256], ps_noise[256],frame_temp[256], ps_signal[256];
double pxn[129],os[129],pn[129],px[129];
double alfac=1,md=0.73;
double pmean[129],fsnr[129],psnr[129],gain[129];
double pvar[129];
//設(shè)置
double fftlen=0.032;int overlap=4;double tm=1.5;int nob=4;
int ko=4;int fo=800;
int ni=64;int fs=8000;
double ti=(double)ni/fs;double zg=exp(-ti/0.04);
double nw=ni*overlap;
int nm=1+(int)(fs*tm/(ni*nob));
for(i=0;i<length;i++)
win[i]=0.54-0.46*cos(2*PI*i/length);
double mb[129][4];
for(i=0;i<129;i++)
{
for(j=0;j<4;j++)
{
mb[i][j]=nw/2;
}
}
double osf[129];
for(i=0;i<129;i++)
osf[i]=4/(1+i*fs/(nw*fo));
for(i=0;i<length;i++)
frame[i]=(double)(*pSpeech++)/pow(2,16)/nw;//
rfft(length,frame,frame_temp,1);
pxn[0]=pn[0]=frame_temp[0]*frame_temp[0];
pxn[length/2]=ps_noise[length/2]=frame_temp[1]*frame_temp[1];
for(i=1;i<=length/2-1;i++)
{
pxn[i]=pn[i]=frame_temp[2*i]*frame_temp[2*i]+frame_temp[2*i+1]*frame_temp[2*i+1];
}
for(i=0;i<129;i++)
{
pmean[i]=pn[i];
pvar[i]=pn[i]*pn[i];
}
int im=0;
for(i=0;i<129;i++)
{
fsnr[i]=0;px[i]=0;
psnr[i]=1;
gain[i]=0.5;
}
//
//for(i=0;i<shift;i++)
// start++;
pSpeech=start;
do
{
for(i=0;i<129;i++)
fsnr[i]=0.98*(gain[i]*px[i]/(pn[i]+1.0e-30))+(1-0.98)*max(psnr[i]-1,0);
for(i=0;i<length;i++)
//frame[i]=(double)(*pSpeech++)/nw;
frame[i]=(double)(*pSpeech++)/pow(2,16)/nw;//
for(i=0;i<shift;i++)
start++;
pSpeech=start;
temp1=frame_temp;
rfft(length,frame,frame_temp,1);
//
ps_signal[0]=frame_temp[0]*frame_temp[0];
ps_signal[length/2]=frame_temp[1]*frame_temp[1];
for(i=1;i<=length/2-1;i++)
{
ps_signal[i]=frame_temp[2*i]*frame_temp[2*i]+frame_temp[2*i+1]*frame_temp[2*i+1];
ps_signal[length-i]=ps_signal[i];
}
///////////////////////////////////////////////////////////////
int i,j,length=DEFAULT_LENGTH;double a=0,w=0;
double b[22],sf[22][22],c[22],O[22],T[256],thv1[256];//0~22
double temp=0,uj=0,ua=0,sfm=0,gm=0,am=0,u=0,f[256],mm;
for (i=0;i<=21;i++)
{
b[i]=c[i]=O[i]=0.0;
for (j=0;j<=21;j++)
sf[i][j]=0.0;
}
for(i=0;i<=2;i++)
b[0]+=ps_signal[i];
for(i=3;i<=5;i++)
b[1]+=ps_signal[i];
for(i=6;i<=9;i++)
b[2]+=ps_signal[i];
for(i=10;i<=12;i++)
b[3]+=ps_signal[i];
for(i=13;i<=15;i++)
b[4]+=ps_signal[i];
for(i=16;i<=19;i++)
b[5]+=ps_signal[i];
for(i=20;i<=24;i++)
b[6]+=ps_signal[i];
for(i=25;i<=28;i++)
b[7]+=ps_signal[i];
for(i=29;i<=34;i++)
b[8]+=ps_signal[i];
for(i=35;i<=40;i++)
b[9]+=ps_signal[i];
for(i=41;i<=46;i++)
b[10]+=ps_signal[i];
for(i=47;i<=54;i++)
b[11]+=ps_signal[i];
for(i=55;i<=63;i++)
b[12]+=ps_signal[i];
for(i=64;i<=73;i++)
b[13]+=ps_signal[i];
for(i=74;i<=85;i++)
b[14]+=ps_signal[i];
for(i=86;i<=100;i++)
b[15]+=ps_signal[i];
for(i=101;i<=117;i++)
b[16]+=ps_signal[i];
for(i=118;i<=140;i++)
b[17]+=ps_signal[i];
for(i=141;i<=169;i++)
b[18]+=ps_signal[i];
for(i=170;i<=204;i++)
b[19]+=ps_signal[i];
for(i=205;i<=245;i++)
b[20]+=ps_signal[i];///////
for(i=246;i<=255;i++)
b[21]+=ps_signal[i];
for(i=0;i<=21;i++)
for(j=0;j<=21;j++)
{
sf[i][j]=15.81+7.5*((i-j)+0.474)-17.5*sqrt(1+((i-j)+0.474)*((i-j)+0.474));//db
sf[i][j]=pow(10,sf[i][j]/(20));
}
for(j=0;j<=21;j++)
{
c[j]=0;
for(i=0;i<=21;i++)
c[j]=c[j]+b[i]*sf[i][j];
}
temp=0.0;
for(i=0;i<=21;i++)
temp=temp+b[i];
ua=temp/256.0;
temp=0;
for(i=0;i<length;i++)
temp=temp+log10(ps_signal[i]);
temp=temp/length;
uj=pow(10,temp);
sfm=-10*log10(uj/ua);
u=min(sfm/(-60),1);
for (i=0;i<=21;i++)
{
O[i]=u*(14.5+i)+(1-u)*5.5;
T[i]=pow(10,log10(c[i])-O[i]/10);
T[i]=10*log10(T[i])+90.302;
c[i]=T[i];//c[i]暫存T[i]
}
for(i=0;i<=2;i++)
T[i]=c[0];
for(i=3;i<=5;i++)
T[i]=c[1];
for(i=6;i<=9;i++)
T[i]=c[2];
for(i=10;i<=12;i++)
T[i]=c[3];
for(i=13;i<=15;i++)
T[i]=c[4];
for(i=16;i<=19;i++)
T[6]=c[5];
for(i=20;i<=24;i++)
T[i]=c[6];
for(i=25;i<=28;i++)
T[i]=c[7];
for(i=29;i<=34;i++)
T[i]=c[8];
for(i=35;i<=40;i++)
T[i]=c[9];
for(i=41;i<=46;i++)
T[i]=c[10];
for(i=47;i<=54;i++)
T[i]=c[11];
for(i=55;i<=63;i++)
T[i]=c[12];
for(i=64;i<=73;i++)
T[i]=c[13];
for(i=74;i<=85;i++)
T[i]=c[14];
for(i=86;i<=100;i++)
T[i]=c[15];
for(i=101;i<=117;i++)
T[i]=c[16];
for(i=118;i<=140;i++)
T[i]=c[17];
for(i=141;i<=169;i++)
T[i]=c[18];
for(i=170;i<=204;i++)
T[i]=c[19];
for(i=205;i<=245;i++)
T[i]=c[20];
for(i=246;i<=255;i++)
T[i]=c[21];
////計(jì)算絕對(duì)聽(tīng)閾////
mm=0.0;
for (i=0;i<length;i++)
{
f[i]=mm;
mm=mm+(double)8/255;
}
f[0]=f[1];
for(i=0;i<256;i++)
{
f[i]=(3.64*pow(f[i],-0.8)-6.5*exp(-0.6*pow((f[i]-3.3),2))+0.001*pow(f[i],4));
}
for(i=0;i<256;i++)
{
T[i]=maxNum(T[i],f[i]);
thv1[i]=pow(10,(T[i]-90.302)/10);
}
double sum1=0,sum2=0;
for(i=0;i<129;i++)
{
sum1=sum1+pxn[i];
sum2=sum2+ps_signal[i];
}
double alfac1;double gama[129],za[129];
alfac1=1/pow((1+sum1/sum2-1),2);
alfac=0.7*alfac+0.3*max(alfac1,0.7);
for(i=0;i<129;i++)
{
gama[i]=(pxn[i]+1.0e-30)/(pn[i]+1.0e-30);
za[i]=max(0.96*alfac/(1+(gama[i]-1)*(gama[i]-1)),0.3);
}
for(i=0;i<129;i++)
{
pxn[i]=za[i]*pxn[i]+(1-za[i]*ps_signal[i]);
}
im=fmod(im+1,nm);
if (im)
{
for(i=0;i<129;i++)
mb[i][0]=min(mb[i][0],pxn[i]);
}
else
{
for(j=3;j>=1;j--)
{
for(i=0;i<129;i++)
mb[i][j]=mb[i][j-1];
}
for(i=0;i<129;i++)
mb[i][0]=pxn[i];
}
double beta[129],fvar[129],qeqinv[129],qeq[129],bc[129];
double qinv=0;
for(i=0;i<129;i++)
{
beta[i]=min(za[i]*za[i],0.8);
pmean[i]=beta[i]*pmean[i]+(1-beta[i])*pxn[i];
pvar[i]=beta[i]*pvar[i]+(1-beta[i])*pxn[i]*pxn[i];
fvar[i]=pvar[i]-pmean[i]*pmean[i];
qeqinv[i]=min(fvar[i]/(2*pn[i]*pn[i]),0.5);
qeq[i]=(1/qeqinv[i]-2*md)/(1-md);
bc[i]=1+(nm-1)*2/qeq[i];
qinv=qinv+qeqinv[i];
}
qinv=qinv/129;
double binmax,bcc;
if (qinv<0.03)
binmax=8;
else if (qinv<0.05)
binmax=4;
else if (qinv<0.06)
binmax=2;
else
binmax=1.2;
bcc=1+2.12*sqrt(qinv);
double bin[129];
for(i=0;i<129;i++)
{
bc[i]=min(bc[i],binmax);
bin[i]=bcc*bc[i];
}
temp=1e10;
for(i=0;i<129;i++)
{
for(j=0;j<4;j++)
{
if(mb[i][j]<temp)
temp=mb[i][j];
}
pn[i]=bin[i]*temp;
}
double galfa[129],gbeta[129],gain[129];
for(i=0;i<129;i++)
{
os[i]=za[i]*os[i]+(1-za[i])*(1+osf[i]*pn[i]/(pn[i]+pxn[i]));
px[i]=zg*px[i]+(1-zg)*ps_signal[i];
psnr[i]=ps_signal[i]/(pn[i]+1.0e-30);
galfa[i]=15*thv1[i]/(fabs(fsnr[i]-psnr[i]+1)*pn[i]);
gbeta[i]=1+((galfa[i]-1)/galfa[i])*fsnr[i];
gain[i]=sqrt(max((galfa[i]-galfa[i]*gbeta[i]/psnr[i]),0));
}
frame_temp[0]=frame_temp[0]*gain[0];
frame_temp[length/2]=frame_temp[length/2]*gain[length/2];
for(i=1;i<=length/2-1;i++)
{
frame_temp[2*i]=frame_temp[2*i]*gain[i]*nw;
frame_temp[2*i+1]=frame_temp[2*i+1]*gain[i]*nw;
}
rfft(length,frame_temp,frame,-1);
for(i=length/2;i<length;i++)
//*SpeechTmp1++=(short)(frame[i]);
*SpeechTmp1++=(short)(frame[i]*pow(2,16));//
}while(FrameNum--);
pSpeech=temp;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -