aboutsummaryrefslogtreecommitdiffstats
path: root/Project/RTDSP/enhance.c
diff options
context:
space:
mode:
Diffstat (limited to 'Project/RTDSP/enhance.c')
-rw-r--r--Project/RTDSP/enhance.c33
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();