00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifdef WIN32
00016 #pragma warning (disable:4786)
00017 #endif
00018
00019 #include "inverse_echofilter_generic.h"
00020 #include <memory>
00021
00022 CL_InverseEchoFilter::CL_InverseEchoFilter(int buffer_size)
00023 {
00024 impl = new CL_InverseEchoFilter_Generic;
00025 impl->buffer_size = buffer_size;
00026 impl->pos = 0;
00027
00028 impl->buffer = new int[buffer_size*2];
00029 memset(impl->buffer, 0, sizeof(int)*buffer_size*2);
00030 }
00031
00032 CL_InverseEchoFilter::~CL_InverseEchoFilter()
00033 {
00034 delete[] impl->buffer;
00035 delete impl;
00036 }
00037
00038 void CL_InverseEchoFilter::filter(int *data, int size)
00039 {
00040 int *buffer = impl->buffer;
00041 int &pos = impl->pos;
00042 int &buffer_size = impl->buffer_size;
00043
00044 int delay = buffer_size / 4;
00045 for (int i=0; i<size*2; i++)
00046 {
00047 buffer[pos] = data[i];
00048
00049 int res = 0;
00050 for (int j=0; j<4; j++)
00051 {
00052 int p = pos+delay*j;
00053 if (p > buffer_size) p -= buffer_size;
00054
00055 res += buffer[p]*2 / (5-j);
00056 }
00057
00058 data[i] = res;
00059
00060 pos++;
00061 if (pos == buffer_size) pos = 0;
00062 }
00063 }