1

関数をMatLabからC++に変換しています。この関数は、ベクトルを取り、600の値を含み、200の間隔で変化するブロックに分割されます。関数は次のとおりです(MatLabの場合)。

function f = block(v, N, M)

% This function separates the vector  
% into blocks.  Each block has size N.
% and consecutive blocks differ in
% their starting positions by M
% 
% Typically
%    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

終わり

そしてC++の関数:

vector< iniMatrix > Audio::something(vector<double>& theData, int N, int M)
{
//How many blocks of size N can we get?
int num_blocks = theData.size() / N;

int n = theData.size();
int maxblockstart = n - N;
int lastblockstart = maxblockstart - (maxblockstart % M);
int numbblocks = (lastblockstart)/M + 1;

this->width = N;

//Create the vector with enough empty slots for num_blocks blocks
vector<iniMatrix> blocked(num_blocks);

//Loop over all the blocks
for(int i = 0; i < num_blocks; i++) {
    //Resize the inner vector to fit this block            
    blocked[i].resize(N);

    //Pull each sample for this block
    for(int j = 0; j < N; j++) {
        blocked[i][j] = theData[i*N+j];
    }
}
return blocked;

}

これは正しいように見えますか?奇妙な質問だと思います。おそらく負のフィードバックが返ってくるでしょうが、ゼロクロッシングの数を数えてみたところ、間違った答えが表示されたので、ベクトルの分割方法に問題がある可能性があります。

編集:

iniMatrixは2Dベクトルのtypedefです

96ブロック(600個の値を含む)を生成します

4

1 に答える 1

1

あなたが持っている

f(i,j) = v((i-1)*M+j);

Matlabコードの最後のループでは、C++コードでは

blocked[i][j] = theData[i*N+j];

エラーにつながる可能性のある誤植があるようです。たとえば、C++でコードを作成する必要があります。

blocked[i][j] = theData[i*M+j];
于 2012-11-15T05:55:19.120 に答える