diff options
Diffstat (limited to 'Project/RTDSP/enhance.c')
-rw-r--r-- | Project/RTDSP/enhance.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/Project/RTDSP/enhance.c b/Project/RTDSP/enhance.c index e77a82c..45a0060 100644 --- a/Project/RTDSP/enhance.c +++ b/Project/RTDSP/enhance.c @@ -92,25 +92,27 @@ complex *fft_out; /* FFT output */ 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; float *M[NUM_M]; float mag_N_X; float K; -float time_constant = 50E-6; /* Time constant in ms */ +static float time_constant = 40e-3; /* Time constant in ms */ int started = 0; /******************************* Function prototypes *******************************/ void init_hardware(void); /* Initialize codec */ void init_HWI(void); /* Initialize hardware interrupts */ void ISR_AIC(void); /* Interrupt service routine for codec */ void process_frame(void); /* Frame processing routine */ - +void write_spectrum(void); +void get_noise(void); +void low_pass_filter(void); /********************************** Main routine ************************************/ void main() { @@ -127,6 +129,7 @@ void main() 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 */ + lpf = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ mag_in = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ noise = (float *) calloc(FFTLEN, sizeof(float)); /* Output window */ @@ -149,11 +152,8 @@ void main() for (k = 0; k < NUM_M; ++k) { M[k] = (float *) calloc(FFTLEN, sizeof(float)); } - - // initializing the value to estimate the low pass filter - K = exp(- TFRAME / time_constant); - + K = exp(-TFRAME/time_constant); /* main loop, wait for interrupt */ while(1) process_frame(); } @@ -204,6 +204,7 @@ void write_spectrum(void) { } } +// Noise estimataion void get_noise(void) { int k, i, min_i; float min_val; @@ -220,6 +221,18 @@ void get_noise(void) { noise[k] = alpha * M[min_i][k]; } } + + +// 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() ***********************************/ void process_frame(void) @@ -249,7 +262,7 @@ void process_frame(void) } /************************* DO PROCESSING OF FRAME HERE **************************/ - + // Initialise the array fft_out for FFT for (k = 0; k < FFTLEN; ++k) { fft_out[k] = cmplx(inframe[k], 0.0); @@ -262,6 +275,8 @@ void process_frame(void) for (k = 0; k < FFTLEN; ++k) { power_in[k] = sqrt(fft_out[k].r * fft_out[k].r + fft_out[k].i * fft_out[k].i); } + + //low_pass_filter(); // Get average of fft_out and write to Spectrum write_spectrum(); |