1

我有一个 2D 向量,我需要计算块内所有元素的总和(是的 - 我之前已经问过这个问题,但是,我需要进一步的帮助)..

基本上,在 MATLAB 中我得到的结果是:0.4259,而在 C++ 中我得到的结果是:1270.91。

首先,我按照以下算法(IN MATLAB)将矩阵(1D)拆分为块(600x200):

function f = block(v, N, M)
%   N = 30 msec (600 samples)
%   M = 10 msec (200 samples)

n = length(v);
maxblockstart = n - N + 1;
lastblockstart = maxblockstart - mod(maxblockstart-1 , M);

% Remove the semicolon to see the number of blocks
% numblocks = (lastblockstart-1)/M + 1
  numblocks = (lastblockstart-1)/M + 1;

f = zeros(numblocks,N);

for i = 1:numblocks
 for j = 1:N
   f(i,j) = v((i-1)*M+j);
end
end

这在 C++ 中:

vector< vector<double> > Audio::something(vector<double>& theData, int N, int M)
{
int n = theData.size();
int maxblockstart = n - N;
int lastblockstart = maxblockstart - (maxblockstart % M);

int numblocks = (lastblockstart)/M + 1;
vector< vector<double> > subBlock;
vector<double> temp;
this->width = N;
this->height = numblocks;

subBlock.resize(600*187);
for(int i=0; (i < 600); i++)
{
    subBlock.push_back(vector<double>());
    for(int j=0; (j < 187); j++)
    {   
        subBlock[i].push_back(theData[i*N+j]);
    } 
}    
return subBlock;

}

这对我来说看起来非常好,我看不出它有什么问题。

现在求和,在 MATLAB 中:

len = length(blocks);
n = sum(size(blocks)) - len;
min = n+1;
max = 0;

for i = 1:n
  currsum = abs(blocks(i,1:len));
end
f = currsum;

在 C++ 中:

vector<double>     Audio::filter(vector<iniMatrix>&blocks, double sumThres, double ZeroThres)
{
int n = this->height;

int min = n+1;
int max = 0;
int length = blocks.size();
double currsum = 0;

for(int i=0; (i < 600); i++)
{
    for(int j=0; (j < 187); j++)
    {
        currsum += abs(blocks[j][i]);
        //currsum = currsum / 600;
        //cout << abs(blocks[0][j]) << endl;
        //cout << currsum << endl;
    }
}
cout << currsum;

}

我似乎找不到哪里出错了。我正在按照算法精确到点,但不明白为什么数字如此之高。我在 MATLAB 中做了一些输出,发现了这个:

    Columns 1 through 10

    0.0013    0.0011    0.0010    0.0009    0.0012    0.0012    0.0012    0.0014    0.0016    
    0.0016

  Columns 11 through 20

    0.0017    0.0019    0.0018    0.0014    0.0011    0.0011    0.0012    0.0010    0.0010    
    0.0011

  Columns 21 through 30

    0.0011    0.0010    0.0009    0.0006    0.0005    0.0002    0.0003    0.0007    0.0008    
    0.0009

.. 这一直持续到 600(计数/显示 9 个值)。

这是否意味着 MATLAB 仅将这些值(每列 9 个值)求和 600 次?

我真的很困惑,希望有人可以帮助我:)!

4

1 回答 1

2

您的 MATLAB 代码实际上并未执行求和。你的第一个线索应该是你的输出是一个向量而不是一个标量。您正在调用abs()每个包含 600 个值的块(这会产生另一个 600 个元素的向量),并且每次都用该向量覆盖 currsum。

我不知道为什么您的代码包含 sum(size(blocks)),但是对于总和,请尝试

f = sum(sum(abs(blocks)));

其他注意事项:在 MATLAB 中,将每个窗口存储为列而不是行更为典型。如果您有信号处理工具箱,请使用该命令buffer从单个命令生成重叠窗口。然后,sum默认情况下,类似的命令将在列下运行,因此您可以调用一次并获取每个窗口的总和。

于 2012-09-28T20:04:00.870 回答