📄 vparms.c
字号:
/************************************************************************ VPARMS Version 50************************************************************************* Calculate voicing parameters:** Inputs:* VWIN - Voicing window limits* INBUF - Input speech buffer* LPBUF - Low pass filtered speech* BUFLIM - Array bounds for INBUF and LPBUF* HALF - Half frame (1 or 2)* DITHER - Zero crossing threshold* MINTAU - Lag corresponding to minimum AMDF value (pitch estimate)* Outputs:* ZC - Zero crossing rate* LBE - Low band energy (sum of magnitudes - SM)* FBE - Full band energy (SM)* QS - Ratio of 6 dB/oct preemphasized energy to full band energy* RC1 - First reflection coefficient* AR_B - Product of the causal forward and reverse pitch* prediction gains* AR_F - Product of the noncausal forward and reverse pitch* prediction gains* Internal:* OLDSGN - Previous sign of dithered signal* VLEN - Length of voicing window* START - Lower address of current half of voicing window* STOP - Upper address of current half of voicing window* E_0 - Energy of LPF speech (sum of squares - SS)* E_B - Energy of LPF speech backward one pitch period (SS)* E_F - Energy of LPF speech forward one pitch period (SS)* R_B - Autocovariance of LPF speech backward one pitch period* R_F - Autocovariance of LPF speech forward one pitch period* LP_RMS - Energy of LPF speech (sum of magnitudes - SM)* AP_RMS - Energy of all-pass speech (SM)* E_PRE - Energy of 6dB preemphasized speech (SM)* E0AP - Energy of all-pass speech (SS)*/#include "lpcdefs.h"#include <math.h>vparms(vwin, inbuf, lpbuf, half, dither, mintau, zc, lbe, fbe, qs, rc1, ar_b, ar_f )int *vwin;float *inbuf;int half, *zc, *lbe, *fbe, mintau;float *dither, *qs, *rc1, *ar_b;float *ar_f;float *lpbuf;{int i, vlen, start, stop;float oldsgn, e_0, e_b, r_b, lp_rms, ap_rms, e_pre, e0ap;float e_f, r_f;float sign;float *ptr1, *ptr2; /******** VWIN(1) => vwin[0][2] ******** ******** VWIN(2) => vwin[1][2] ********//* Calculate zero crossings (ZC) and several energy and correlation* measures on low band and full band speech. Each measure is taken* over either the first or the second half of the voicing window,* depending on the variable HALF. */lp_rms = 0.;ap_rms = 0.;e_pre = 0.;e0ap = 0.;*rc1 = 0.;e_0 = 0.;e_b = 0.;e_f = 0.;r_f = 0.;r_b = 0.;*zc = 0;vlen = *(vwin+AF+2) - *(vwin+2) + 1;start = *(vwin+2) + (half-1)*(vlen>>1) + 1;stop = start + (vlen>>1) - 1;oldsgn = (*(inbuf+start-1)-*dither < 0)?-1.:1.;ptr1 = lpbuf+start;ptr2 = inbuf+start;for(i=start; i<= stop; i++) { lp_rms += (float)fabs((double)(*ptr1)); ap_rms += (float)fabs((double)*ptr2); e_pre += (float)fabs((double)(*ptr2-*(ptr2-1))); e0ap += *ptr2**ptr2; *rc1 += *ptr2**(ptr2-1); e_0 += *ptr1**ptr1; e_b += *(ptr1-mintau)**(ptr1-mintau); e_f += *(ptr1+mintau)**(ptr1+mintau); r_f += *ptr1**(ptr1+mintau); r_b += *ptr1**(ptr1-mintau); sign = (*ptr2+ *dither < 0)?-1.:1.; if( sign != oldsgn ) { *zc += 1; oldsgn = -oldsgn; } *dither = -*dither; ptr1++; ptr2++;}/* Normalized short-term autocovariance coefficient at unit sample delay */*rc1 /= mmax(e0ap,1.);/* Ratio of the energy of the first difference signal (6 dB/oct preemphasis)* to the energy of the full band signal */*qs = e_pre / mmax(2.*ap_rms,1.);/* aR_b is the product of the forward and reverse prediction gains,* looking backward in time (the causal case). *//***** *ar_b = (r_b / mmax(e_b,1.)) * (r_b / mmax(e_0,1.)); *****/*ar_b = (r_b * r_b) / (mmax(e_b,1.) * mmax(e_0,1.));/* aR_f is the same as aR_b, but looking forward in time (non causal case). */*ar_f = (r_f / mmax(e_f,1.)) * (r_f / mmax(e_0,1.));/* Normalize ZC, LBE, and FBE to old fixed window length of 180.* (The fraction 90/VLEN has a range of .58 to 1) *//******zc = nint( *zc*2 * (90./vlen) );*lbe = mmin( nint( lp_rms*0.25 * (90./vlen) ), 32767 );*fbe = mmin( nint( ap_rms*0.25 * (90./vlen) ), 32767 );*****/*zc = ( *zc*2 * (90./vlen) ) + .5;*lbe = mmin( ( lp_rms*0.25 * (90./vlen) )+.5, 32767 );*fbe = mmin( ( ap_rms*0.25 * (90./vlen) )+.5, 32767 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -