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 コードは実際には合計を実行していません。最初の手がかりは、出力がスカラーではなくベクトルであるということです。600 個の値の各ブロック (別の 600 要素のベクトルになります) を呼び出しabs()、毎回そのベクトルで currsum を上書きします。

コードに sum(size(blocks)) が含まれている理由はわかりませんが、合計については、試してみてください

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

その他の注意: MATLAB では、各ウィンドウを行ではなく列として保存するのが一般的です。Signal Processing Toolbox がある場合は、コマンドを使用してbuffer、1 つのコマンドからオーバーラップ ウィンドウを生成します。次に、次のようなコマンドsumはデフォルトで列を下って動作するため、一度呼び出して各ウィンドウの合計を取得できます。

于 2012-09-28T20:04:00.870 に答える