问题流程如下图所示
w与q为容量相等的列向量
q与w点乘得到Q
每个q会算出一个AC
当AC不小于20时直接输出,当AC小于20时,反回初始w,用神经网络更新w中的元素,得到新的w再重复运算,直到满足条件
目前遇到的问题为,神经网络的种类和框架不太明白
编码软件:本人更加熟悉matlab的编程,希望答主能用matlab编码,最好能带注释
下面的代码为我的基础代码
需解决的问题为倒数两行要插入如流程图所示的神经网络循环训练,得到需要的AC值
AC的期望值为20
%%初始条件
Y=2;M=1;fs=4000;T=4;
%%计算每一组数据的AC
for n=1:T*fs%总共T*fs组数据,一组数据2M*Y个,最后会得到T*fs个AC值
t=n/fs;
xb1=0.5*sin(2*pi*15*t);xb2=2*sin(2*pi*40*t);xd1=2*sin(2*pi*15*t);xd2=0.5*sin(2*pi*40*t);
yb1=fft(xb1);yb2=fft(xb2);yd1=fft(xd1);yd2=fft(xd2);
yb=[yb1,yb2];yd=[yd1,yd2];
Ab=abs(yb);Ad=abs(yd);
Gb=reshape(Ab,M,Y);Gd=reshape(Ad,M,Y);
Rb=Gb'*Gb/M;Rd=Gd'*Gd/M;
%解权向量q,求AC
[V,D]=eig(Rd'*Rb);
eigenvalue=diag(D);
lamda=max(eigenvalue);
for i=1:length(Rd'*Rb)
if lamda==eigenvalue(i)
break;
end
end
q=V(:,i);
AC(n)=10*log10((q'*Rb*q)/(q'*Rd*q));
end
定义一个变量来存储AC的总和,每次计算AC时将其加到总和中,总和在除以AC的数量,试一试训练过程这么写:
%定义常量
Y = 2;
M = 1;
fs = 4000;
T = 4;
%定义神经网络
net = feedforwardnet(10); %使用前馈神经网络
net.trainFcn = 'trainlm'; %使用Levenberg-Marquardt算法进行训练
net.layers{1}.transferFcn = 'tansig'; %第一层使用tansig激活函数
%初始化权重和AC总和
w = ones(1, T * fs);
ac_sum = 0;
%% 计算每一组数据的AC
for n = 1 : T * fs %总共 T*fs 组数据, 一组数据 2M*Y 个, 最后会得到 T*fs 个 AC 值
t = n / fs;
xb1 = 0.5 * sin(2*pi*15*t); xb2 = 2 * sin(2*pi*40*t); xd1 = 2 * sin(2*pi*15*t); xd2 = 0.5 * sin(2*pi*40*t);
yb1 = fft(xb1); yb2 = fft(xb2); yd1 = fft(xd1); yd2 = fft(xd2);
yb = [yb1, yb2]; yd = [yd1, yd2];
Ab = abs(yb); Ad = abs(yd);
Gb = reshape(Ab,M,Y); Gd = reshape(Ad,M,Y); % 将向量重新排列成矩阵
Rb = Gb' * Gb / M; Rd = Gd' * Gd / M; % 计算协方差矩阵
[V,D] = eig(Rd' * Rb);
eigenvalue = diag(D);
lamda = max(eigenvalue);
for i = 1 : length(Rd' * Rb)
if lamda == eigenvalue(i)
break;
end
end
q = V(:,i);
AC(n) = 10*log10((q' * Rb * q) / (q' * Rd * q));
%将AC加到总和中
ac_sum = ac_sum + AC(n);
%神经网络循环训练
if AC(n) < 20
input = w(n);
output = AC(n);
[net,~] = train(net, input, output); %更新权重
w(n+1) = net(input); %传入下一个权重
else
w(n+1) = w(n);
end
end
%计算期望值
ac_mean = ac_sum / (T * fs);
%输出期望值
fprintf('AC期望值为:%f\\n', ac_mean);