信号的总能量

时间:2012-09-22 23:16:27

标签: c++ math signals

我已经给出了这个等式来计算信号的总能量:

Ex= ∑ n|x[n]|2 

对我来说,建议您将每个块对齐,然后得到整个块的总和。我想知道我编写的代码/算法是否对于这个等式是准确的,并且我已经以最有效的方式完成了它。

double totalEnergy(vector<double> data, const int rows, const int cols)
{
vector<double> temp;
double energy = 0;

for(int i=0; (i < 2); i++)
{
    for(int j=0; (j < 2); j++)
    {
        temp.push_back( (data[i*2+j]*data[i*2+j]) );
    }
}

energy = accumulate (temp.begin(), temp.begin()+(rows*cols), 0);
return energy;
 }
 int main(int argc, char *argv[]) {

vector<double> data;
data.push_back(4);
data.push_back(4);

data.push_back(4);
data.push_back(4);

totalEnergy(data, 2, 2);

 }

结果:64

任何帮助/建议将不胜感激:)!

1 个答案:

答案 0 :(得分:2)

这当然不是执行此计算的最有效方法,尽管我认为实现几乎是正确的:但n的乘法不知何故丢失了。由于我无法看到总和索引和界限是什么,我不打算解决这个问题,但我会重现实现的结果,只是“更好”。有两点可以改进:

  1. 代码不会在特定列或行中使用。也就是说,它也可以将输入视为一个扁平数组,其大小实际上是从输入向量的大小得知的。
  2. 该函数使用两个临时向量(一个传递给函数,一个传递给函数)。创建std::vector<T>需要分配不是廉价操作的内存。
  3. 作为第一个近似值,我会就地转换输入向量,然后累加结果:

    double square(double value) {
        return value * value;
    }
    
    double totalEnergy(std::vector<double> data) {
        std::transform(data.begin(), data.end(), data.begin(), &square);
        return std::accumulate (data.begin(), data.end(), 0);
    }
    

    该功能仍可复制数据并对其进行修改。我不喜欢这个。奇怪的是,你实现的操作基本上是矢量与其自身的内积,即,这产生相同的结果,而不创建额外的矢量:

    double totalEnergy(std::vector<double> const& data) {
        return std::inner_product(data.begin(), data.end(), data.begin(), 0);
    }
    

    假设这实现了正确的公式(尽管我仍然怀疑原始公式中的n),这可能要快得多。它似乎也更简洁......