Break out FFT function in ns_core

This is done in order to make the code more readible and maintainable.
This introduces an error of only +1 and -1.

BUG=webrtc:3811
R=bjornv@webrtc.org, kwiberg@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/27749004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7512 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
aluebs@webrtc.org 2014-10-23 19:36:42 +00:00
parent 8454ad88ed
commit 799e88ae19

View File

@ -810,6 +810,44 @@ static void UpdateBuffer(const float* frame,
}
}
// Transforms the signal from time to frequency domain.
// Inputs:
// * |time_data| is the signal in the time domain.
// * |time_data_length| is the length of the analysis buffer.
// * |magnitude_length| is the length of the spectrum magnitude, which equals
// the length of both |real| and |imag| (time_data_length / 2 + 1).
// Outputs:
// * |time_data| is the signal in the frequency domain.
// * |real| is the real part of the frequency domain.
// * |imag| is the imaginary part of the frequency domain.
// * |magn| is the calculated signal magnitude in the frequency domain.
static void FFT(NSinst_t* const self,
float* time_data,
int time_data_length,
int magnitude_length,
float* real,
float* imag,
float* magn) {
int i;
assert(magnitude_length == time_data_length / 2 + 1);
WebRtc_rdft(time_data_length, 1, time_data, self->ip, self->wfft);
imag[0] = 0;
real[0] = time_data[0];
magn[0] = fabs(real[0]) + 1.f;
imag[magnitude_length - 1] = 0;
real[magnitude_length - 1] = time_data[1];
magn[magnitude_length - 1] = fabs(real[magnitude_length - 1]) + 1.f;
for (i = 1; i < magnitude_length - 1; ++i) {
real[i] = time_data[2 * i];
imag[i] = time_data[2 * i + 1];
// Magnitude spectrum.
magn[i] = sqrtf(real[i] * real[i] + imag[i] * imag[i]) + 1.f;
}
}
// Transforms the signal from frequency to time domain.
// Inputs:
// * |real| is the real part of the frequency domain.
@ -882,10 +920,11 @@ int WebRtcNs_AnalyzeCore(NSinst_t* inst, float* speechFrame) {
const int kStartBand = 5; // Skip first frequency bins during estimation.
int updateParsFlag;
float energy;
float signalEnergy, sumMagn;
float signalEnergy = 0.f;
float sumMagn = 0.f;
float tmpFloat1, tmpFloat2, tmpFloat3, probSpeech, probNonSpeech;
float gammaNoiseTmp, gammaNoiseOld;
float noiseUpdateTmp, fTmp;
float noiseUpdateTmp;
float winData[ANAL_BLOCKL_MAX];
float magn[HALF_ANAL_BLOCKL], noise[HALF_ANAL_BLOCKL];
float snrLocPost[HALF_ANAL_BLOCKL], snrLocPrior[HALF_ANAL_BLOCKL];
@ -927,33 +966,10 @@ int WebRtcNs_AnalyzeCore(NSinst_t* inst, float* speechFrame) {
//
inst->blockInd++; // Update the block index only when we process a block.
// FFT
WebRtc_rdft(inst->anaLen, 1, winData, inst->ip, inst->wfft);
FFT(inst, winData, inst->anaLen, inst->magnLen, real, imag, magn);
imag[0] = 0;
real[0] = winData[0];
magn[0] = fabs(real[0]) + 1.f;
imag[inst->magnLen - 1] = 0;
real[inst->magnLen - 1] = winData[1];
magn[inst->magnLen - 1] = fabs(real[inst->magnLen - 1]) + 1.f;
signalEnergy = (float)(real[0] * real[0]) +
(float)(real[inst->magnLen - 1] * real[inst->magnLen - 1]);
sumMagn = magn[0] + magn[inst->magnLen - 1];
if (inst->blockInd < END_STARTUP_SHORT) {
tmpFloat2 = log((float)(inst->magnLen - 1));
sum_log_i = tmpFloat2;
sum_log_i_square = tmpFloat2 * tmpFloat2;
tmpFloat1 = log(magn[inst->magnLen - 1]);
sum_log_magn = tmpFloat1;
sum_log_i_log_magn = tmpFloat2 * tmpFloat1;
}
for (i = 1; i < inst->magnLen - 1; i++) {
real[i] = winData[2 * i];
imag[i] = winData[2 * i + 1];
// magnitude spectrum
fTmp = real[i] * real[i];
fTmp += imag[i] * imag[i];
signalEnergy += fTmp;
magn[i] = ((float)sqrt(fTmp)) + 1.f;
for (i = 0; i < inst->magnLen; i++) {
signalEnergy += real[i] * real[i] + imag[i] * imag[i];
sumMagn += magn[i];
if (inst->blockInd < END_STARTUP_SHORT) {
if (i >= kStartBand) {
@ -1133,7 +1149,6 @@ int WebRtcNs_ProcessCore(NSinst_t* inst,
float energy1, energy2, gain, factor, factor1, factor2;
float snrPrior, previousEstimateStsa, currentEstimateStsa;
float tmpFloat1, tmpFloat2;
float fTmp;
float fout[BLOCKL_MAX];
float winData[ANAL_BLOCKL_MAX];
float magn[HALF_ANAL_BLOCKL];
@ -1197,26 +1212,10 @@ int WebRtcNs_ProcessCore(NSinst_t* inst,
return 0;
}
// FFT
WebRtc_rdft(inst->anaLen, 1, winData, inst->ip, inst->wfft);
FFT(inst, winData, inst->anaLen, inst->magnLen, real, imag, magn);
imag[0] = 0;
real[0] = winData[0];
magn[0] = fabs(real[0]) + 1.f;
imag[inst->magnLen - 1] = 0;
real[inst->magnLen - 1] = winData[1];
magn[inst->magnLen - 1] = fabs(real[inst->magnLen - 1]) + 1.f;
if (inst->blockInd < END_STARTUP_SHORT) {
inst->initMagnEst[0] += magn[0];
inst->initMagnEst[inst->magnLen - 1] += magn[inst->magnLen - 1];
}
for (i = 1; i < inst->magnLen - 1; i++) {
real[i] = winData[2 * i];
imag[i] = winData[2 * i + 1];
// magnitude spectrum
fTmp = real[i] * real[i];
fTmp += imag[i] * imag[i];
magn[i] = ((float)sqrt(fTmp)) + 1.f;
if (inst->blockInd < END_STARTUP_SHORT) {
for (i = 0; i < inst->magnLen; i++) {
inst->initMagnEst[i] += magn[i];
}
}