📄 bgnscd.cpp
字号:
} } maxEnergyLastPart = st->frameEnergyHist[2*L_ENERGYHIST/3]; for (i = 2*L_ENERGYHIST/3+1; i < L_ENERGYHIST; i++) { if ( sub (maxEnergyLastPart, st->frameEnergyHist[i] ) < 0) { maxEnergyLastPart = st->frameEnergyHist[i]; } } inbgNoise = 0; // false // Do not consider silence as noise // Do not consider continuous high volume as noise // Or if the current noise level is very low // Mark as noise if under current noise limit // OR if the maximum energy is below the upper limit if ( (sub(maxEnergy, LOWERNOISELIMIT) > 0) && (sub(currEnergy, FRAMEENERGYLIMIT) < 0) && (sub(currEnergy, LOWERNOISELIMIT) > 0) && ( (sub(currEnergy, noiseFloor) < 0) || (sub(maxEnergyLastPart, UPPERNOISELIMIT) < 0))) { if (sub(add(st->bgHangover, 1), 30) > 0) { st->bgHangover = 30; } else { st->bgHangover = add(st->bgHangover, 1); } } else { st->bgHangover = 0; } // make final decision about frame state , act somewhat cautiosly if (sub(st->bgHangover,1) > 0) inbgNoise = 1; // true for (i = 0; i < L_ENERGYHIST-1; i++) { st->frameEnergyHist[i] = st->frameEnergyHist[i+1]; } st->frameEnergyHist[L_ENERGYHIST-1] = currEnergy; // prepare for voicing decision; tighten the threshold after some time in noise ltpLimit = 13926; // 0.85 Q14 if (sub(st->bgHangover, 8) > 0) { ltpLimit = 15565; // 0.95 Q14 } if (sub(st->bgHangover, 15) > 0) { ltpLimit = 16383; // 1.00 Q14 } // weak sort of voicing indication. prevVoiced = 0; // false if (sub(gmed_n(<pGainHist[4], 5), ltpLimit) > 0) { prevVoiced = 1; // true } if (sub(st->bgHangover, 20) > 0) { if (sub(gmed_n(ltpGainHist, 9), ltpLimit) > 0) { prevVoiced = 1; // true } else { prevVoiced = 0; // false } } if (prevVoiced) { *voicedHangover = 0; } else { temp = add(*voicedHangover, 1); if (sub(temp, 10) > 0) { *voicedHangover = 10; } else { *voicedHangover = temp; } } return inbgNoise;}------------------------------------------------------------------------------ RESOURCES USED [optional] When the code is written for a specific target processor the the resources used should be documented below. HEAP MEMORY USED: x bytes STACK MEMORY USED: x bytes CLOCK CYCLES: (cycle count equation for this function) + (variable used to represent cycle count for each subroutine called) where: (cycle count variable) = cycle count for [subroutine name]------------------------------------------------------------------------------ CAUTION [optional] [State any special notes, constraints or cautions for users of this function]------------------------------------------------------------------------------*/Word16 Bgn_scd(Bgn_scdState *st, /* i : State variables for bgn SCD */ Word16 ltpGainHist[], /* i : LTP gain history */ Word16 speech[], /* o : synthesis speech frame */ Word16 *voicedHangover,/* o : # of frames after last voiced frame */ Flag *pOverflow ){ Word16 i; Word16 prevVoiced, inbgNoise; Word16 temp; Word16 ltpLimit, frameEnergyMin; Word16 currEnergy, noiseFloor, maxEnergy, maxEnergyLastPart; Word32 s, L_temp; /* Update the inBackgroundNoise flag (valid for use in next frame if BFI) */ /* it now works as a energy detector floating on top */ /* not as good as a VAD. */ s = (Word32) 0; for (i = L_FRAME - 1; i >= 0; i--) { L_temp = ((Word32) speech[i]) * speech[i]; if (L_temp != (Word32) 0x40000000L) { L_temp = L_temp << 1; } else { L_temp = MAX_32; } s = L_add(s, L_temp, pOverflow); } /* s is a sum of squares, so don't need to check for neg overflow */ if (s > (Word32)0x1fffffffL) { currEnergy = MAX_16; } else { currEnergy = (Word16)(s >> 14); } frameEnergyMin = 32767; for (i = L_ENERGYHIST - 1; i >= 0; i--) { if (st->frameEnergyHist[i] < frameEnergyMin) { frameEnergyMin = st->frameEnergyHist[i]; } } /* Frame Energy Margin of 16 */ L_temp = (Word32)frameEnergyMin << 4; if (L_temp != (Word32)((Word16) L_temp)) { if (L_temp > 0) { noiseFloor = MAX_16; } else { noiseFloor = MIN_16; } } else { noiseFloor = (Word16)(L_temp); } maxEnergy = st->frameEnergyHist[0]; for (i = L_ENERGYHIST - 5; i >= 1; i--) { if (maxEnergy < st->frameEnergyHist[i]) { maxEnergy = st->frameEnergyHist[i]; } } maxEnergyLastPart = st->frameEnergyHist[2*L_ENERGYHIST/3]; for (i = 2 * L_ENERGYHIST / 3 + 1; i < L_ENERGYHIST; i++) { if (maxEnergyLastPart < st->frameEnergyHist[i]) { maxEnergyLastPart = st->frameEnergyHist[i]; } } /* Do not consider silence as noise */ /* Do not consider continuous high volume as noise */ /* Or if the current noise level is very low */ /* Mark as noise if under current noise limit */ /* OR if the maximum energy is below the upper limit */ if ((maxEnergy > LOWERNOISELIMIT) && (currEnergy < FRAMEENERGYLIMIT) && (currEnergy > LOWERNOISELIMIT) && ((currEnergy < noiseFloor) || (maxEnergyLastPart < UPPERNOISELIMIT))) { if ((st->bgHangover + 1) > 30) { st->bgHangover = 30; } else { st->bgHangover += 1; } } else { st->bgHangover = 0; } /* make final decision about frame state , act somewhat cautiosly */ if (st->bgHangover > 1) { inbgNoise = TRUE; } else { inbgNoise = FALSE; } for (i = 0; i < L_ENERGYHIST - 1; i++) { st->frameEnergyHist[i] = st->frameEnergyHist[i+1]; } st->frameEnergyHist[L_ENERGYHIST-1] = currEnergy; /* prepare for voicing decision; tighten the threshold after some time in noise */ if (st->bgHangover > 15) { ltpLimit = 16383; /* 1.00 Q14 */ } else if (st->bgHangover > 8) { ltpLimit = 15565; /* 0.95 Q14 */ } else { ltpLimit = 13926; /* 0.85 Q14 */ } /* weak sort of voicing indication. */ prevVoiced = FALSE; if (gmed_n(<pGainHist[4], 5) > ltpLimit) { prevVoiced = TRUE; } if (st->bgHangover > 20) { if (gmed_n(ltpGainHist, 9) > ltpLimit) { prevVoiced = TRUE; } else { prevVoiced = FALSE; } } if (prevVoiced) { *voicedHangover = 0; } else { temp = *voicedHangover + 1; if (temp > 10) { *voicedHangover = 10; } else { *voicedHangover = temp; } } return(inbgNoise);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -