function [y,noise] = Gnoisegen(x,snr)
% Gnoisegen函数是叠加高斯白噪声到语音信号x中
% [y,noise] = Gnoisegen(x,snr)
% x是语音信号,snr是设置的信噪比,单位为dB
% y是叠加高斯白噪声后的带噪语音,noise是被叠加的噪声
noise=randn(size(x)); % 用randn函数产生高斯白噪声
Nx=length(x); % 求出信号x长
signal_power = 1/Nx*sum(x.*x); % 求出信号的平均能量
noise_power=1/Nx*sum(noise.*noise);% 求出噪声的能量
noise_variance = signal_power / ( 10^(snr/10) ); % 计算出噪声设定的方差值
noise=sqrt(noise_variance/noise_power)*noise; % 按噪声的平均能量构成相应的白噪声
y=x+noise; % 构成带噪语音
function f=F(w,x, y,~,gama)
f=gama/2*norm(w)+norm(x*w-y);
% for i=1:(N-1)
% y=y+(1-x(i))^2+100*(x(i+1)-x(i)^2)^2;
end
function g=G(w,x,y, N,gama)
g=zeros(N,1);
g(1)=gama*w(1)-x(1)*(x(1)*w(1)-y(1));
for i=2:N
g(i)=gama*w(i)-x(i)*(x(i)*w(i)-y(i));
end
% g(1)=2*(x(1)-1)+400*(x(1)^3-x(2)*x(1));
% for i=2:(N-1)
% g(i)=200*(x(i)-x(i-1)^2)+2*(x(i)-1)+400*(x(i)^3-x(i+1)*x(i));
% end
% g(N)=200*(x(N)-x(N-1)^2);
end
function y= Y(w,x,~)
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
y=Gnoisegen(x*w,0.2);
% y=0;
% for i=1:m
% y=y+Gnoisegen(x(i)*w(i),0.2);
% end
end
clc;
clear all;
n=100;
m=100;
gama=1; %待求
t=1;%待求
w_ture=randn(n,1);
%cosi=wgn(m);%cosi服从高斯分布,未实现
w_k=zeros(n,1);
a_0=0;
b_0=10;
k=0;
eps=0.1;
error=randn(n,1);
i=0;
DX=b_0-a_0;
x=randn(m,n);
while norm(error)>=eps
k=k+1;
fprintf('k=%d\n',k);
y_k=Y(w_k,x,m);
y_k_ture=Y(w_ture,x,m);
objective_f=F(w_k,x,y_k,m,gama);
f_diff=G(w_k,x,y_k,m,gama);
% objective_f=gama/2*norm(w_k)+norm(x*w_k-y_k);
% f_diff=gama*w_k+2*x*(x*w_k-y_k);
data_w=-f_diff;
%line search using golden-section
while DX>0.05
i=i+1;
a=b_0-0.618*(b_0-a_0);
b=a_0+0.618*(b_0-a_0);
new_w_a=w_k+a*f_diff;
new_w_b=w_k+b*f_diff;
object_a=F(new_w_a,x,y_k,m,gama);
object_b=F(new_w_b,x,y_k,m,gama);
% objet_a=gama/2*norm(new_w_a)+norm(x*new_w_a-y_k);
% objet_b=gama/2*norm(new_w_b)+norm(x*new_w_b-y_k);
if object_a<=object_b
a_0=a;
elseif object_a>object_b
b_0=b;
end
DX=abs(b_0-a_0);
if DX<=0.05
t=(a_0+b_0)/2;
fprintf('optim_t=%.4f',t);
fprintf('iter_times=%.1f',i);
break;
end
end
w_k_plus=w_k+t*data_w;
error=norm(y_k_ture-y_k)/norm(y_k_ture);
if error<eps
fprintf('w_iter_times=%d',k);
% fprintf('optim_w=%.3f',w_k)
w_k
break;
else
w_k=w_k_plus;
end
end
1.请问X的生成和目标函数F的求取有没有问题?
2.请问如果我这样生成X是正确的,我该怎么去用k折交叉验证去求gama?
3.请问我的line search即线搜索是对的吗?我跑出的最优t似乎和b的设值大小有关
我做了大半天了,挺苦恼的,望解答,谢谢大家!