[未答复] matlab用阻尼高斯牛顿算法恢复已知信号,出现与原信号的负值,结果有时候相差一个正负号的差距。希望帮助我把负信号这种情况去掉。

[复制链接]
kang' 发表于 2022-5-9 14:16:00
clear;clc;
x=[2 0 0 -1 0 -1.5 0 0 0 0 0 0]'; %要恢复的原始信号,用的DGN,阻尼高斯牛顿法
N=12;n=6;delta=1e-4;L=100;
y=fft(x);S=[1 4 6];Z=[2;-1;-1.5];%Z为原值
IN=eye(N);Us=IN(:,S(:)); %其实就是将x=Us*Z,恢复Z就是恢复x.
s=length(S);t0=0.5;
Y=abs(y).*abs(y);
z0=randn(s,1)+randn(s,1)*1i;   
for k=1:N          %构造傅里叶变换频域矩阵A
    for j=1:N
        F(k,j)=exp(-2*pi*1i*(k-1)*(j-1)/N);
    end
end
for i=1:N
    A(:,:,i)=F(i,:)'*F(i,:);     %A不太对,应该是对称的 现在对称了
    B(:,:,i)=Us'*A(:,:,i)*Us; %表示B
end
for jj=1:100
for i=1:N
    JZ0(i,:)=2*(B(:,:,i)*z0).';
    bk(i,1)=Y(i)+z0.'*B(:,:,i)*z0;
end  
z_k=(JZ0'*JZ0)\(JZ0'*bk);
dk=z0-z_k;     
u=min(2*t0,1);
%% 求迭代算法的步长tk
m0=0:1:1000;
for i=1:length(m0)
    k1=0;k2=0;k3=0;
    for j=1:N
        y1=k1+((z0-(1/2)^m0(i)*u*dk).'*B(:,:,j)*(z0-(1/2)^m0(i)*u*dk)-Y(j))^2;
        k=y1;
        y2=k2+(z0.'*B(:,:,j)*z0-Y(j))^2;
        k2=y2;
        y3=k3+(z0.'*B(:,:,j)*z0-Y(j))*B(:,:,j)*z0;
        k3=y3;
    end
    C(1,i)=y1;
    D(1,i)=y2-u*(1/2)^(m0(i)+1)*(4*y3)'*dk;
    m1(1,i)=(C(1,i)<D(1,i));
    if m1(1,i)==1
        break
    end
end
m=length(m1)-1;  
t1=(1/2)^m*u;
z1=z0-t1*dk;
z0=real(z1);%z0= real(z0.*sign(z0.*Z));%如果是实数可以.*不用.’*,但会出现0的情况
if norm((-t1*dk),1)<delta
    break
end
t0=t1;
end
disp(z0)

1 条回复


kang' 发表于 2022-5-10 15:01:43
我明白了,因为目标函数是这样的,正负都可以,不影响其目标函数大小。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表