fig = FreqTrans.PlotNyquist(ToEstNom[iOut, iIn, sigIndx[iIn]], ToEstUncMag[iOut, iIn, sigIndx[iIn]], fig = fig, fillType = 'circle', marker='.', color = 'g', linestyle='None', label = 'Estimate (SIMO)') fig = FreqTrans.PlotNyquist(np.array([-1+0j]), np.array([0.4]), fig = fig, fillType = 'circle', marker='+', color = 'r', linestyle='None') ax = fig.get_axes() # handles, labels = ax[0].get_legend_handles_labels() # handles = [handles[0], handles[3], handles[1], handles[4], handles[2], handles[5]] # labels = [labels[0], labels[3], labels[1], labels[4], labels[2], labels[5]] # ax[0].legend(handles, labels) fig.suptitle('$T_o$ : ' + '$r_{Exc}$[' + str(iIn) + '] to ' + '$z$[' + str(iOut) + ']') #%% Bode Plot - Output Complimentary Sensitivity Function # Linear Model Gain and Phase gainToLinNom_mag, phaseToLinNom_deg = FreqTrans.GainPhase(ToLinNom, magUnit = 'mag', phaseUnit = 'deg', unwrap = True) gainToLinUnc_mag = FreqTrans.Gain(ToLinUnc, magUnit = 'mag') cohToLin_mag = np.ones_like(ToLinUnc) # Estimated gainToEstNom_mag, phaseToEstNom_deg = FreqTrans.GainPhase(ToEstNom, magUnit = 'mag', phaseUnit = 'deg', unwrap = True) gainToEstUnc_mag = FreqTrans.Gain(ToEstUnc, magUnit = 'mag') # Estimation Uncertain Response cohToEst_mag = ToEstCoh # Estimation Coherence cohToEstMin = np.min(cohToEst_mag, axis = (0, 1)) if False: for iPlot, [iOut, iIn] in enumerate(ioArray): fig = 20 + iPlot fig = FreqTrans.PlotBode(freqLin_hz, gainToLinNom_mag[iOut, iIn], phaseToLinNom_deg[iOut, iIn], coher_nd = cohToLin_mag[iOut, iIn], gainUnc_mag = gainToLinUnc_mag[iOut, iIn], fig = fig, dB = True, color='k', label='Linear Model') fig = FreqTrans.PlotBode(freq_hz[iIn], gainToEstNom_mag[iOut, iIn], phaseToEstNom_deg[iOut, iIn], coher_nd = cohToEst_mag[iOut, iIn], gainUnc_mag = gainToEstUnc_mag[iOut, iIn], fig = fig, dB = True, color='b', label='Estimate [MIMO]') fig = FreqTrans.PlotBode(freq_hz[iIn, sigIndx[iIn]], gainToEstNom_mag[iOut, iIn, sigIndx[iIn]], phaseToEstNom_deg[iOut, iIn, sigIndx[iIn]], coher_nd = cohToEst_mag[iOut, iIn, sigIndx[iIn]], gainUnc_mag = gainToEstUnc_mag[iOut, iIn, sigIndx[iIn]], fig = fig, dB = True, color='g', label='Estimate [SIMO]')
fig=fig, color='r', linestyle=':', label='Critical Region') fig.suptitle(inName + ' to ' + outName, size=20) ax = fig.get_axes() ax[0].set_xlim(-3, 1) ax[0].set_ylim(-2, 2) #%% Bode Plots - Ta gainTaLinNom_mag, phaseTaLinNom_deg = FreqTrans.GainPhase(TaLinNom, magUnit='mag', phaseUnit='deg', unwrap=True) gainTaLinUnc_mag = FreqTrans.Gain(TaLinUnc, magUnit='mag') gainTaEstNom_mag, phaseTaEstNom_deg = FreqTrans.GainPhase(TaEstNom, magUnit='mag', phaseUnit='deg', unwrap=True) gainTaEstUnc_mag = FreqTrans.Gain(TaEstUnc, magUnit='mag') if False: for iPlot, io in enumerate(ioArray): iOut, iIn = io outName = outPlot[iOut] inName = inPlot[iIn] fig = 80 + iPlot
fig = FreqTrans.PlotVectorMargin(freq_hz[iIn], vmTEstSamp_mag[iOut, iIn, :, iSamp], marker='.', color = 'gray', linestyle='None', fig = fig, label = 'Sampled (MIMO)') ax = fig.get_axes() handles, labels = ax[0].get_legend_handles_labels() handles = [handles[0], handles[3], handles[1], handles[4], handles[2], handles[5]] labels = [labels[0], labels[3], labels[1], labels[4], labels[2], labels[5]] ax[0].legend(handles, labels) fig.suptitle('$u_' + str(iIn) + '$ to ' + '$z_' + str(iOut) + '$') fig.set_tight_layout(True) #%% Bode Plot # Linear Model Gain and Phase gainTLinNom_mag, phaseTLinNom_deg = FreqTrans.GainPhase(TLinNom, magUnit = 'mag', unwrap = True) gainTLinUnc_mag = FreqTrans.Gain(TLinUnc, magUnit = 'mag') # Estimated Gain and Phase gainTEstNom_mag, phaseTEstNom_deg = FreqTrans.GainPhase(TEstNom, magUnit = 'mag', unwrap = True) gainTEstUnc_mag = FreqTrans.Gain(TEstUnc, magUnit = 'mag') np.mean(gainTEstUnc_mag, axis = -1) / np.mean(gainTLinUnc_mag, axis = -1) # should be 1 if scaled correctly if False: for iPlot, [iOut, iIn] in enumerate(ioArray): fig = None fig = FreqTrans.PlotBode(freqLin_hz, gainTLinNom_mag[iOut, iIn], phaseTLinNom_deg[iOut, iIn], coher_nd = cohTLin_mag[iOut, iIn], gainUnc_mag = None, fig = fig, dB = True, color='k', label='Linear Nominal' + ' [$u_' + str(iIn+1) + '$ to ' + '$z_' + str(iOut+1) + '$]') fig = FreqTrans.PlotBode(freqLin_hz, gainTLinUnc_mag[iOut, iIn], None, coher_nd = None, gainUnc_mag = None, fig = fig, dB = True, color='k', linestyle='--', label='Linear Uncertainty' + ' [$u_' + str(iIn+1) + '$ to ' + '$z_' + str(iOut+1) + '$]') fig = FreqTrans.PlotBode(freq_hz[iIn], gainTEstNom_mag[iOut, iIn], phaseTEstNom_deg[iOut, iIn], coher_nd = cohTEst_mag[iOut, iIn], gainUnc_mag = None, fig = fig, dB = True, color='b', linestyle='None', marker='.', label='Estimate Nominal' + ' [$u_' + str(iIn+1) + '$ to ' + '$z_' + str(iOut+1) + '$]') fig = FreqTrans.PlotBode(freq_hz[iIn], gainTEstUnc_mag[iOut, iIn], None, coher_nd = None, gainUnc_mag = None, fig = fig, dB = True, color='r', linestyle='None', marker='.', label='Estimate Uncertainty' + ' [$u_' + str(iIn+1) + '$ to ' + '$z_' + str(iOut+1) + '$]')
T_seg[..., i] = (Tey[..., i] @ np.linalg.inv(Teu[..., i])) TUnc_seg[..., i] = (TeyUnc[..., i] @ np.linalg.inv(Teu[..., i])) T.append(T_seg) TUnc.append(np.abs(TUnc_seg)) C.append(Cey) T_InputNames = sigInList T_OutputNames = sigOutList # Compute Gain, Phase, Crit Distance gain_mag = [] gainUnc_mag = [] phase_deg = [] for iSeg in range(0, len(oDataSegs)): gain_mag.append(FreqTrans.Gain(T[iSeg], magUnit='mag')) gainUnc_mag.append(FreqTrans.Gain(TUnc[iSeg], magUnit='mag')) phase_deg.append(FreqTrans.Phase(T[iSeg], phaseUnit='deg', unwrap=False)) #%% Spectrograms if False: iSgnl = 0 freqRate_rps = 50 * hz2rps # freqSpec = np.asarray(freqExc_rps).flatten() freqSpec = freqExc_rps[iSgnl] optSpec = FreqTrans.OptSpect(dftType='czt', freq=freqSpec, freqRate=freqRate_rps,
str(iOut) + ']') #%% Bode Plot - Compl Sens Function # Linear Model Gain and Phase gainTiLinUnc_mag, phaseTiLinUnc_deg = FreqTrans.GainPhase(TiLinUnc, magUnit='mag', phaseUnit='deg', unwrap=True) cohTiLin_mag = np.ones_like(TiLinUnc) # Estimated gainTiEstNom_mag, phaseTiEstNom_deg = FreqTrans.GainPhase(TiEstNom, magUnit='mag', phaseUnit='deg', unwrap=True) gainTiEstUnc_mag = FreqTrans.Gain( TiEstUnc, magUnit='mag') # Estimation Uncertain Response cohTiEst_mag = TiEstCoh # Estimation Coherence cohTiEstMin = np.min(cohTiEst_mag, axis=(0, 1)) if False: numOut, numIn = TiLinNom.shape[0:-1] ioArray = np.array(np.meshgrid(np.arange(numOut), np.arange(numIn))).T.reshape(-1, 2) for iPlot, io in enumerate(ioArray): [iOut, iIn] = io fig = 20 + iPlot fig = FreqTrans.PlotBode(freqLin_hz, gainTiLinNom_mag[iOut, iIn], phaseTiLinNom_deg[iOut, iIn],
marker='+', label='Critical Region') fig.suptitle(inPlot[iIn] + ' to ' + outPlot[iOut]) ax = fig.get_axes() ax[0].set_xlim(-3, 1) ax[0].set_ylim(-2, 2) #%% Bode Plots gainLaEstNomList_mag = [] gainLaEstUncList_mag = [] phaseLaEstNomList_deg = [] for iSeg in range(0, len(oDataSegs)): gainLaEstNom_mag, phaseLaEstNom_deg = FreqTrans.GainPhase( LaEstNomList[iSeg], magUnit='mag', phaseUnit='deg', unwrap=True) gainLaEstUnc_mag = FreqTrans.Gain(LaEstNomList[iSeg], magUnit='mag') gainLaEstNomList_mag.append(gainLaEstNom_mag) phaseLaEstNomList_deg.append(phaseLaEstNom_deg) gainLaEstUncList_mag.append(gainLaEstUnc_mag) if False: for iPlot, [iOut, iIn] in enumerate(ioArray): fig = 20 + iPlot for iSeg in range(0, len(oDataSegs)): gain_mag = gainLaEstNomList_mag[iSeg][iOut, iIn] phase_deg = phaseLaEstNomList_deg[iSeg][iOut, iIn] coher_nd = LaEstCohList[iSeg][iOut, iIn] gainUnc_mag = gainLaEstUncList_mag[iSeg][iOut, iIn]
for Txy in TxyList: plt.plot(np.angle(Txy[0], deg=True), mag2db(np.abs(Txy[0])), '.', label = 'Simulation') plt.grid(True) plt.legend() #%% ampPeakFactor = ampList / sigPeakFactor gainDF_mag, phaseDF_deg = FreqTrans.GainPhase(nDF, magUnit = 'mag', unwrap = True) TxyArrayMax = np.nanmax(np.abs(TxyArray).squeeze(), axis=0) TxyArrayNorm = TxyArray.squeeze() / TxyArrayMax gainTxyMean_mag = FreqTrans.Gain(TxyArrayNorm, magUnit = 'mag') gainTxy_mag = FreqTrans.Gain(TxyArray.T.squeeze(), magUnit = 'mag').T gainTxyMax_mag = np.nanmax(gainTxy_mag, axis=0) gainTxyNorm_mag = (gainTxy_mag / gainTxyMax_mag) gainTxyMean_mag = np.nanmean(gainTxyNorm_mag, axis=-1) phaseTxy_deg = FreqTrans.Phase(TxyArray.T.squeeze(), phaseUnit = 'deg', unwrap = True).T phaseTxy_deg[:, phaseTxy_deg[0] > 90] -= 360 phaseTxyMean_deg = np.nanmean(phaseTxy_deg, axis=-1) CxyArrayMin = np.nanmin(np.abs(CxyArray.T.squeeze()), axis=0) CxyArrayMax = np.nanmax(np.abs(CxyArray.T.squeeze()), axis=0) CxyArrayMean = np.nanmean(CxyArray.T.squeeze(), axis=0) fig = None