请问如何实现多次仿真结果仿真?

请问如何实现多次仿真结果仿真?
问题描述:以下代码是仿真一次得到的结果,如何得到仿真100次以上的结果,并绘制出类似下面的图片。
其中结果一个为方位角,一个为俯仰角。(图片是仿真几百次后点的汇集点)

img

clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;%阵元间隔
dx=0:dd:(kelmx-1)*dd;%X轴阵元分布
dy=0:dd:(kelmy-1)*dd;%Y轴阵元分布
iwave=3;%目标数
L=iwave;
theta1=[10 30 50];%波达方向
theta2=[15 35 55];%波达方向
snr=20;%信噪比(dB)
n=200;%快拍数
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));%X轴上阵元对应的方向矩阵
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));%Y轴上阵元对应的方向矩阵
S=randn(iwave,n);
X0=Ax*S;%接收信号
X=awgn(X0,snr,'measured');%加入高斯白噪声
Y0=Ay*S;
Y=awgn(Y0,snr,'measured');
Rxy=X*Y';%协方差矩阵
P=5;
Q=6;

...............%构造增广矩阵%................
Re=[];
for kk=1:kelmx-P+1
    Rx=[];
    for k=1:P
        Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
    end
    Re=[Re,Rx];
end

...............%估计uk和vk%................
[Ue,Se,Ve]=svd(Re);
Uesx=Ue(:,1:L);
Uesx1=Uesx(1:(P-1)*Q,:);
Uesx2=Uesx(Q+1:P*Q,:);
Fx=pinv(Uesx1)*Uesx2;
[EVx,Dx]=eig(Fx);
EVAx=diag(Dx).';
for im=1:Q
    Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
end
Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);%估计出uk
EVAy=EVAy(:,Py);%估计出vk

...............%估计出DOA%................
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;

引用函数

function R=R_hankel(m,Rxy,N,Q)
R1=[];
R2=[];
for mm=1:Q
    R1=[R1;Rxy(m,mm)];
end
for i=1:N-Q+1
    R2=[R2,Rxy(m,i+Q-1)];
end
R=hankel(R1,R2);


引用chatgpt的回答:
要实现多次仿真结果的仿真,可以使用循环语句,对仿真部分的代码进行多次重复运行。具体而言,可以将仿真代码放在一个 for 循环中,每次循环生成一组随机数据,然后调用相同的仿真函数进行仿真,最后将得到的结果保存下来。

以下是一个基于你提供的代码修改后的示例,它可以进行 100 次仿真,并将结果保存下来:

clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;%阵元间隔
dx=0:dd:(kelmx-1)*dd;%X轴阵元分布
dy=0:dd:(kelmy-1)*dd;%Y轴阵元分布
iwave=3;%目标数
L=iwave;
theta1=[10 30 50];%波达方向
theta2=[15 35 55];%波达方向
snr=20;%信噪比(dB)
n=200;%快拍数
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));%X轴上阵元对应的方向矩阵
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));%Y轴上阵元对应的方向矩阵
S=randn(iwave,n);

for iter=1:100 % 进行 100 次仿真
    disp(['Iteration ', num2str(iter)]);
    
    X0=Ax*S;%接收信号
    X=awgn(X0,snr,'measured');%加入高斯白噪声
    Y0=Ay*S;
    Y=awgn(Y0,snr,'measured');
    Rxy=X*Y';%协方差矩阵
    P=5;
    Q=6;

    ...............%构造增广矩阵%................
    Re=[];
    for kk=1:kelmx-P+1
        Rx=[];
        for k=1:P
            Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
        end
        Re=[Re,Rx];
    end

    ...............%估计uk和vk%................
    [Ue,Se,Ve]=svd(Re);
    Uesx=Ue(:,1:L);
    Uesx1=Uesx(1:(P-1)*Q,:);
    Uesx2=Uesx(Q+1:P*Q,:);
    Fx=pinv(Uesx1)*Uesx2;
    [EVx,Dx]=eig(Fx);
    EVAx=diag(Dx).';
    for im=1:Q
        Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
    end
    Uesy1=Uesy(1:(Q-1)*P,:);
    Uesy2=Uesy(P+1:P*Q,:);
    Fy=pinv(Uesy1)*Uesy2;
    [EVy,Dy]=eig(Fy);
    EVAy=diag(Dy)';
    F=0.5*Fx+0.5*Fy;
    [EV,D]=eig(F);
    P1=EV\EVx;
    P2=EV\EVy;
    P1=abs(P1);
    P2=abs(P2);
    P11=P1';
    P21=P2';
    [c,Px]=max(P11);
    [cc,Py]=max(P21);
    EVAx=EVAx(:,Px);%估计出uk
    EVAy=EVAy(:,Py);%估计出vk

    ...............%估计出DOA%................
    theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
    theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
    
    % 将结果保存
    results(iter).theta1 = theta10;
    results(iter).theta2 = theta20;

end

% 绘制图像
figure;
for iter=1:100
    plot(results(iter).theta2, results(iter).theta1, 'b.');
    hold on;
end
xlabel('俯仰角');
ylabel('方位角');
title('多次仿真结果');

