Amor_matlab 2023-04-10 13:18 采纳率: 71.4%
浏览 123
已结题

如何利用matlab修改已有程序,然后绘制图中的所给图像?

问题:如何利用matlab修改已有程序,然后绘制图中的所给图像?
问题描述:已有程序比类似代码多了一个优化矩阵,结果是绘制信噪比与均方根差的关系图。类似代码就是提供一些参照代码以及求解均方根差的代码,类似代码和已有代码维度可能不一样,可以修改的。
结果类似图:

img

已有程序:

clear; 
close all;
%%%%%%%%%%%参数设定%%%%%%%%%%%
R = pi/180;      %角度->弧度
M = 3;               % 信源数目
N = 8;               % 阵元个数        
theta = [-30 0 60];  % 待估计角度
snr = 10;            % 信噪比
Sample =500;             % 快拍数(抽样密度)
 
element_spacing = 0.5;            % 阵元间距 
d=0:element_spacing:(N-1)*element_spacing;
A=exp(-1i*2*pi*d.'*sin(theta*R));  %方向矢量

%%%%%%%%%%构建信号模型%%%%%%%%
S=randn(M,Sample);             %信源信号,入射信号
X=A*S;                    %构造接收信号
X1=awgn(X,snr,'measured'); %将白色高斯噪声添加到信号中
% 计算协方差矩阵
Rxx=X1*X1'/Sample;
% 特征值分解
[Gn,D]=eig(Rxx);                   %特征值分解
EVA=diag(D)';                      %将特征值矩阵对角线提取并转为一行
[EVA,I]=sort(EVA);                 %将特征值排序 从小到大
Gn=Gn(:,I);                % 对应特征矢量排序
                 
%%%%%%%%%%% 优化矩阵U %%%%%%%%%
q = EVA(1);
SUM = 0;
for k = N-M+1:N
    u = Gn(:,k);
    SUM = SUM+(EVA(k)*u*u')/(q-EVA(k))^2;
end
U=q*SUM;

%%%%%%%遍历每个角度,计算空间谱%%%%%%
for A = 1:361
    angle(A)=(A-181)/2;
    phim=R*angle(A);
    a=exp(-1i*2*pi*d*sin(phim)).'; 
    G=Gn(:,1:N-M);                   % 取矩阵的第1到N-M列组成噪声子空间
    Pmusic(A)=(a'*U*a)/(a'*G*G'*a);
end
Pmusic=abs(Pmusic);
Pmmax=max(Pmusic);
h=plot(angle,Pmusic);
set(h,'Linewidth',2);
xlabel('入射角/(degree)');
ylabel('空间谱/(dB)');
set(gca, 'XTick',[-90:30:90]);
grid on;

绘制结果图像类似代码:

%MUSIC ALOGRITHM
%DOA ESTIMATION BY CLASSICAL_MUSIC
clear all;
%close all;
clc;

bbb=zeros(1,11);
for kk=1:11
snr=[-10 -8 -6 -4 -2 0 2 4 6 8 10];%信噪比(dB)

aaa=zeros(1,300);
for k=1:300

iwave=1;%信元数
kelm=8;%阵元数
N_x=1024; %信号长度
snapshot_number=N_x;%快拍数
w=pi/4;%信号频率
L=2*pi*3e8/w;%信号波长  
d=0.5*L;%阵元间距

source_doa=50;%信号的入射角度
A=[exp(-j*(0:kelm-1)*d*2*pi*sin(source_doa*pi/180)/L)].';

s=10.^((snr(kk)/2)/10)*exp(j*w*[0:N_x-1]);%仿真信号
%x=awgn(s,snr);
x=A*s+(1/sqrt(2))*(randn(kelm,N_x)+j*randn(kelm,N_x));%加了高斯白噪声后的阵列接收信号

R=x*x'/N_x;

%[V,D]=eig(R);
%Un=V(:,1:sensor_number-source_number);
%Gn=Un*Un';
[V,D]=eig(R);
D=diag(D);
disp(D);
Un=V(:,1:kelm-iwave);
Gn=Un*Un';

searching_doa=-90:0.1:90;%线阵的搜索范围为-90~90度
 for i=1:length(searching_doa)
   a_theta=exp(-j*(0:kelm-1)'*2*pi*d*sin(pi*searching_doa(i)/180)/L);
   Pmusic(i)=1./abs((a_theta)'*Gn*a_theta);
 end

%开始统计分析,先找出谱峰所对应的极值点所对应的估计信号入射角度
aa=diff(Pmusic);
aa=sign(aa);
aa=diff(aa);
bb=find(aa==-2)+1;
[t1 t2]=max(Pmusic(bb));
estimated_source_doa=searching_doa(bb(t2));
aaa(:,k)=estimated_source_doa;
end
disp(aaa);

%求解均方根误差和标准偏差
E_source_doa=sum(aaa(1,:))/300;%做300次试验的均值
disp('E_source_doa');

RMSE_source_doa=sqrt(sum((aaa(1,:)-source_doa).^2)/300);%做300次试验的均方根误差
disp('RMSE_source_doa');
disp(RMSE_source_doa);

bbb(:,kk)=RMSE_source_doa;
end
disp(bbb);

plot(snr,bbb(1,:),'k*-');
save CLASSICAL_MUSIC_snr_rmse.mat;
legend('经典MUSIC');
xlabel('信噪比(snr)/dB');
ylabel('估计均方根误差');
grid on;

  • 写回答

5条回答 默认 最新

  • 「已注销」 2023-04-10 17:20
    关注

    我觉得你这个无法改出来,除非已有程序大变样。因为你已有程序的矩阵维度和类似代码的都不一样。你可能要再想一下,重新审一下你出的这个题目的可行性。

    评论

报告相同问题?

问题事件

  • 系统已结题 4月18日
  • 修改了问题 4月10日
  • 修改了问题 4月10日
  • 修改了问题 4月10日
  • 展开全部

悬赏问题

  • ¥15 oracle数据库查询语句问题
  • ¥15 有没有c++绘制算法的佬们吗救孩一下
  • ¥15 android 蓝牙闪退
  • ¥15 绝缘子污秽comsol仿真参数
  • ¥15 Fatal error in Process MEMORY
  • ¥15 labelme生成的json有乱码?
  • ¥30 arduino vector defined in discarded section `.text' of wiring.c.o (symbol from plugin)
  • ¥20 如何训练大模型在复杂因素组成的系统中求得最优解
  • ¥15 关于#r语言#的问题:在进行倾向性评分匹配时,使用“match it"包提示”错误于eval(family$initialize): y值必需满足0 <= y <= 1“请问在进行PSM时
  • ¥45 求17位带符号原码乘法器verilog代码