Я пытаюсь разработать класс сигнала, который включает функцию фильтра 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. Есть ли что-то, что я делаю неправильно в своей функции?
Одна проблема, которую я вижу, это то, что вы объявляете sum1
а также sum2
как целые числа, когда они должны быть двойными. Чтобы избежать подобных ошибок в будущем, вы должны попытаться настроить свой компилятор так, чтобы он предупреждал о неявных преобразованиях. В g ++ это достигается с помощью флага -Wconversion.
Других решений пока нет …