📄 randomarray.m
字号:
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
%------------------------------------------
% SIGLISTBOX CLICK ACTION
%------------------------------------------
function siglistbox_Callback(hObject, eventdata, handles)
% Change tokenM according to the selected siglistbox item
handles.tokenM = get(hObject,'Value');
% Update handles structure
guidata(hObject, handles);
%------------------------------------------
% DELETE Signal
%------------------------------------------
function sigdelete_Callback(hObject, eventdata, handles)
% Delete signal indexed by tokenM
if (handles.tokenM ~=1)&&(handles.tokenM~=handles.sourceM)&&(handles.tokenM~=handles.M+1)
handles.sig(handles.tokenM:(handles.M-1)) = handles.sig((handles.tokenM+1):handles.M);
handles.sig(handles.M)=[];
handles.M = handles.M-1;
handles.tokenM = handles.tokenM-1;
set(handles.siglistbox,'Value',handles.tokenM);
handles.needupdate=1;
displayupdate(handles);
% Display signals, loclistbox
displaypattern(handles);
displaysiglistbox(handles);
% Update handles structure
guidata(hObject, handles);
end
%----------------------------------------------------
% DISPLAY SIGLISTBOX
%----------------------------------------------------
function displaysiglistbox(handles)
% Show Signal DOA in both degree and radian
siglbmsg0 = strcat('Source ->',num2str(handles.sig(1)',3));
siglbmsg=[];
if handles.M > 1
siglbmsg = strcat('Intf #', num2str(-1+(2:handles.M)'),' ->',num2str(handles.sig(2:handles.M)',3));
end
siglbmsg = strvcat(siglbmsg0, siglbmsg,'Add Intf');
set(handles.siglistbox,'String',siglbmsg);
%----------------------------------------------------
% DISPLAY BEAMPATTERN, SNR and SIR
%----------------------------------------------------
function displaypattern(handles)
% beampattern
resp = handles.w'*exp(j*2*pi*handles.loc*handles.sincos);
absresp = abs(resp);
% Compute and display SNR gain
sincos1 = [cos(handles.sig(1)); sin(handles.sig(1))];
signal_gain = norm(handles.w'*exp(j*2*pi*handles.loc*sincos1))^2;
noise_gain = norm(handles.w)^2;
SNRgain = signal_gain/noise_gain;
SNRmsg = ['SNR gain = ',num2str(SNRgain,4)];
% Compute and display SIR gain
intf_gain=0;
for i=2:handles.M
sincos1 = [cos(handles.sig(i)); sin(handles.sig(i))];
intf_gain = intf_gain + (norm(handles.w'*exp(j*2*pi*handles.loc*sincos1)))^2;
end
if intf_gain~=0
SIRimp = signal_gain/intf_gain;
SIRmsg = ['SIR gain = ',num2str(SIRimp,4)];
else
SIRmsg = ['SIR gain = N/A'];
end
set(handles.SNRmsgbox,'String',strvcat(SNRmsg,SIRmsg));
% Display in Polar or Semilogy form
if handles.displaytype==1
axes(handles.pattern); cla; hold on;
axis([-1 1 -1 1]*1.1);
% Show beampattern
polar(handles.theta,absresp);
% Show signals
for i=2:handles.M
polar(handles.sig(i)+[0 0+eps],[0 2],'k');
end
polar(handles.sig(handles.sourceM)+[0 0+eps],[0 2],'c');
else
axes(handles.pattern); cla; hold on;
axis([-pi pi 0 1.1*max(absresp)]);
% Show beampattern
semilogy(handles.theta,absresp);
% Show signals
for i=2:handles.M
semilogy(handles.sig(i)+[0 0+eps],[0 2],'k');
end
semilogy(handles.sig(handles.sourceM)+[0 0+eps],[0 2],'c');
end
%----------------------------------------------------
% ADD or EDIT Signals
%----------------------------------------------------
function AddEditSignal(hObject,eventdata,handles)
% Get mouse click position from map
axes(handles.pattern);
pt = get(gca,'CurrentPoint');
px = pt(1,1); py = pt(1,2);
if handles.tokenM > handles.M
% Add signal in Polar or Linear Form
handles.M = handles.M+1;
if handles.displaytype==1
handles.sig(handles.M)=atan(py/px) - pi*(px<0)*(py<0) + pi*(px<0)*(py>0);
else
handles.sig(handles.M)=px;
end
else
% Edit signal in Polar or Linear Form
if handles.displaytype==1
handles.sig(handles.tokenM)=atan(py/px) - pi*(px<0)*(py<0) + pi*(px<0)*(py>0);
else
handles.sig(handles.tokenM)=px;
end
end
% Turn on Need udpate flag
handles.needupdate=1;
displayupdate(handles);
% Display pattern, siglistbox
displaypattern(handles);
displaysiglistbox(handles);
% Update handles structure
guidata(hObject, handles);
%------------------------------------------
% UPDATE BEAMFORMER
%------------------------------------------
function update_Callback(hObject, eventdata, handles)
switch handles.wtype
case 1 % Match filter
tempa = steering(handles.loc,handles.sig(1));
handles.w = tempa/length(tempa);
case 2 % MVDR
tempR = handles.noisepower*eye(handles.N);
for i=2:handles.M
tempa = steering(handles.loc,handles.sig(i));
tempR = tempR + tempa*tempa';
end
tempa = steering(handles.loc,handles.sig(1));
tempw = tempR\tempa;
handles.w = tempw/(tempa'*tempw);
case 3 % MPDR
tempR = handles.noisepower*eye(handles.N);
for i=1:handles.M
tempa = steering(handles.loc,handles.sig(i));
tempR = tempR + tempa*tempa';
end
tempa = steering(handles.loc,handles.sig(1));
tempw = tempR\tempa;
handles.w = tempw/(tempa'*tempw);
case 4 % MMSE
tempR = handles.noisepower*eye(handles.N);
for i=1:handles.M
tempa = steering(handles.loc,handles.sig(i));
tempR = tempR + tempa*tempa';
end
tempa = steering(handles.loc,handles.sig(1));
tempw = tempR\tempa;
handles.w = tempw;
end
% Turn off Need udpate flag
handles.needupdate=0;
displayupdate(handles);
% Display pattern
displaypattern(handles);
% Display wlistbox
displaywlistbox(handles);
% Update handles structure
guidata(hObject, handles);
%------------------------------------------
% HALT (debugging purposes)
%------------------------------------------
function halt_Callback(hObject, eventdata, handles)
keyboard
%------------------------------------------
% CREATE DISPLAYTYPE MENY
%------------------------------------------
function displaytype_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
%------------------------------------------
% DISPLAYTYPE CLICK ACTION
%------------------------------------------
function displaytype_Callback(hObject, eventdata, handles)
handles.displaytype = get(hObject,'Value'); % 1=polar, 2=semilogy
% Display pattern
displaypattern(handles);
% Update handles structure
guidata(hObject, handles);
%------------------------------------------
% RETURN STEERING VECTOR
%------------------------------------------
function w = steering(loc,sig)
% handles structure with handles and user data (see GUIDATA)
sincos1 = [cos(sig); sin(sig)];
w = exp(j*2*pi*loc*sincos1);
%------------------------------------------
% CREATE NOISEPOWER SLIDE
%------------------------------------------
function noisepowerslide_CreateFcn(hObject, eventdata, handles)
usewhitebg = 1;
if usewhitebg
set(hObject,'BackgroundColor',[.9 .9 .9]);
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
%---------------------------------------------
% NOISEPOWER SLIDE CLICK ACTION
%---------------------------------------------
function noisepowerslide_Callback(hObject, eventdata, handles)
handles.noisepower= get(hObject,'Value');
% Display noise power
msg = ['Noise power = ',num2str(handles.noisepower,4)];
set(handles.noisemsgbox,'String',msg);
% Turn on needudpate flag
handles.needupdate=1;
displayupdate(handles);
% Update handles structure
guidata(hObject, handles);
%----------------------------------------------------
% CREATE WLISTBOX
%----------------------------------------------------
function wlistbox_CreateFcn(hObject, eventdata, handles)
if ispc
set(hObject,'BackgroundColor','white');
else
set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));
end
%----------------------------------------------------
% WLISTBOX CLICK ACTION
%----------------------------------------------------
function wlistbox_Callback(hObject, eventdata, handles)
% Change tokenN according to the selected wlistbox item
handles.tokenN= get(hObject,'Value');
% Synchronize highlight with loctypelistbox
set(handles.loclistbox,'Value',handles.tokenN);
% Displaymap due to color changes
displaymap(handles);
% Update handles structure
guidata(hObject, handles);
%----------------------------------------------------
% DISPLAY WLISTBOX
%----------------------------------------------------
function displaywlistbox(handles)
% Show beamformer
% insert blank row
wlbmsg = strvcat(strcat('w',num2str((1:handles.N)'),' = ',num2str(handles.w,3),''),' ');
set(handles.wlistbox,'String',wlbmsg);
% Synchronize highlight with loclistbox
set(handles.wlistbox,'Value',handles.tokenN);
%----------------------------------------------------
% DISPLAY UPDATE BUTTON
%----------------------------------------------------
function displayupdate(handles)
updatemsg0 = ' ';
updatemsg1 = 'Update Beamformer';
% Show Update Button if need update
if handles.needupdate==0
set(handles.update,'String',updatemsg0);
else
set(handles.update,'String',updatemsg1);
end
%------------------------------------------
% DUMMY FUNCTIONS
%------------------------------------------
function varargout = randomarray_OutputFcn(hObject, eventdata, handles)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -