データのブロックを含む 2D 配列があり、各値がゼロを横切る回数を計算する関数を作成しました。
私は MatLab を使用してコードを変換しようとしていますが、MatLab はゼロクロッシングに対して 287 の値を返し、C++ コードでは値が非常に高く、その理由がわかりません。
Matlab コードは次のとおりです。
function f = zerocross(vector)
% This function simply reports the number of times
% that the input vector crosses the zero boundary
len = length(vector);
currsum = 0;
prevsign = 0;
for i = 1:len
currsign = sign(vector(i));
if (currsign * prevsign) == -1
currsum = currsum + 1;
end
if currsign ~= 0
prevsign = currsign;
end
end
f = currsum;
そして私のC++コード:
vector<iniMatrix> Audio::filter(vector<iniMatrix>&blocks, double sumThres, double ZeroThres)
{
double totalSum = this->width * sumThres;
double totalZero = this->width * ZeroThres;
int currZero = 0;
int currsum = 0;
int prevsign = 0;
for(unsigned i=0; (i < 287); i++)
{
for(int j=0; (j < blocks.size()); j++)
{
currZero = sign<double>(blocks[j][i]);
if(currZero * prevsign == -1)
{
currsum++;
}
if(currZero != 0)
{
prevsign = currZero;
}
}
cout << currsum << endl;
}
return blocks;
サイン機能:
int sign(T n)
{
if(n < 0) return -1;
if(n > 0) return 1;
return n;
}
私がすべき(そしてmatlabが与える)値は次のとおりです。
6, 6, 7, 9, 9, 10 .., 11, ..., 9, ...
私が得る値:
212, 337, 118, 84, ...., 348, ..., 92
誰にもアイデアはありますか?
編集:
これは私が今私のループを持っている方法です:
for(int q=0; (q < 287); q++)
{
for(unsigned i=0; (i < blocks.size()); i++)
{
for(unsigned j=0; (j < blocks[0].size()); j++)
{
currZero = sign<double>(blocks[i][j]);
cout << currZero << endl;
}
cout << endl << endl << endl;
}
//cout << currZero << endl;
}