版权声明:转载请注释 https://blog.csdn.net/xinshuwei/article/details/84035009
//输出二分类问题
Type Neural_Work(Type*data,int datalength=10240,int fs=48000)
{
MatrixXd W1(25,24);
MatrixXd W2(2,25);
VectorXd xmin(24);
VectorXd xmax(24);
for (int i = 0; i < xmin.size(); i++)
{
xmin[i] = x1_xmin[i];
xmax[i] = x1_max[i];
}
for (int i = 0; i < 25; i++)
{
for (int j = 0; j < 24; j++)
{
W1(i, j) = w1[i * 24 + j];
}
}
for (int i = 0; i < 2; i++)
{
for (int j=0; j < 25; j++)
{
W2(i, j) = w2[i * 25 + j];
}
}
VectorXd xx(datalength);
for (int i = 0; i < datalength; i++)
{
xx(i) = data[i];
}
VectorXd x_data1 = mapminmax(xx,-1,1);
MatrixXd Cn2 = mfcc_m(x_data1.data(), datalength, fs, 24, 1024, 512);
int m = (int)Cn2.rows();
int n = (int)Cn2.cols();
//apply 归一化
MatrixXd input_test = mapminmax(Cn2.transpose(), xmin, xmax, 0, 1);
//神经网络输入归一化
VectorXd x_min(24);
x_min= VectorXd::Constant(24, 0);
VectorXd x_max(24);
x_max= VectorXd::Constant(24, 1);
MatrixXd input_data = mapminmax(input_test, x_min, x_max, -1, 1);
//隐层(第一层)
MatrixXd y1 = W1*input_data;
for (int i = 0; i < y1.rows(); i++)
y1.row(i).array() += B1[i];
MatrixXd y2 = tansig(y1);
//第二层
MatrixXd y3 = W2*y2;
y3.row(0).array() += B2[0];
y3.row(1).array() += B2[1];
//输出归一化
VectorXd xout_min(2);
xout_min = VectorXd::Constant(2, -1);
VectorXd xout_max(2);
xout_max = VectorXd::Constant(2, 1);
MatrixXd out = mapminmax(y3, xout_min, xout_max, 0, 1);
Type hitnum = 0;
for (int i = 0; i < 15; i++)
{
hitnum = y3.row(0)[i] > y3.row(1)[i] ? hitnum + 1 : hitnum;
}
hitnum = hitnum > 7 ? 1 : 0;
return hitnum;
}
神经网络模型