在上述代码中,我们使用了一个 for 循环来重复运行 100 次仿真部分的代码,并将得到的每组 DOA 结果保存到一个结构体数组中。最后,可以根据这些结果绘制出类似于你提供的图片的散点图。

根据你的代码修改调试后,这个是循环10次的,需要循环100次,就改一下这两个地方为100即可:num_simulations = 100,for sim=1:100,代码如下:


clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;
dx=0:dd:(kelmx-1)*dd;
dy=0:dd:(kelmy-1)*dd;
iwave=3;
L=iwave;
theta1=[10 30 50];
theta2=[15 35 55];
snr=20;
n=200;
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));

num_simulations = 10;
theta10_all = zeros(length(theta1),num_simulations);
theta20_all = zeros(length(theta1),num_simulations);

for sim=1:num_simulations
    
    S=randn(iwave,n);
    X0=Ax*S;
    X=awgn(X0,snr,'measured');
    Y0=Ay*S;
    Y=awgn(Y0,snr,'measured');
    Rxy=X*Y';
    P=5;
    Q=6;

    Re=[];
    for kk=1:kelmx-P+1
        Rx=[];
        for k=1:P
            Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
        end
        Re=[Re,Rx];
    end

    [Ue,Se,Ve]=svd(Re);
    Uesx=Ue(:,1:L);
    Uesx1=Uesx(1:(P-1)*Q,:);
    Uesx2=Uesx(Q+1:P*Q,:);
    Fx=pinv(Uesx1)*Uesx2;
    [EVx,Dx]=eig(Fx);
    EVAx=diag(Dx).';
    for im=1:Q
        Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
    end
    Uesy1=Uesy(1:(Q-1)*P,:);
    Uesy2=Uesy(P+1:P*Q,:);
    Fy=pinv(Uesy1)*Uesy2;
    [EVy,Dy]=eig(Fy);
    EVAy=diag(Dy)';
    F=0.5*Fx+0.5*Fy;
    [EV,D]=eig(F);
    P1=EV\EVx;
    P2=EV\EVy;
    P1=abs(P1);
    P2=abs(P2);
    P11=P1';
    P21=P2';
    [c,Px]=max(P11);
    [cc,Py]=max(P21);
    EVAx=EVAx(:,Px);
    EVAy=EVAy(:,Py);

    theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
    theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
    
    theta10_all(:,sim) = theta10;
    theta20_all(:,sim) = theta20;
   
end
 % 绘制汇集点图像
figure;
subplot(2,1,1);
hold on;
for sim=1:10
    % 重新生成数据
    S=randn(iwave,n);
    X0=Ax*S;
    X=awgn(X0,snr,'measured');
    Y0=Ay*S;
    Y=awgn(Y0,snr,'measured');
    Rxy=X*Y';
    Re=[];
    for kk=1:kelmx-P+1
        Rx=[];
        for k=1:P
            Rx=[Rx;R_hankel(k+kk-1,Rxy,kelmy,Q)];
        end
        Re=[Re,Rx];
    end

    [Ue,Se,Ve]=svd(Re);
    Uesx=Ue(:,1:L);
    Uesx1=Uesx(1:(P-1)*Q,:);
    Uesx2=Uesx(Q+1:P*Q,:);
    Fx=pinv(Uesx1)*Uesx2;
    [EVx,Dx]=eig(Fx);
    EVAx=diag(Dx).';
    for im=1:Q
        Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
    end
    Uesy1=Uesy(1:(Q-1)*P,:);
    Uesy2=Uesy(P+1:P*Q,:);
    Fy=pinv(Uesy1)*Uesy2;
    [EVy,Dy]=eig(Fy);
    EVAy=diag(Dy)';
    F=0.5*Fx+0.5*Fy;
    [EV,D]=eig(F);
    P1=EV\EVx;
    P2=EV\EVy;
    P1=abs(P1);
    P2=abs(P2);
    P11=P1';
    P21=P2';
    [c,Px]=max(P11);
    [cc,Py]=max(P21);
    EVAx=EVAx(:,Px);
    EVAy=EVAy(:,Py);

    theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
    theta20=atan(angle(EVAy)./angle(EVAx))*radeg;
end

% 绘制汇集点图像
figure;
subplot(2,1,1);
hold on;
for sim=1:10
    plot(theta20_all(:,sim),theta10_all(:,sim), 'o')
end
xlabel('theta2')
ylabel('theta1')
title('汇集点')

function R=R_hankel(m,Rxy,N,Q)
R1=[];
R2=[];
for mm=1:Q
    R1=[R1;Rxy(m,mm)];
end
for i=1:N-Q+1
    R2=[R2,Rxy(m,i+Q-1)];
end
R=hankel(R1,R2);
end

运行结果如下:

img

要实现多次仿真结果的仿真,可以通过编写一个循环,多次运行仿真程序,并将每次的结果保存下来。具体实现方式取决于仿真程序的编写语言和框架。在每次循环结束后,可以对多次仿真结果进行统计和分析。

