%23%20gallery_category%3A%20Translation%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%20Delay%20state-space%20to%20transfer%20function%0A%0A%20%20%20%20Convert%20the%20delay%20state-space%20form%20of%20an%20FDN%20into%20matrix%20transfer%20function%20form%20(%60dss_to_tf%60).%20Verify%20by%20comparing%20the%20impulse%20response%20from%20the%20TF%20with%20the%20one%20from%20direct%20delay%20state-space%20simulation%20(%60dss_to_impz%60).%0A%0A%20%20%20%20**What%20it%20does%3A**%0A%20%20%20%20-%20Defines%20an%20FDN%20with%20random%20orthogonal%20feedback%2C%20random%20delays%2C%20and%20MIMO%20B%2C%20C%2C%20D.%0A%20%20%20%20-%20Converts%20to%20transfer%20function%3A%20%60(tfB%2C%20tfA)%20%3D%20dss_to_tf(delays%2C%20A%2C%20B%2C%20C%2C%20D)%60.%0A%20%20%20%20-%20Computes%20IR%20via%20TF%3A%20%60mtf_to_impz(tfB%2C%20tfA%2C%20ir_len)%60.%0A%20%20%20%20-%20Computes%20IR%20via%20delay%20state-space%3A%20%60dss_to_impz(ir_len%2C%20delays%2C%20A%2C%20B%2C%20C%2C%20D)%60.%0A%20%20%20%20-%20Plots%20poles%20(from%20%60roots(tfA)%60)%20and%20one%20channel%20IR%20(TF%20vs%20DSS)%2C%20and%20asserts%20the%20two%20IRs%20match.%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%0A%20%20%20%20import%20pyFDN%0A%0A%20%20%20%20np.random.seed(5)%0A%20%20%20%20fs%20%3D%2048000%0A%20%20%20%20impulse_response_length%20%3D%20fs%20%2F%2F%20100%0A%0A%20%20%20%20build%20%3D%20pyFDN.fdn_build_gallery(%0A%20%20%20%20%20%20%20%204%2C%0A%20%20%20%20%20%20%20%20fs%3Dfs%2C%0A%20%20%20%20%20%20%20%20delay_range%3D(50%2C%20101)%2C%0A%20%20%20%20%20%20%20%20num_inputs%3D3%2C%0A%20%20%20%20%20%20%20%20num_outputs%3D2%2C%0A%20%20%20%20%20%20%20%20io_type%3D%22identity%22%2C%0A%20%20%20%20%20%20%20%20direct_gain%3DNone%2C%0A%20%20%20%20%20%20%20%20rt%3DNone%2C%0A%20%20%20%20%20%20%20%20rng%3D5%2C%0A%20%20%20%20)%0A%20%20%20%20A%2C%20B%2C%20C%2C%20D%2C%20delays%20%3D%20(%0A%20%20%20%20%20%20%20%20build.A%2C%0A%20%20%20%20%20%20%20%20build.B%2C%0A%20%20%20%20%20%20%20%20build.C%2C%0A%20%20%20%20%20%20%20%20build.D%2C%0A%20%20%20%20%20%20%20%20build.delays%2C%0A%20%20%20%20)%0A%20%20%20%20return%20A%2C%20B%2C%20C%2C%20D%2C%20delays%2C%20impulse_response_length%2C%20pyFDN%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%20Transfer%20function%20path%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20B%2C%20C%2C%20D%2C%20delays%2C%20impulse_response_length%2C%20pyFDN)%3A%0A%20%20%20%20%23%20Delay%20state-space%20-%3E%20transfer%20function%20-%3E%20impulse%20response%0A%20%20%20%20tfB%2C%20tfA%20%3D%20pyFDN.dss_to_tf(delays%2C%20A%2C%20B%2C%20C%2C%20D)%0A%20%20%20%20ir_tf%20%3D%20pyFDN.mtf_to_impz(tfB%2C%20tfA%2C%20impulse_response_length)%0A%20%20%20%20%23%20poles_tf%20%3D%20np.roots(np.flip(tfA))%20%20%23%20tfA%20is%20z%5E%7B-1%7D%20ordering%3B%20roots()%20expects%20descending%20powers%0A%20%20%20%20return%20(ir_tf%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%23%20Delay%20state-space%20path%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20B%2C%20C%2C%20D%2C%20delays%2C%20impulse_response_length%2C%20pyFDN)%3A%0A%20%20%20%20%23%20Delay%20state-space%20-%3E%20direct%20impulse%20response%20(time-domain%20simulation)%0A%20%20%20%20ir_dss%20%3D%20pyFDN.dss_to_impz(impulse_response_length%2C%20delays%2C%20A%2C%20B%2C%20C%2C%20D)%0A%20%20%20%20%23%20ir_dss%20shape%3A%20(ir_len%2C%20num_output%2C%20num_input)%0A%20%20%20%20return%20(ir_dss%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%23%20Plots%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ir_dss%2C%20ir_tf%2C%20mo%2C%20pyFDN)%3A%0A%20%20%20%20fig1%20%3D%20pyFDN.plot_impulse_response_matrix(t%3DNone%2C%20ir%3Dir_tf)%0A%20%20%20%20fig2%20%3D%20pyFDN.plot_impulse_response_matrix(t%3DNone%2C%20ir%3Dir_dss)%0A%0A%20%20%20%20mo.vstack(%5Bfig1%2C%20fig2%5D)%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%20Verification%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ir_dss%2C%20ir_tf%2C%20pyFDN)%3A%0A%20%20%20%20%23%20Test%3A%20impulse%20response%20from%20TF%20matches%20delay%20state-space%20simulation%0A%20%20%20%20assert%20pyFDN.is_almost_zero(ir_dss%20-%20ir_tf%2C%20tol%3D1e-10)%2C%20(%0A%20%20%20%20%20%20%20%20%22IR%20from%20TF%20and%20DSS%20should%20match%22%0A%20%20%20%20)%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
ac713b19e5feecbf02716e21dcd93f3d