diff options
Diffstat (limited to 'Project/RTDSP/enhance.c')
-rw-r--r-- | Project/RTDSP/enhance.c | 58 |
1 files changed, 35 insertions, 23 deletions
diff --git a/Project/RTDSP/enhance.c b/Project/RTDSP/enhance.c index 28bb186..5422bcd 100644 --- a/Project/RTDSP/enhance.c +++ b/Project/RTDSP/enhance.c @@ -81,7 +81,7 @@ DSK6713_AIC23_Config Config = { \ }; typedef struct { - float *mag_spec; + float *pow; float sum; } MVal; @@ -94,14 +94,16 @@ float *inwin, *outwin; /* Input and output windows */ float ingain, outgain; /* ADC and DAC gains */ float cpufrac; /* Fraction of CPU time used */ complex *fft_out; /* FFT output */ -float* noise; -float* P_; +float *noise; +float *power_in; +float *mag_in; +float* lpf; volatile int io_ptr=0; /* Input/ouput pointer for circular buffers */ volatile int frame_ptr=0; /* Frame pointer */ volatile int frame_ctr = 0; volatile int m_ptr = 0; float lambda = 0.05; -float alpha = 20; +float alpha = 100; double avg = 0; MVal M[NUM_M]; float K; @@ -130,7 +132,9 @@ void main() inwin = (float *) calloc(FFTLEN, sizeof(float)); /* Input window */ outwin = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ fft_out = (complex *) calloc(FFTLEN, sizeof(complex)); /* FFT Output */ - + power_in = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ + mag_in = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ + lpf = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ /* initialize board and the audio port */ init_hardware(); @@ -139,7 +143,7 @@ void main() /* initialize algorithm constants */ - for (k=0;k<FFTLEN;++k) + for (k=0; k<FFTLEN; ++k) { inwin[k] = sqrt((1.0-WINCONST*cos(PI*(2*k+1)/FFTLEN))/OVERSAMP); outwin[k] = inwin[k]; @@ -149,9 +153,9 @@ void main() for (k = 0; k < NUM_M; ++k) { int i; - M[k].mag_spec = (float *) calloc(FFTLEN, sizeof(float)); + M[k].pow = (float *) calloc(FFTLEN, sizeof(float)); for(i = 0; i < FFTLEN; ++i) { - M[k].mag_spec[i] = MAX_FLOAT; + M[k].pow[i] = MAX_FLOAT; } M[k].sum = MAX_FLOAT; } @@ -200,15 +204,13 @@ void init_HWI(void) // Spectrum calculations for the new values void write_spectrum(void) { unsigned int k; - float x_val; M[m_ptr].sum = 0; for(k = 0; k < FFTLEN; ++k) { - x_val = cabs(fft_out[k]); - if(x_val < M[m_ptr].mag_spec[k] && x_val != 0) { - M[m_ptr].mag_spec[k] = x_val; - M[m_ptr].sum += x_val; + if(power_in[k] < M[m_ptr].pow[k] && power_in[k] != 0) { + M[m_ptr].pow[k] = power_in[k]; + M[m_ptr].sum += power_in[k]; } else { - M[m_ptr].sum += M[m_ptr].mag_spec[k]; + M[m_ptr].sum += M[m_ptr].pow[k]; } } } @@ -225,13 +227,19 @@ void get_noise(void) { } } - noise = M[min_index].mag_spec; + noise = M[min_index].pow; } // Low pass filter X(w) void low_pass_filter(void) { - + int w; + float temp; + for (w = 0; w < FFTLEN; ++w) { + temp = power_in[w]; + power_in[w] = (1-K)*power_in[w] + K*lpf[w]; + lpf[w] = temp; + } } /******************************** process_frame() ***********************************/ @@ -272,30 +280,34 @@ void process_frame(void) // Perform the FFT fft(FFTLEN, fft_out); + // calculate the power spectrum + for (k = 0; k < FFTLEN; ++k) { + power_in[k] = pow(fft_out[k].r, 2) + pow(fft_out[k].i, 2); + } + + //low_pass_filter(); + // Get average of fft_out and write to Spectrum write_spectrum(); - + // Set the noise get_noise(); - // alpha*... if(frame_ctr > MAX_COUNT-1) { int i; - float x_val; frame_ctr = 0; if(++m_ptr == NUM_M) m_ptr = 0; M[m_ptr].sum = 0; for(i = 0; i < FFTLEN; ++i) { - x_val = cabs(fft_out[i]); - M[m_ptr].mag_spec[i] = x_val; - M[m_ptr].sum += x_val; + M[m_ptr].pow[i] = power_in[i]; + M[m_ptr].sum += power_in[i]; } } // max(lambda, |N(w)/g(w)| for (k = 0; k < FFTLEN; ++k) { float g; - mag_N_X = 1 - alpha * noise[k]/cabs(fft_out[k]); + mag_N_X = sqrt(1 - alpha * noise[k]/power_in[k]); g = mag_N_X > lambda ? mag_N_X : lambda; fft_out[k] = rmul(g, fft_out[k]); } |