要实现多次仿真结果的仿真,可以在现有的代码基础上,添加一个外层循环,每次循环都重复一遍仿真的过程,并将仿真得到的DOA结果保存下来。最后,可以将所有的DOA结果绘制在同一张图上,得到类似于题目中给出的图片。

下面是一个示例代码,其中添加了一个外层循环,重复100次仿真,并将得到的DOA结果保存到一个矩阵中:

clear all
close all
derad=pi/180;
radeg=180/pi;
twpi=2*pi;
kelmx=8;
kelmy=10;
dd=0.5;%阵元间隔
dx=0:dd:(kelmx-1)*dd;%X轴阵元分布
dy=0:dd:(kelmy-1)*dd;%Y轴阵元分布
iwave=3;%目标数
L=iwave;
theta1=[10 30 50];%波达方向
theta2=[15 35 55];%波达方向
snr=20;%信噪比(dB)
n=200;%快拍数
Ax=exp(-i*twpi*dx.'*(sin(theta1*derad).*cos(theta2*derad)));%X轴上阵元对应的方向矩阵
Ay=exp(-i*twpi*dy.'*(sin(theta1*derad).*sin(theta2*derad)));%Y轴上阵元对应的方向矩阵
S=randn(iwave,n);
P=5;
Q=6;

DOA = zeros(2, 100); % 用于保存DOA结果的矩阵

for k = 1:100
    X0=Ax*S;%接收信号
    X=awgn(X0,snr,'measured');%加入高斯白噪声
    Y0=Ay*S;
    Y=awgn(Y0,snr,'measured');
    Rxy=X*Y';%协方差矩阵

    ...............%构造增广矩阵%................
    Re=[];
    for kk=1:kelmx-P+1
        Rx=[];
        for kk=1:P
            Rx=[Rx;R_hankel(kk+kk-1,Rxy,kelmy,Q)];
        end
        Re=[Re,Rx];
    end

    ...............%估计uk和vk%................
    [Ue,Se,Ve]=svd(Re);
    Uesx=Ue(:,1:L);
    Uesx1=Uesx(1:(P-1)*Q,:);
    Uesx2=Uesx(Q+1:P*Q,:);
    Fx=pinv(Uesx1)*Uesx2;
    [EVx,Dx]=eig(Fx);
    EVAx=diag(Dx).';
    for im=1:Q
        Uesy(((im-1)*P+1):P*im,:)=Uesx(im:Q:(im+Q*(P-1)),:);
    end
    Uesy1=Uesy(1:(Q-1)*P,:);
Uesy2=Uesy(P+1:P*Q,:);
Fy=pinv(Uesy1)*Uesy2;
[EVy,Dy]=eig(Fy);
EVAy=diag(Dy)';
F=0.5*Fx+0.5*Fy;
[EV,D]=eig(F);
P1=EV\EVx;
P2=EV\EVy;
P1=abs(P1);
P2=abs(P2);
P11=P1';
P21=P2';
[c,Px]=max(P11);
[cc,Py]=max(P21);
EVAx=EVAx(:,Px);%估计出uk
EVAy=EVAy(:,Py);%估计出vk

...............%估计出DOA%................
theta10=asin(sqrt((angle(EVAx)/pi).^2+(angle(EVAy)/pi).^2))*radeg;
theta20=atan(angle(EVAy)./angle(EVAx))*radeg;

% 将DOA结果保存到矩阵中
DOA(:, k) = [theta10; theta20];
end

% 绘制DOA散点图
figure;
scatter(DOA(2,:), DOA(1,:), '.');
xlabel('Azimuth angle (degree)');
ylabel('Elevation angle (degree)');
title('DOA Scatter Plot');


在上面的代码中,我们添加了一个名为DOA的2行100列的矩阵,用于保存重复100次仿真后得到的DOA结果。在每次仿真结束后,将得到的DOA结果存入DOA矩阵中的第k列。最后,我们使用scatter函数绘制散点图,横坐标为DOA结果中的方位角,纵坐标为DOA结果中的俯仰角,可以得到类似于题目中给出的图片。

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7625819
  • 你也可以参考下这篇文章:去除数字滤波器后的相位延迟(内有实操代码和效果图)
  • 除此之外, 这篇博客: 牛客网部分面试题整理中的 (二)判断当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 参考:https://www.cnblogs.com/sum-41/p/10799555.html

    程序中有两种参数传递:

    • 值传递,是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
    • 引用传递,是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    Java中都是值传递,只不过对于引用类型参数,值的内容是对象的引用。 当是基本类型时修改副本不能影响原值,而当是对象时,此时副本是地址,修改的是这个地址指向的对象,所以会影响原对象。(其实并没有定论,有的人说有引用传递,而在Java核心技术卷1和 疯狂java讲义中都说只有值传递)

    简单来说就是,当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用(地址)对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

    有的时候传递引用参数时,可能会产生引用传递的错觉,是因为参数保存的是实际对象的地址值,你改变的只是地址值指向的堆内存中的实际对象,并没有真正改变参数,参数的地址值没有变。

  • 您还可以看一下 王西猛老师的网络技术之局域网及网络故障排除课程中的 网络测试硬件工具及网线不通补救技巧小节, 巩固相关知识点