MATLAB GUI
函数
下面是都会有的代码 最开头
function varargout = interference_1(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @interference_1_OpeningFcn, ...
'gui_OutputFcn', @interference_1_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
下面是interference1的代码
function interference_1_OpeningFcn(hObject, eventdata, handles, varargin)
guidata(hObject, handles);
function varargout = interference_1_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
下面是两个汉字区的代码 可以编辑的
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_Callback(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
下面是按下按钮1的回调函数 也就是开始 会出现的图
function pushbutton1_Callback(hObject, eventdata, handles)
%仿真 V-BLAST 结构 ZF 检测算法性能,调制方式为 QPSK
Nt = 4; %发射天线数
Nr = 4; %接收天线数
N = 10; %每帧的长度
L = 10000; %仿真的总帧数
EbN0 = 0:2:20;
M = 4; %QPSK 调制
x = randi([0,1],N*L,Nt); %信源数据
s = pskmod(x,M,pi/4); %QPSK 调制
for index=1:length(EbN0)
s1 = [];
s2 = [];
s3 = [];
for index1 = 1:L
h = randn(Nt,Nr)+j*randn(Nt,Nr); %Rayleigh 衰落信道
h = h./sqrt(2); %信道系数归一化
[q1,r1] = qr(h'); %信道 QR 分解
r = r1(1:Nt,:)'; %矩阵 R
q = q1(:,1:Nt)'; %矩阵 Q
sigma1 = sqrt(1/(10.^(EbN0(index)/10))); %每根接收天线的高斯白噪声标准差
n = sigma1*(randn(N,Nr)+j*randn(N,Nr)); %每根接收天线的高斯白噪声
y = s((index1-1)*N+1:index1*N,:)*h*q'+n*q'; %信号通过信道
y1 = y*inv(r); %无干扰消除时的 ZF 检测
s1 = [s1;pskdemod(y1,M,pi/4)];
%有干扰消除时的 ZF 检测
y(:,Nt) = y(:,Nt)./(r(Nt,Nt)); %检测第 Nt 层
y1(:,Nt) = pskdemod(y(:,Nt),M,pi/4); %解调第 Nt 层
y(:,Nt) = pskmod(y1(:,Nt),M,pi/4); %对第 Nt 层解调结果重新进行调制
y2 = y;
y3 = y1;
for jj=Nt-1:-1:1
for kk=jj+1:Nt
y(:,jj) = y(:,jj)-r(kk,jj).*y(:,kk); %非理想干扰消除
y2(:,jj) = y2(:,jj)-r(kk,jj).*s((index1-1)*N+1:index1*N,kk); %理想干扰消除
end
y(:,jj) = y(:,jj)./r(jj,jj);
y2(:,jj) = y2(:,jj)./r(jj,jj); %第 jj 层判决变量
y1(:,jj) = pskdemod(y(:,jj),M,pi/4); %第 jj 层进行解调
y3(:,jj) = pskdemod(y2(:,jj),M,pi/4);
y(:,jj) = pskmod(y1(:,jj),M,pi/4); %第 jj 解调结果重新进行调制
y2(:,jj) = pskmod(y3(:,jj),M,pi/4);
end
s2 = [s2;y1];
s3 = [s3;y3];
end
[temp,ber1(index)] = biterr(x,s1,log2(M)); %无干扰消除时的系统误码
[temp,ber2(index)] = biterr(x,s2,log2(M)); %非理想干扰消除时的系统误码
[temp,ber3(index)] = biterr(x,s3,log2(M)); %理想干扰消除时的系统误码
[temp,ber24(index)] = biterr(x(:,1),s2(:,1),log2(M)); %非理想干扰消除时第 4 层的系统误码
[temp,ber23(index)] = biterr(x(:,2),s2(:,2),log2(M)); %非理想干扰消除时第 3 层的系统误码
[temp,ber22(index)] = biterr(x(:,3),s2(:,3),log2(M)); %非理想干扰消除时第 2 层的系统误码
[temp,ber21(index)] = biterr(x(:,4),s2(:,4),log2(M)); %非理想干扰消除时第 1 层的系统误码
[temp,ber34(index)] = biterr(x(:,1),s3(:,1),log2(M)); %理想干扰消除时第 4 层的系统误码
[temp,ber33(index)] = biterr(x(:,2),s3(:,2),log2(M)); %理想干扰消除时第 3 层的系统误码
[temp,ber32(index)] = biterr(x(:,3),s3(:,3),log2(M)); %理想干扰消除时第 2 层的系统误码
[temp,ber31(index)] = biterr(x(:,4),s3(:,4),log2(M)); %理想干扰消除时第 1 层的系统误码
end
semilogy(EbN0,ber1,'-mo',EbN0,ber2,'-ro',EbN0,ber3,'-bo')
title('V-BLAST 结构 ZF 检测算法性能')
legend('无干扰消除','非理想干扰消除', '理想干扰消除')
xlabel('信噪比 Eb/N0')
ylabel('误比特率(BER)')
下面是按钮2的回调函数 即按下
function pushbutton2_Calwlback(hObject, eventdata, handles)
close(interference_1); %想关闭的 matlab 界面名称
set(interference_2,'Visible','on'); %想打开的界面名称
就是打开了interference的2号
function varargout = interference_2(varargin)
% INTERFERENCE_2 MATLAB code for interference_2.fig
% INTERFERENCE_2, by itself, creates a new INTERFERENCE_2 or raises the existing
% singleton*.
%
% H = INTERFERENCE_2 returns the handle to a new INTERFERENCE_2 or the handle to
% the existing singleton*.
%
% INTERFERENCE_2('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in INTERFERENCE_2.M with the given input arguments.
%
% INTERFERENCE_2('Property','Value',...) creates a new INTERFERENCE_2 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before interference_2_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to interference_2_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help interference_2
% Last Modified by GUIDE v2.5 13-Jan-2022 12:46:09
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @interference_2_OpeningFcn, ...
'gui_OutputFcn', @interference_2_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before interference_2 is made visible.
function interference_2_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to interference_2 (see VARARGIN)
% Choose default command line output for interference_2
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes interference_2 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = interference_2_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on selection change in popupmenu1
这是可以切换的
function popupmenu1_Callback(hObject, eventdata, handles)
%仿真 V-BLAST 结构 ZF 检测算法性能,调制方式为 QPSK
Nt = 4; %发射天线数
Nr = 4; %接收天线数
N = 10; %每帧的长度
L = 10000; %仿真的总帧数
EbN0 = 0:2:20;
M = 4; %QPSK 调制
x = randi([0,1],N*L,Nt); %信源数据
s = pskmod(x,M,pi/4); %QPSK 调制
for index=1:length(EbN0)
s1 = [];
s2 = [];
s3 = [];
for index1 = 1:L
h = randn(Nt,Nr)+j*randn(Nt,Nr); %Rayleigh 衰落信道
h = h./sqrt(2); %信道系数归一化
[q1,r1] = qr(h'); %信道 QR 分解
r = r1(1:Nt,:)'; %矩阵 R
q = q1(:,1:Nt)'; %矩阵 Q
sigma1 = sqrt(1/(10.^(EbN0(index)/10))); %每根接收天线的高斯白噪声标准差
n = sigma1*(randn(N,Nr)+j*randn(N,Nr)); %每根接收天线的高斯白噪声
基于 ZF 算法的可见光通信性能检测系统 V1.0 6
y = s((index1-1)*N+1:index1*N,:)*h*q'+n*q'; %信号通过信道
y1 = y*inv(r); %无干扰消除时的 ZF 检测
s1 = [s1;pskdemod(y1,M,pi/4)];
%有干扰消除时的 ZF 检测
y(:,Nt) = y(:,Nt)./(r(Nt,Nt)); %检测第 Nt 层
y1(:,Nt) = pskdemod(y(:,Nt),M,pi/4); %解调第 Nt 层
y(:,Nt) = pskmod(y1(:,Nt),M,pi/4); %对第 Nt 层解调结果重新进行调制
y2 = y;
y3 = y1;
for jj=Nt-1:-1:1
for kk=jj+1:Nt
y(:,jj) = y(:,jj)-r(kk,jj).*y(:,kk); %非理想干扰消除
y2(:,jj) = y2(:,jj)-r(kk,jj).*s((index1-1)*N+1:index1*N,kk); %理想干扰消除
end
y(:,jj) = y(:,jj)./r(jj,jj);
y2(:,jj) = y2(:,jj)./r(jj,jj); %第 jj 层判决变量
y1(:,jj) = pskdemod(y(:,jj),M,pi/4); %第 jj 层进行解调
y3(:,jj) = pskdemod(y2(:,jj),M,pi/4);
y(:,jj) = pskmod(y1(:,jj),M,pi/4); %第 jj 解调结果重新进行调制
y2(:,jj) = pskmod(y3(:,jj),M,pi/4);
end
s2 = [s2;y1];
s3 = [s3;y3];
end
[temp,ber1(index)] = biterr(x,s1,log2(M)); %无干扰消除时的系统误码
[temp,ber2(index)] = biterr(x,s2,log2(M)); %非理想干扰消除时的系统误码
[temp,ber3(index)] = biterr(x,s3,log2(M)); %理想干扰消除时的系统误码
[temp,ber24(index)] = biterr(x(:,1),s2(:,1),log2(M)); %非理想干扰消除时第 4 层的系统误码
[temp,ber23(index)] = biterr(x(:,2),s2(:,2),log2(M)); %非理想干扰消除时第 3 层的系统误码
[temp,ber22(index)] = biterr(x(:,3),s2(:,3),log2(M)); %非理想干扰消除时第 2 层的系统误码
[temp,ber21(index)] = biterr(x(:,4),s2(:,4),log2(M)); %非理想干扰消除时第 1 层的系统误码
[temp,ber34(index)] = biterr(x(:,1),s3(:,1),log2(M)); %理想干扰消除时第 4 层的系统误码
[temp,ber33(index)] = biterr(x(:,2),s3(:,2),log2(M)); %理想干扰消除时第 3 层的系统误码
[temp,ber32(index)] = biterr(x(:,3),s3(:,3),log2(M)); %理想干扰消除时第 2 层的系统误码
[temp,ber31(index)] = biterr(x(:,4),s3(:,4),log2(M)); %理想干扰消除时第 1 层的系统误码
end
%semilogy(EbN0,ber1,'-ko',EbN0,ber2,'-ro',EbN0,ber3,'-go')
%title('V-BLAST structure ZF detection algorithm performance')
%legend('No interference cancellation','Non-ideal interference cancellation', 'Ideal interference cancellation')
%xlabel('Eb/N0')
%ylabel('(BER)')
%legend('无干扰消除','非理想干扰消除', '理想干扰消除')
%xlabel('信噪比 Eb/N0')
%ylabel('误比特率(BER)')
global var3;
var3=get(handles.popupmenu1, 'value')
switch var3
case 1
axes(handles.axes1);
semilogy(EbN0,ber34,'-mo',EbN0,ber33,'-ro',EbN0,ber32,'-bo',EbN0,ber31,'-ko')
title('理想干扰消除 ZF 算法')
legend('Level 1','Level 2', 'Level 3', 'Level 4')
xlabel('信噪比 Eb/N0')
ylabel('误比特率(BER)')
%legend('第 1 层','第 2 层', '第 3 层', '第 4 层')
%xlabel('信噪比 Eb/N0')
%ylabel('误比特率(BER)')
case 2
axes(handles.axes1);
semilogy(EbN0,ber24,'-mo',EbN0,ber23,'-ro',EbN0,ber22,'-bo',EbN0,ber21,'-ko')
title('非理想干扰消除 ZF 算法')
legend('Level 1','Level 2', 'Level 3', 'Level 4')
xlabel('信噪比 Eb/N0')
ylabel('误比特率(BER)')
%legend('第 1 层','第 2 层', '第 3 层', '第 4 层')
%xlabel('信噪比 Eb/N0')
%ylabel('误比特率(BER)')
end
其中最重要的是
global var3;
var3=get(handles.popupmenu1, 'value')
switch var3
case 1
axes(handles.axes1);
semilogy(EbN0,ber34,'-mo',EbN0,ber33,'-ro',EbN0,ber32,'-bo',EbN0,ber31,'-ko')
title('理想干扰消除 ZF 算法')
legend('Level 1','Level 2', 'Level 3', 'Level 4')
xlabel('信噪比 Eb/N0')
ylabel('误比特率(BER)')
case 2
axes(handles.axes1);
semilogy(EbN0,ber24,'-mo',EbN0,ber23,'-ro',EbN0,ber22,'-bo',EbN0,ber21,'-ko')
title('非理想干扰消除 ZF 算法')
legend('Level 1','Level 2', 'Level 3', 'Level 4')
xlabel('信噪比 Eb/N0')
ylabel('误比特率(BER)')
end
最后请别忘了 这个选择的pop还需要createfunction
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end