📄 dualteq.m
字号:
'Units','normalized', ... 'Position',labelPos, ... 'Horiz','left', ... 'String','Cmax', ... 'Interruptible','off', ... 'BackgroundColor',[0.5 0.5 0.5], ... 'ForegroundColor','white'); % set Cmax yPos=frmBottom-frmBorder; textPos = [grpleft+labelWidth+0.05+labelWidth yPos textWidth textHeight]; callbackStr = 'dualteq(''setCmax'')'; str = sprintf('59'); mat = [59]; CmaxHndl = uicontrol( ... 'Style','edit', ... 'Units','normalized', ... 'Position',textPos, ... 'Max',1, ... 'Horiz','right', ... 'Background','white', ... 'Foreground','black', ... 'String',str,'Userdata',mat, ... '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 UminHndl ...
UmaxHndl CminHndl CmaxHndl]; set(figNumber, ... 'Visible','on', ... 'UserData',fhndlList); drawnow axes(freqzHnd) set(freqzHnd,'Userdata',[]) dualteq('design') set(gcf,'Pointer','arrow','handlevisibility','callback'); set(0,'showHiddenHandles',shh) return % change method elseif strcmp(action,'changemethod'), v = get(gco,'value'); % 1=min-ISI,2=MBR
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
% set Umin elseif strcmp(action,'setUmin'), hndlList=get(gcf,'Userdata');
Umax = get(hndlList(23),'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 > Umax, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set Umax elseif strcmp(action,'setUmax'), hndlList=get(gcf,'Userdata'); Umin = get(hndlList(22),'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 < Umin, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return
% set Cmin elseif strcmp(action,'setCmin'), hndlList=get(gcf,'Userdata');
Cmax = get(hndlList(25),'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 > Cmax, vv = v; end set(gco,'Userdata',vv,'String',num2str(vv)) return % set Cmax elseif strcmp(action,'setCmax'), hndlList=get(gcf,'Userdata'); Cmin = get(hndlList(24),'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 < Cmin, 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);
UminHndl = fhndlList(22);
UmaxHndl = fhndlList(23);
CminHndl = fhndlList(24);
CmaxHndl = fhndlList(25); 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');
UsedMin=get(UminHndl,'userdata');
UsedMax=get(UmaxHndl,'userdata');
CdualMin=get(CminHndl,'userdata');
CdualMax=get(CmaxHndl,'userdata'); barflag = 0; 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);
%first pass for whole bandwidth teq design
usedSubs = [UsedMin:UsedMax]'; selectSubs = usedSubs;
%calculate SNRs and usable channels [subMFBall,subMFB,noiseSpec,channelGain,inputSpec] = ... calcsnrs_dual(inputSpecAll,channelGainAll,noiseSpecAll,gamma,usedSubs); % chose method and design TEQ [B, W, D, MSE, Dv, I,title_str] = selmeth_dual(method,inputSignal,... receivedSignal,noise,channel(1:N),... Nb,Nw,Dmin,Dmax,barflag,N,numIter,inputSpec,noiseSpec,channelGain,... selectSubs,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); % save results to disk in order to use it in other functions save path1tmpresults title_str N hw B D Nb W Nw subSNR subMFB channel Fh ... noiseSpec colorNoiseaft Dv Dmin Dmax Fhw Fw usedSubs ... inputSignal receivedSignal noise; %Second pass for sub-bandwidth teq design selectSubs = [CdualMin:CdualMax]'; % chose method and design the second TEQ [B2, W2, D2, MSE2, Dv2, I2,title_str2] = selmeth_dual(method,inputSignal,... receivedSignal,noise,channel(1:N),... Nb,Nw,Dmin,Dmax,barflag,N,numIter,inputSpec,noiseSpec,channelGain,... selectSubs,gamma); % get performance results [SSNR2, SNR2, subSNR2,geoSNRfinal2,geoSNRmfb2,bDMTfinal2,bDMTmfb2,... RDMTfinal2,RDMTmfb2,hw2,Fh2,Fw2,colorNoiseaft2,Fhw2] = ... perform(W2,B2,channel,D2,Nb,N,inputSignal,noise,... channelGainAll,inputSpecAll,noiseSpecAll,margin,codingGain,fs,subMFBall,usedSubs); save path2tmpresults B2 W2 D2 MSE2 Dv2 I2 title_str2 SSNR2 SNR2 ... subSNR2 geoSNRfinal2 geoSNRmfb2 bDMTfinal2 bDMTmfb2 ... RDMTfinal2 RDMTmfb2 hw2 Fh2 Fw2 colorNoiseaft2 Fhw2; %get Dual-path TEQ design dualSNR=subSNR; for i=1:length(subSNR) if subSNR(i)<subSNR2(i) dualSNR(i)=subSNR2(i); end end [geoSNRdual bDMTdual RDMTdual] = geosnr(dualSNR(usedSubs),margin,codingGain,N,Nb,fs); % put results into table str = sprintf('%1.3fe6',RDMTfinal/1e6); set(methRateHndl,'string',str); str = sprintf('%1.3fe6',RDMTfinal2/1e6); set(methSNRHndl,'string',str); str = sprintf('%1.3fe6',RDMTdual/1e6); set(methSSNRHndl,'string',str); str = sprintf('%3.1f',SSNR); set(methDelayHndl,'string',str); str = sprintf('%3.1f',SSNR2); set(methMSEHndl,'string',str); str = sprintf('%1.3fe6',RDMTmfb/1e6); set(methMaxHndl,'string',str); TEQequalizerTaps = W; TEQequalizerTaps2 = W2; TEQtargetImpulseResp = B; TEQoptimalDelay = D; TEQoptimalDelay2 =D2; TEQoriginalChannel = channel; TEQequalizedChannel = hw; TEQmatchedFilterBoundPerChannel = subMFB; TEQSNRperChannel = subSNR; TEQoriginalChannelFreqResp = Fh; TEQequalizerFreqResp = Fw; TEQequalizedChannelFreqResp = Fhw; TEQequalizedChannelFreqResp2 = Fhw2; TEQchanNoisePowSpecAfterEqual = colorNoiseaft; TEQchanNoisePowSpecBeforeEqual = noiseSpec; TEQperformanceVersusDelay = Dv; TEQDmin = Dmin;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -