%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%20process_fdn%20%E2%80%94%20Pure%20DSS%20Simulation%0A%0A%20%20%20%20Demonstrates%20%60pyFDN.process_fdn%60%20for%20time-domain%20simulation%20of%20a%20feedback%20delay%20network%20with%20static%20matrices.%0A%20%20%20%20A%20dry%20audio%20signal%20is%20run%20through%20the%20FDN%20to%20produce%20reverberation.%0A%0A%20%20%20%20For%20FDNs%20with%20absorption%20filters%20or%20learnable%20parameters%2C%20use%20the%20FLAMO%20path%20(%60dss_to_flamo%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%20numpy%20as%20np%0A%0A%20%20%20%20import%20pyFDN%0A%0A%20%20%20%20return%20np%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%20Load%20dry%20audio%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20pyFDN)%3A%0A%20%20%20%20dry%2C%20fs%20%3D%20pyFDN.load_audio(%22synth_dry.wav%22)%0A%0A%20%20%20%20print(f%22Loaded%20%7Blen(dry)%7D%20samples%20at%20%7Bfs%7D%20Hz%20(%7Blen(dry)%20%2F%20fs%3A.2f%7D%20s)%22)%0A%20%20%20%20mo.vstack(%5Bmo.audio(dry%2C%20fs)%5D)%0A%20%20%20%20return%20dry%2C%20fs%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%20Define%20FDN%20parameters%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fs%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20delays%20%3D%20pyFDN.ms_to_smp(np.array(%5B20%2C%2027%2C%2031%2C%2037%2C%2043%2C%2053%2C%2061%2C%2071%5D)%2C%20fs)%0A%20%20%20%20build%20%3D%20pyFDN.fdn_build_gallery(%0A%20%20%20%20%20%20%20%20fs%3Dfs%2C%0A%20%20%20%20%20%20%20%20delays%3Ddelays%2C%0A%20%20%20%20%20%20%20%20io_type%3D%22normalized%22%2C%0A%20%20%20%20%20%20%20%20direct_gain%3D0.0%2C%0A%20%20%20%20%20%20%20%20rt%3DNone%2C%0A%20%20%20%20%20%20%20%20rng%3D0%2C%0A%20%20%20%20)%0A%20%20%20%20%23%20Bake%20delay-proportional%20broadband%20decay%20into%20the%20lossless%20feedback%20matrix.%0A%20%20%20%20g%20%3D%20pyFDN.rt_to_gain_per_sample(2.0%2C%20fs)%0A%20%20%20%20delays%20%3D%20build.delays%0A%20%20%20%20A%20%3D%20np.diag(g**delays)%20%40%20build.A%0A%20%20%20%20B%2C%20C%2C%20D%20%3D%20build.B%2C%20build.C%2C%20build.D%0A%0A%20%20%20%20print(f%22Delays%3A%20%7Bdelays%7D%20samples%2C%20gain%20per%20sample%3A%20%7Bg%3A.6f%7D%22)%0A%20%20%20%20return%20A%2C%20B%2C%20C%2C%20D%2C%20delays%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%20Run%20dry%20signal%20through%20the%20FDN%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%20dry%2C%20fs%2C%20mo%2C%20pyFDN)%3A%0A%20%20%20%20wet%20%3D%20pyFDN.process_fdn(dry%2C%20delays%2C%20A%2C%20B%2C%20C%2C%20D)%0A%20%20%20%20wet%20%3D%20pyFDN.peak_normalize(wet)%0A%0A%20%20%20%20print(f%22Output%20shape%3A%20%7Bwet.shape%7D%22)%0A%20%20%20%20mo.vstack(%5Bmo.audio(wet%2C%20fs)%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%20Plot%20impulse%20response%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%20fs%2C%20pyFDN)%3A%0A%20%20%20%20ir%20%3D%20pyFDN.dss_to_impz(4%20*%20fs%2C%20delays%2C%20A%2C%20B%2C%20C%2C%20D)%5B%3A%2C%200%2C%200%5D%0A%20%20%20%20pyFDN.plot_impulse_response(ir%2C%20fs%3Dfs)%0A%20%20%20%20return%20(ir%2C)%0A%0A%0A%40app.cell%0Adef%20_(fs%2C%20ir%2C%20pyFDN)%3A%0A%20%20%20%20pyFDN.plot_edc(ir%2C%20fs%3Dfs)%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
7578665fcfebe36b5fb94648c4ab3b0e