【问题标题】:Infinite Impluse Response (IIR) Function无限脉冲响应 (IIR) 功能
【发布时间】:2013-01-02 21:10:28
【问题描述】:

我正在尝试设计一个包含 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 给出的相同系数。我的功能有什么做错了吗?

【问题讨论】:

  • 最好使用 const 引用 coefA 和 coefB 而不是复制整个向量
  • 您忘记删除 temp 数组。这将是内存泄漏

标签: c++ function matlab filtering signal-processing


【解决方案1】:

我可以看到的一个问题是,您将 sum1 和 sum2 声明为整数,而它们应该是双精度数。为避免将来出现此类错误,您应该尝试将编译器配置为警告隐式转换。在 g++ 中,这是使用 -Wconversion 标志完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多