%23%20gallery_category%3A%20Getting%20Started%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%20Vanilla%20FDN%20(FLAMO)%0A%0A%20%20%20%20Build%20a%20vanilla%20FDN%20with%20%60pyFDN.dss_to_flamo%60%2C%20optionally%20alter%20delays%20and%20feedforward%20(e.g.%20diagonal%20gain%2C%20no%20absorption)%2C%20plot%20IRs%2C%20and%20run%20a%20dry%20signal%20through%20the%20model.%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%20torch%0A%0A%20%20%20%20import%20pyFDN%0A%0A%20%20%20%20return%20np%2C%20pyFDN%2C%20torch%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%20Parameters%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(torch)%3A%0A%20%20%20%20torch.manual_seed(42)%0A%20%20%20%20n%20%3D%208%0A%20%20%20%20fs%20%3D%2048000%0A%20%20%20%20print(f%22n%3D%7Bn%7D%2C%20fs%3D%7Bfs%7D%22)%0A%20%20%20%20return%20fs%2C%20n%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%20Build%20model%20and%20get%20original%20IR%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fs%2C%20n%2C%20pyFDN)%3A%0A%20%20%20%20build%20%3D%20pyFDN.fdn_build_gallery(%0A%20%20%20%20%20%20%20%20n%2C%0A%20%20%20%20%20%20%20%20fs%3Dfs%2C%0A%20%20%20%20%20%20%20%20io_type%3D%22ones%22%2C%0A%20%20%20%20%20%20%20%20direct_gain%3D1.0%2C%0A%20%20%20%20%20%20%20%20rt%3D2.0%2C%0A%20%20%20%20%20%20%20%20rt_nyquist%3D0.5%2C%0A%20%20%20%20%20%20%20%20post_eq_db_dc%3D0.0%2C%0A%20%20%20%20%20%20%20%20post_eq_db_nyquist%3D-6.0%2C%0A%20%20%20%20%20%20%20%20rng%3D42%2C%0A%20%20%20%20)%0A%20%20%20%20model%20%3D%20pyFDN.dss_to_flamo(%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%20%20%20%20build.fs%2C%0A%20%20%20%20%20%20%20%20nfft%3D2**18%2C%0A%20%20%20%20%20%20%20%20sos_filter%3Dbuild.filters%2C%0A%20%20%20%20%20%20%20%20output_filter%3Dbuild.post_eq%2C%0A%20%20%20%20)%0A%20%20%20%20ir_original%20%3D%20pyFDN.flamo_time_response(model).flatten()%0A%20%20%20%20return%20build%2C%20ir_original%2C%20model%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%22Vanilla%20FDN%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%20Plot%20and%20listen%20to%20IRs%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fs%2C%20ir_original%2C%20mo%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20_fig%20%3D%20pyFDN.plot_impulse_response(%0A%20%20%20%20%20%20%20%20ir_original%2C%0A%20%20%20%20%20%20%20%20fs%3Dfs%2C%0A%20%20%20%20%20%20%20%20labels%3D%5B%22Original%22%5D%2C%0A%20%20%20%20%20%20%20%20title%3D%22Vanilla%20FDN%20impulse%20response%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20_fig%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22Original%3A%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.audio(np.asanyarray(ir_original)%2C%20fs)%2C%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%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%20Process%20dry%20audio%0A%0A%20%20%20%20Load%20packaged%20synth%20dry%2C%20trim%20to%20one%20block%20of%20length%20%60n_fft%60%2C%20run%20through%20the%20model%2C%20listen%20to%20dry%20and%20wet.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fs%2C%20mo%2C%20model%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20dry%2C%20_%20%3D%20pyFDN.load_audio(%22synth_dry.wav%22%2C%20fs%3Dfs)%0A%20%20%20%20%23%20Reserve%202%20s%20of%20trailing%20silence%20so%20the%20reverb%20tail%20does%20not%20wrap%20around.%0A%20%20%20%20wet%20%3D%20pyFDN.flamo_process(model%2C%20dry%2C%20fs%3Dfs%2C%20tail_seconds%3D2.0)%0A%0A%20%20%20%20mo.hstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22Dry%3A%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.audio(np.asanyarray(dry)%2C%20fs)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%22Wet%3A%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.audio(np.asarray(wet)%2C%20fs)%2C%0A%20%20%20%20%20%20%20%20%5D%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
e9700bcb12beee4df201e846b337f438