📄 teqdemo.m
字号:
'String',labelStr, ... 'Callback',callbackStr); % help button labelStr='Information'; callbackStr='teqdemo(''info'')'; helpHndl=uicontrol( ... 'Style','pushbutton', ... 'Units','normalized', ... 'Position',[left frmBottom btnWid btnHt], ... 'String',labelStr, ... 'Callback',callbackStr); % put all handles in userdata of the parent object fhndlList=[freqzHnd NbHndl NwHndl NHndl CGHndl MarginHndl ... DminHndl DmaxHndl PwrHndl AWGNHndl CSAHndl viewHndl ... helpHndl closeHndl methodHndl h11 h21 h31 h41 h51 h61]; set(figNumber, ... 'Visible','on', ... 'UserData',fhndlList); drawnow axes(freqzHnd) set(freqzHnd,'Userdata',[]) teqdemo('design') set(gcf,'Pointer','arrow','handlevisibility','callback'); set(0,'showHiddenHandles',shh) return % change method elseif strcmp(action,'changemethod'), v = get(gco,'value'); % 1=MMSE-UEC,2=MMSE-UTC,3=MSSNR,4=GEO,5=min-ISI,6=MBR,7=DCC,8=DCM,9=MP, % 10=MMP, 11=Eig-App 12=ARMA set(gco,'userdata',v); return % set Nbelseif strcmp(action,'setNb'), hndlList=get(gcf,'Userdata'); nw = get(hndlList(3),'userdata'); meth = get(hndlList(15),'value'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % do not allow Nb<1 or if MSSNR is chosen Nb<=Nw if vv < 1 | (vv <= nw & meth == 3), vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)); return % set Nwelseif strcmp(action,'setNw'), hndlList=get(gcf,'Userdata'); nb = get(hndlList(2),'userdata'); meth = get(hndlList(15),'value'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % do not allow Nw<1 or if MSSNR is chosen Nw>=Nb if vv <= 1 | (vv >= nb & meth == 3), vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set coding gain elseif strcmp(action,'setCG'), hndlList=get(gcf,'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % do not allow negative coding gain if vv < 0, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set margin elseif strcmp(action,'setMargin'), hndlList=get(gcf,'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % do not allow negative margin if vv < 0, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set input power elseif strcmp(action,'setPwr'), hndlList=get(gcf,'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % do not allow negative input power if vv < 0, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set white noise power elseif strcmp(action,'setAWGN'), hndlList=get(gcf,'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % do not allow negative noise power if vv > 0, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set channel number elseif strcmp(action,'setCSA'), hndlList=get(gcf,'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % only have 8 CSA channel numbered 1-8 if vv < 1 | vv > 8, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set Dmin elseif strcmp(action,'setDmin'), hndlList=get(gcf,'Userdata'); Dmax = get(hndlList(8),'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % Dmin cannot be smaller than 1 and larger than Dmax if vv<1 | vv > Dmax, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set Dmax elseif strcmp(action,'setDmax'), hndlList=get(gcf,'Userdata'); Dmin = get(hndlList(7),'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % Dmax cannot be smaller than 1 and Dmin if vv < 1 | vv < Dmin, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set N elseif strcmp(action,'setN'), hndlList=get(gcf,'Userdata'); v = get(gco,'Userdata'); s = get(gco,'String'); vv = eval(s,num2str(v(1))); % N has to be a power of 2 if ((floor(log(vv)/log(2))-(log(vv)/log(2))) ~= 0) vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % design TEQ elseif strcmp(action,'design'), set(gcf,'Pointer','watch'); % get handles axHndl=gca; fhndlList=get(gcf,'Userdata'); freqzHndl = fhndlList(1); NbHndl = fhndlList(2); NwHndl = fhndlList(3); NHndl = fhndlList(4); CGHndl = fhndlList(5); MarginHndl = fhndlList(6); DminHndl = fhndlList(7); DmaxHndl = fhndlList(8); PwrHndl = fhndlList(9); AWGNHndl = fhndlList(10); CSAHndl = fhndlList(11); viewHndl = fhndlList(12); helpHndl = fhndlList(13); closeHndl = fhndlList(14); methodHndl = fhndlList(15); methRateHndl = fhndlList(16); methSNRHndl = fhndlList(17); methSSNRHndl = fhndlList(18); methMSEHndl = fhndlList(19); methDelayHndl = fhndlList(20); methMaxHndl = fhndlList(21); colors = get(gca,'colororder'); % init variables Nb = get(NbHndl,'userdata'); Nw = get(NwHndl,'userdata'); N = get(NHndl,'userdata'); codingGain = get(CGHndl,'userdata'); margin = get(MarginHndl,'userdata'); Dmin = get(DminHndl,'userdata'); Dmax = get(DmaxHndl,'userdata'); totalInputPower = get(PwrHndl,'userdata'); AWGNpower = get(AWGNHndl,'userdata'); loopNum = get(CSAHndl,'userdata'); method = get(methodHndl,'value'); barflag = 1; chflag = 0; %number of iteration per TEQ tap numIter = 1000; %generate signal,noise, and channel data [recNoisySig,receivedSignal,noise,channel,inputSignal,gamma,fs] = ... siggen(N,AWGNpower,loopNum,totalInputPower,codingGain,margin,barflag,chflag); %save tmp1.mat inputSignal, receivedSignal, noise; %estimate the power spectrums [inputSpecAll, noiseSpecAll, channelGainAll]=... specestim(inputSignal,noise,channel,N,barflag); %calculate SNRs and usable channels [subMFBall,subMFB,usedSubs,noiseSpec,channelGain,inputSpec] = ... calcsnrs(inputSpecAll,channelGainAll,noiseSpecAll,gamma); % chose method and design TEQ [B, W, D, MSE, Dv, I,title_str] = selmeth(method,inputSignal,... receivedSignal,noise,channel(1:N),... Nb,Nw,Dmin,Dmax,barflag,N,numIter,inputSpec,noiseSpec,channelGain,... usedSubs,gamma); % get performance results [SSNR, SNR, subSNR,geoSNRfinal,geoSNRmfb,bDMTfinal,bDMTmfb,... RDMTfinal,RDMTmfb,hw,Fh,Fw,colorNoiseaft,Fhw] = ... perform(W,B,channel,D,Nb,N,inputSignal,noise,... channelGainAll,inputSpecAll,noiseSpecAll,margin,codingGain,fs,subMFBall,usedSubs); % put results into table str = sprintf('%1.3fe6',RDMTfinal/1e6); set(methRateHndl,'string',str); str = sprintf('%3.1f',SNR); set(methSNRHndl,'string',str); str = sprintf('%3.1f',SSNR); set(methSSNRHndl,'string',str); str = sprintf('%3.0f',D); set(methDelayHndl,'string',str); if MSE == 0, str = '-'; else str = sprintf('%3.1e',MSE); end set(methMSEHndl,'string',str); str = sprintf('%1.3fe6',RDMTmfb/1e6); set(methMaxHndl,'string',str); % save results to disk in order to use it in other functions save singleteqtmpresults title_str N hw B D Nb W Nw subSNR subMFB channel Fh ... noiseSpec colorNoiseaft Dv Dmin Dmax Fhw Fw usedSubs ... inputSignal receivedSignal noise; TEQequalizerTaps = W; TEQtargetImpulseResp = B; TEQoptimalDelay = D; TEQoriginalChannel = channel; TEQequalizedChannel = hw; TEQmatchedFilterBoundPerChannel = subMFB; TEQSNRperChannel = subSNR; TEQoriginalChannelFreqResp = Fh; TEQequalizerFreqResp = Fw; TEQequalizedChannelFreqResp = Fhw; TEQchanNoisePowSpecAfterEqual = colorNoiseaft; TEQchanNoisePowSpecBeforeEqual = noiseSpec; TEQperformanceVersusDelay = Dv; TEQDmin = Dmin; TEQDmax = Dmax; TEQNb = Nb; TEQNw = Nw; TEQN = N; TEQCodingGain=codingGain; TEQMargin=margin; TEQInputPower=totalInputPower; TEQAWGNPower=AWGNpower; TEQLoopnum=loopNum; save singleteqresults fhndlList TEQequalizerTaps TEQtargetImpulseResp ... TEQoptimalDelay TEQoriginalChannel TEQequalizedChannel ... TEQmatchedFilterBoundPerChannel TEQSNRperChannel ... TEQoriginalChannelFreqResp TEQequalizerFreqResp ... TEQequalizedChannelFreqResp TEQchanNoisePowSpecAfterEqual... TEQchanNoisePowSpecBeforeEqual TEQDmin TEQDmax TEQNb TEQNw TEQN TEQCodingGain... TEQMargin TEQInputPower TEQAWGNPower TEQLoopnum; % plot result teqdemo('plotGraph'); set(gcf,'Pointer','arrow'); return % plot graphelseif strcmp(action,'plotGraph'), legend off set(gcf,'Pointer','watch'); % get handles fhndlList = get(gcf,'Userdata'); viewHndl = fhndlList(12); freqzHndl = fhndlList(1); methodindex=get(fhndlList(15),'Userdata'); % set axis axHndl = gca; axes(freqzHndl); % which graph is going to be plotted graphNum = get(viewHndl,'value'); %1= TIR/SIR, 2= TEQ impulse res., 3= TEQ freq. res., 4= SNR/MFB %5=original and short channel impulse res, 6 = noise power spec., %7= delay plot, 8= equalized channel freq % load results for current TEQ load singleteqtmpresults; freqAxis = 1:N/2+1; % plot chosen graph if graphNum == 1 if (methodindex ==1 | methodindex == 2) legend off hw100 = hw(1:100)/norm(hw); axhndlList = get(freqzHndl,'UserData'); hndl = plot(hw100);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -