2013-01-19 1 views
1

IIR 필터 기능을 포함하는 신호 클래스를 설계하려고합니다. ,IIR (Infinite Impluse Response) 기능

void signal::IIRFilter(vector<double> coefA, vector<double> coefB){ 
double ** temp; 
temp = new double*[_nchannels]; 
for(int i = 0; i < _nchannels; i++){ 
    temp[i] = new double[_ninstances]; 
} 
for(int i = 0; i < _nchannels; i++){ 
    for(int j = 0; j < _ninstances; j++){ 
     temp[i][j] = 0; 
    }  
} 
for(int i = 0; i < _nchannels; i++){ 
    for (int j = 0; j < _ninstances; j++){ 
     int sum1 = 0; 
     int sum2 = 0; 
     for(int k = 0; k < coefA.size(); k++){ 
      if ((j-k) > 0){ 
       sum1 += coefA.at(k)*temp[i][j-k-1]; 
      } 

     } 
     for (int m = 0; m < coefB.size(); m++){ 
      if(j >= m){ 
       sum2 += coefB.at(m)*_data[i][j-m]; 
      } 
     } 
     temp[i][j] = sum2-sum1; 
    } 
} 
for(int i = 0; i < _nchannels; i++){ 
    for(int j = 0; j < _ninstances; j++){ 
     _data[i][j] = temp[i][j]; 
    }  
} 
} 

_data 내 원래의 신호가 포함되어 샘플 내 번호가 _ninstances 및 _nchannels 채널의 수이다 : 다음은 내 코드입니다. 이 함수는 컴파일되고 작동하지만, 얻는 결과는 MATLAB이 제공 한 결과와 다릅니다. 나는 심지어 MATLAB에서 주어진 것과 같은 계수를 사용합니다. 내 기능에서 잘못하고있는 것이 있습니까?

+2

전체 벡터를 복사하는 대신'coefA'와'coefB'에 const 참조를 사용하는 것이 더 낫습니다 – borisbn

+2

'temp' 배열을 삭제하는 것을 잊었습니다. 메모리 누수가 될 것입니다. – borisbn

답변

3

내가 볼 수있는 한 가지 문제점은 이중이어야 할 때 sum1sum2을 정수로 선언한다는 것입니다. 앞으로 이러한 종류의 오류가 발생하지 않도록하려면 암시 ​​적 변환에 대해 경고하도록 컴파일러를 구성해야합니다. g ++에서는 -Wconversion 플래그를 사용하여이 작업을 수행합니다.