%23%20gallery_category%3A%20Allpass%20FDN%20Examples%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.23.13%22%0Aapp%20%3D%20marimo.App()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Allpass%20FDN%20completion%0A%0A%20%20%20%20For%20a%20given%20feedback%20matrix%20**A**%2C%20the%20goal%20is%20to%20construct%20**b**%2C%20**c**%2C%20and%20**d**%20such%20that%20the%20FDN%20is%20uniallpass.%0A%0A%20%20%20%20See%20*Allpass%20Feedback%20Delay%20Networks*%2C%20Sebastian%20J.%20Schlecht%20(IEEE%20Trans.%20Signal%20Processing).%0A%0A%20%20%20%20%E2%80%94%20Original%20MATLAB%3A%20Sebastian%20J.%20Schlecht%2C%209%20June%202020%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Setup%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20scipy%0A%0A%20%20%20%20import%20pyFDN%0A%0A%20%20%20%20np.random.seed(3)%0A%20%20%20%20return%20np%2C%20pyFDN%2C%20scipy%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20complete%20allpass%20FDN%20(full%20MIMO)%0A%0A%20%20%20%20Given%20**A**%20from%20a%20random%20orthogonal%20matrix%2C%20use%20**complete_fdn**%20with%20**k%20%3D%20N**%20to%20get%20**B%2C%20C%2C%20D**%20so%20that%20**V%20%3D%20%5BA%2CB%3BC%2CD%5D**%20is%20orthogonal.%20Check%20with%20**is_uniallpass**.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pyFDN)%3A%0A%20%20%20%20_N%20%3D%2012%0A%20%20%20%20_num_io%20%3D%20_N%0A%20%20%20%20_U%20%3D%20pyFDN.random_orthogonal(_N)%0A%20%20%20%20_G%20%3D%20np.diag(np.random.rand(_N))%0A%20%20%20%20_A%20%3D%20_U%20%40%20_G%0A%20%20%20%20_B%2C%20_C%2C%20_D%2C%20_X%20%3D%20pyFDN.complete_fdn(_A%2C%20k%3D_num_io)%0A%20%20%20%20_is_a%2C%20_P%20%3D%20pyFDN.is_uniallpass(_A%2C%20_B%2C%20_C%2C%20_D%2C%20tol%3D1e-07)%0A%20%20%20%20assert%20_is_a%2C%20%22Completed%20system%20should%20be%20uniallpass%22%0A%20%20%20%20pyFDN.plot_system_matrix(_A%2C%20_B%2C%20_C%2C%20_D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20complete%20diagonally%20similar%20to%20orthogonal%20(MIMO)%0A%0A%20%20%20%20**A**%20is%20diagonally%20similar%20to%20an%20orthogonal%20block%3B%20use%20**complete_fdn**%20with%20**k%3D1**%20and%20check%20with%20**is_uniallpass**.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pyFDN%2C%20scipy)%3A%0A%20%20%20%20_N%20%3D%203%0A%20%20%20%20_num_io%20%3D%202%0A%20%20%20%20X1%20%3D%20scipy.linalg.block_diag(np.diag(np.random.rand(_N))%2C%20np.eye(_num_io))%0A%20%20%20%20V%20%3D%20pyFDN.random_orthogonal(_N%20%2B%20_num_io)%0A%20%20%20%20XVX%20%3D%20np.linalg.solve(X1%2C%20V%20%40%20X1)%0A%20%20%20%20XAX%20%3D%20XVX%5B%3A_N%2C%20%3A_N%5D%0A%20%20%20%20_B%2C%20_C%2C%20_D%2C%20_X%20%3D%20pyFDN.complete_fdn(XAX%2C%20k%3D_num_io)%0A%20%20%20%20_is_a%2C%20_P%20%3D%20pyFDN.is_uniallpass(XAX%2C%20_B%2C%20_C%2C%20_D%2C%20tol%3D1e-07)%0A%20%20%20%20assert%20_is_a%2C%20%22Completed%20system%20should%20be%20uniallpass%22%0A%20%20%20%20pyFDN.plot_system_matrix(XAX%2C%20_B%2C%20_C%2C%20_D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20complete%20series%20allpass%20(SISO)%0A%0A%20%20%20%20**A**%20from%20Schroeder%20series%20allpass%3B%20use%20**complete_fdn**%20with%20**k%3D1**%20and%20check%20with%20**is_uniallpass**.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pyFDN)%3A%0A%20%20%20%20_N%20%3D%204%0A%20%20%20%20_g%20%3D%20np.random.uniform(0.5%2C%200.99%2C%20_N)%0A%20%20%20%20_A%2C%20_%2C%20_%2C%20_%20%3D%20pyFDN.series_allpass(_g)%0A%20%20%20%20_B%2C%20_C%2C%20_D%2C%20_X%20%3D%20pyFDN.complete_fdn(_A%2C%20k%3D1)%0A%20%20%20%20_is_a%2C%20_P%20%3D%20pyFDN.is_uniallpass(_A%2C%20_B%2C%20_C%2C%20_D%2C%20tol%3D1e-07)%0A%20%20%20%20assert%20_is_a%2C%20%22Completed%20system%20should%20be%20uniallpass%22%0A%20%20%20%20pyFDN.plot_system_matrix(_A%2C%20_B%2C%20_C%2C%20_D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Test%3A%20nested%20allpass%20(SISO)%0A%0A%20%20%20%20**A**%20from%20nested%20allpass%3B%20use%20**complete_fdn**%20with%20**k%3D1**%20and%20check%20with%20**is_uniallpass**.%20(Completion%20can%20sometimes%20fail%20for%20poor%20singular-value%20structure.)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pyFDN)%3A%0A%20%20%20%20_N%20%3D%203%0A%20%20%20%20_g%20%3D%20np.random.uniform(0.5%2C%200.99%2C%20_N)%0A%20%20%20%20_A%2C%20_%2C%20_%2C%20_%20%3D%20pyFDN.nested_allpass(_g)%0A%20%20%20%20_B%2C%20_C%2C%20_D%2C%20_X%20%3D%20pyFDN.complete_fdn(_A%2C%20k%3D1)%0A%20%20%20%20_is_a%2C%20_P%20%3D%20pyFDN.is_uniallpass(_A%2C%20_B%2C%20_C%2C%20_D%2C%20tol%3D1e-07)%0A%20%20%20%20assert%20_is_a%2C%20%22Completed%20system%20should%20be%20uniallpass%22%0A%20%20%20%20pyFDN.plot_system_matrix(_A%2C%20_B%2C%20_C%2C%20_D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Homogeneous%20allpass%20with%20random%20admissible%20X%0A%0A%20%20%20%20Random%20delays%20and%20gain%20matrix%20**G**%2C%20then%20random%20admissible%20diagonal%20**X**%20(Python%20translation%20of%20%60randAdmissibleHomogeneousAllpass%60)%2C%20and%20**homogeneous_allpass_fdn(G%2C%20X)**.%20Then%20complete%20feedback%20matrix%20with%20**complete_fdn**%20and%20check%20again%20with%20**is_uniallpass**.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pyFDN)%3A%0A%20%20%20%20%23%20Homogeneous%20allpass%20FDN%20with%20random%20admissible%20diagonal%20X%0A%20%20%20%20_N%20%3D%204%0A%20%20%20%20delays%20%3D%20np.random.randint(1%2C%2031%2C%20size%3D_N)%20%20%23%20delays%20in%20samples%2C%201..30%0A%20%20%20%20_g%20%3D%200.99%0A%20%20%20%20_G%20%3D%20np.diag(_g**delays)%20%20%23%20global%20gain%20per%20sample%0A%20%20%20%20_X%20%3D%20pyFDN.rand_admissible_homogeneous_allpass(_G%2C%20(0.7%2C%200.999))%20%20%23%20gain%20matrix%0A%20%20%20%20_X%20%40%20_G%20%40%20_G%0A%20%20%20%20_A%2C%20b%2C%20c%2C%20d%2C%20_U%20%3D%20pyFDN.homogeneous_allpass_fdn(_G%2C%20_X)%0A%20%20%20%20is_a0%2C%20P0%20%3D%20pyFDN.is_uniallpass(_A%2C%20b%2C%20c%2C%20d%2C%20tol%3D1e-07)%0A%20%20%20%20assert%20is_a0%2C%20%22Completed%20system%20should%20be%20uniallpass%22%0A%20%20%20%20_B%2C%20_C%2C%20_D%2C%20_X%20%3D%20pyFDN.complete_fdn(_A%2C%20k%3D1)%0A%20%20%20%20_is_a%2C%20_P%20%3D%20pyFDN.is_uniallpass(_A%2C%20_B%2C%20_C%2C%20_D%2C%20tol%3D1e-07)%0A%20%20%20%20assert%20_is_a%2C%20%22Completed%20system%20should%20be%20uniallpass%22%0A%20%20%20%20pyFDN.plot_system_matrix(_A%2C%20_B%2C%20_C%2C%20_D)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
fc5225c4b854a6686933257279c932b4