1

IIR フィルター関数を含むシグナル クラスを設計しようとしています。以下は私のコードです:

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 が提供する同じ係数も使用します。私の機能で間違っていることはありますか?

4

1 に答える 1

3

私が見ることができる1つの問題は、あなたが宣言していることsum1でありsum2、それらがdoubleであるべきときに整数としてです。将来この種のエラーを回避するには、暗黙的な変換を警告するようにコンパイラーを構成してみてください。g ++では、これは-Wconversionフラグを使用して実行されます。

于 2013-01-19T04:58:09.020 に答える