%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%20state-space%0A%0A%20%20%20%20This%20example%20converts%20an%20FDN%20in%20**delay%20state-space**%20form%20(separate%20delay%20lengths%20and%20feedback%20matrix)%20into%20a%20single%20**state-space**%20system%2C%20and%20checks%20that%20the%20impulse%20response%20matches%20the%20delay-state-space%20implementation.%0A%0A%20%20%20%20**What%20it%20does%3A**%0A%20%20%20%20-%20Builds%20a%20small%20lossless%20FDN%3A%20random%20orthogonal%20matrix%2C%20diagonal%20of%20gains%20%60g%5Em%60%2C%20and%20random%20input%2Foutput%20vectors.%0A%20%20%20%20-%20Uses%20%60pyFDN.dss_to_ss%60%20to%20get%20the%20equivalent%20state-space%20matrices%20%60(A%2C%20b%2C%20c%2C%20d)%60.%0A%20%20%20%20-%20Computes%20the%20impulse%20response%20both%20via%20%60scipy.signal%60%20(from%20the%20state-space)%20and%20via%20%60pyFDN.dss2impz%60%20(from%20the%20delay%20state-space).%0A%20%20%20%20-%20Plots%20both%20(mu-law%20encoded)%20and%20asserts%20they%20match%20within%20tolerance.%0A%20%20%20%20-%20Plots%20the%20FDN%20parameters%20(feedback%20matrix%2C%20delays%2C%20I%2FO%20vectors%2C%20magnitude%20response)%20with%20%60pyFDN.plot_FDN_build%60.%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%20dataclasses%0A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20scipy.signal%20import%20dimpulse%2C%20dlti%0A%0A%20%20%20%20import%20pyFDN%0A%0A%20%20%20%20np.random.seed(1)%0A%20%20%20%20%23%20Impulse%20response%20length%20for%20comparison%0A%20%20%20%20impulse_response_length%20%3D%201000%0A%0A%20%20%20%20m%20%3D%20np.array(%5B13%2C%2019%2C%2023%5D)%0A%20%20%20%20build%20%3D%20pyFDN.fdn_build_gallery(%0A%20%20%20%20%20%20%20%20delays%3Dm%2C%0A%20%20%20%20%20%20%20%20io_type%3D%22random%22%2C%0A%20%20%20%20%20%20%20%20direct_gain%3DNone%2C%0A%20%20%20%20%20%20%20%20rt%3D0.02%2C%0A%20%20%20%20%20%20%20%20rng%3D1%2C%0A%20%20%20%20)%0A%20%20%20%20%23%20Bake%20attenuation%20into%20A%20matrix%20for%20easier%20comparison.%0A%20%20%20%20build%20%3D%20dataclasses.replace(build%2C%20A%3Dnp.diag(build.filters%5B0%2C%200%2C%20%3A%5D)%20%40%20build.A)%0A%20%20%20%20A%2C%20b%2C%20c%2C%20d%20%3D%20build.A%2C%20build.B%2C%20build.C%2C%20build.D%0A%0A%20%20%20%20%23%20Convert%20delay%20state-space%20to%20single%20state-space%20system%0A%20%20%20%20aa%2C%20bb%2C%20cc%2C%20dd%20%3D%20pyFDN.dss_to_ss(m%2C%20A%2C%20b%2C%20c%2C%20d)%0A%20%20%20%20%23%20Via%20state-space%20(scipy)%0A%20%20%20%20system%20%3D%20dlti(aa%2C%20bb%2C%20cc%2C%20dd%2C%20dt%3D1.0)%0A%20%20%20%20_%2C%20ir_state_space%20%3D%20dimpulse(system%2C%20n%3Dimpulse_response_length)%0A%20%20%20%20ir_state_space%20%3D%20np.squeeze(ir_state_space)%0A%0A%20%20%20%20%23%20Via%20delay%20state-space%20(pyFDN)%3B%20shape%20(ir_len%2C%20n_out%2C%20n_in)%0A%20%20%20%20ir_delay_state_space%20%3D%20pyFDN.dss_to_impz(impulse_response_length%2C%20m%2C%20A%2C%20b%2C%20c%2C%20d)%0A%20%20%20%20ir_delay_state_space%20%3D%20np.asarray(ir_delay_state_space).squeeze()%0A%0A%20%20%20%20%23%20Sanity%20check%3A%20both%20implementations%20match%0A%20%20%20%20assert%20pyFDN.is_almost_zero(ir_state_space%20-%20ir_delay_state_space%2C%20tol%3D0.001)%0A%0A%20%20%20%20pyFDN.plot_impulse_response(%0A%20%20%20%20%20%20%20%20ir_state_space%2C%0A%20%20%20%20%20%20%20%20ir_delay_state_space%2C%0A%20%20%20%20%20%20%20%20labels%3D%5B%22State%20space%22%2C%20%22Delay%20state%20space%22%5D%2C%0A%20%20%20%20)%0A%20%20%20%20return%20aa%2C%20bb%2C%20build%2C%20cc%2C%20dd%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%20FDN%20parameter%20overview%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(build%2C%20pyFDN)%3A%0A%20%20%20%20pyFDN.plot_FDN_build(build%2C%20title%3D%22FDN%20parameters%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%20Equivalent%20state-space%20system%0A%0A%20%20%20%20The%20single%20state-space%20matrices%20%60(A%2C%20b%2C%20c%2C%20d)%60%20returned%20by%20%60pyFDN.dss_to_ss%60%2C%0A%20%20%20%20expanding%20the%20delay%20lines%20into%20unit-delay%20states.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(aa%2C%20bb%2C%20cc%2C%20dd%2C%20pyFDN)%3A%0A%20%20%20%20pyFDN.plot_system_matrix(aa%2C%20bb%2C%20cc%2C%20dd%2C%20title%3D%22State-space%20system%22)%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
672947e6c995a8c4e3e14e3ee58109fa