%23%20gallery_category%3A%20Optimization%0A%23%20gallery_title%3A%20Colorless%20FDN%20presets%0A%23%20gallery_description%3A%20Load%20optimized%20colorless%20FDN%20builds%2C%20add%20a%20chosen%20decay%20time%2C%20and%20compare%20their%20magnitude%20responses%20and%20impulse%20responses.%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%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%2C%20pyFDN)%3A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%20Colorless%20FDN%0A%0A%20%20%20%20FDN%20optimized%20for%20reduced%20metallic%20ringing%20(perceptually%20colorless%20reverberation).%0A%20%20%20%20Original%20method%20published%20in%20*%7BpyFDN.paper_link(%22Differentiable_FDN_For_Colorless_Reverberation%22)%7D.*%0A%0A%20%20%20%20Parameters%20are%20loaded%20from%20readable%2C%20versioned%20JSON%20%60FDNBuild%60%20files%20converted%20from%20the%20%5Bdiff-fdn-colorless%5D(https%3A%2F%2Fgithub.com%2Fgdalsanto%2Fdiff-fdn-colorless)%20companion%20material.%20The%20impulse%20response%20is%20computed%20with%20%60pyFDN.dss_to_impz%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%20Listening%20parameters%0A%0A%20%20%20%20The%20optimization%20fixes%20the%20lossless%20part%20of%20the%20FDN%3B%20decay%20is%20added%20afterwards%2C%20so%20the%20reverberation%20time%20here%20is%20a%20free%20choice%20and%20not%20part%20of%20what%20was%20trained.%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%20fs%20%3D%2048000%0A%20%20%20%20rt%20%3D%203.0%0A%20%20%20%20ir_len%20%3D%20int(rt%20*%20fs)%0A%20%20%20%20return%20fs%2C%20ir_len%2C%20rt%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%20Choose%20parameter%20file%0A%0A%20%20%20%20Pick%20the%20FDN%20size%20%24N%24%20and%20delay%20set%3B%20the%20matching%20%60colorless_init_*%60%20JSON%20build%20provides%20the%20random%20initialization.%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%20import%20re%0A%0A%20%20%20%20_pairs%20%3D%20sorted(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20(int(match.group(1))%2C%20int(match.group(2)))%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20name%20in%20pyFDN.available_fdn_presets()%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(match%20%3A%3D%20re.fullmatch(r%22colorless_N(%5Cd%2B)_d(%5Cd%2B)%22%2C%20name))%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20_options%20%3D%20%7Bf%22N%20%3D%20%7Bn%7D%2C%20delay%20set%20%7Bd%7D%22%3A%20(n%2C%20d)%20for%20n%2C%20d%20in%20_pairs%7D%0A%20%20%20%20_default%20%3D%20%22N%20%3D%2016%2C%20delay%20set%201%22%0A%20%20%20%20param_choice%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D_options%2C%0A%20%20%20%20%20%20%20%20value%3D_default%20if%20_default%20in%20_options%20else%20next(iter(_options))%2C%0A%20%20%20%20%20%20%20%20label%3D%22Parameter%20file%22%2C%0A%20%20%20%20)%0A%20%20%20%20mo.output.replace(param_choice)%0A%20%20%20%20return%20(param_choice%2C)%0A%0A%0A%40app.cell%0Adef%20_(param_choice)%3A%0A%20%20%20%20N%2C%20delay_set%20%3D%20param_choice.value%0A%20%20%20%20print(f%22Selected%3A%20N%3D%7BN%7D%2C%20delay%20set%20%7Bdelay_set%7D%22)%0A%20%20%20%20return%20N%2C%20delay_set%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%20the%20packaged%20preset%0A%0A%20%20%20%20%60pyFDN.get_fdn_preset%60%20retrieves%20the%20packaged%20preset.%20We%20take%20its%20baked%0A%20%20%20%20%60FDNBuild%60%2C%20add%20the%20desired%20decay%20with%20%60pyFDN.build_set_decay%60%2C%20and%20render%0A%20%20%20%20it%20directly.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(N%2C%20delay_set%2C%20ir_len%2C%20pyFDN%2C%20rt)%3A%0A%20%20%20%20_preset%20%3D%20f%22colorless_N%7BN%7D_d%7Bdelay_set%7D%22%0A%20%20%20%20_lossless%20%3D%20pyFDN.get_fdn_preset(_preset).build%0A%20%20%20%20_build%20%3D%20pyFDN.build_set_decay(_lossless%2C%20rt)%0A%20%20%20%20ir_optim%20%3D%20pyFDN.build_to_impz(_build%2C%20ir_len).squeeze()%0A%20%20%20%20A%2C%20B%2C%20C%2C%20D%2C%20m%20%3D%20(%0A%20%20%20%20%20%20%20%20_lossless.A%2C%0A%20%20%20%20%20%20%20%20_lossless.B%2C%0A%20%20%20%20%20%20%20%20_lossless.C%2C%0A%20%20%20%20%20%20%20%20_lossless.D%2C%0A%20%20%20%20%20%20%20%20_lossless.delays%2C%0A%20%20%20%20)%0A%20%20%20%20return%20A%2C%20B%2C%20C%2C%20D%2C%20ir_optim%2C%20m%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%20Against%20the%20initialization%0A%0A%20%20%20%20The%20same%20delays%20and%20the%20same%20random%20draw%2C%20before%20the%20optimizer%20touched%20them.%20What%20changed%20is%20the%20feedback%20matrix%20and%20the%20input%2Foutput%20gains%20%E2%80%94%20the%20difference%20between%20a%20colorless%20FDN%20and%20the%20arbitrary%20one%20it%20started%20as.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(N%2C%20delay_set%2C%20ir_len%2C%20pyFDN%2C%20rt)%3A%0A%20%20%20%20_preset%20%3D%20f%22colorless_init_N%7BN%7D_d%7Bdelay_set%7D%22%0A%20%20%20%20_lossless%20%3D%20pyFDN.get_fdn_preset(_preset).build%0A%20%20%20%20_build%20%3D%20pyFDN.build_set_decay(_lossless%2C%20rt)%0A%20%20%20%20ir_init%20%3D%20pyFDN.build_to_impz(_build%2C%20ir_len).squeeze()%0A%20%20%20%20A_i%2C%20B_i%2C%20C_i%2C%20D_i%2C%20m_i%20%3D%20(%0A%20%20%20%20%20%20%20%20_lossless.A%2C%0A%20%20%20%20%20%20%20%20_lossless.B%2C%0A%20%20%20%20%20%20%20%20_lossless.C%2C%0A%20%20%20%20%20%20%20%20_lossless.D%2C%0A%20%20%20%20%20%20%20%20_lossless.delays%2C%0A%20%20%20%20)%0A%20%20%20%20return%20A_i%2C%20B_i%2C%20C_i%2C%20D_i%2C%20ir_init%2C%20m_i%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%0A%20%20%20%20%60pyFDN.plot_fdn_parameter%60%20shows%20the%20system%20matrix%20blocks%20%24A%24%2C%20%24b%24%2C%20%24c%24%2C%20%24d%24%20as%20heatmaps%20and%20the%20delays%20as%20bars%20aligned%20with%20the%20columns%20of%20the%20feedback%20matrix.%20The%20optimization%20changes%20%24A%24%2C%20%24b%24%2C%20%24c%24%20(the%20lossless%20part%2C%20before%20the%20homogeneous%20attenuation%20%24%5CGamma%20%3D%20%5Cmathrm%7Bdiag%7D(g%5Em)%24%20is%20applied)%3B%20the%20delays%20stay%20fixed.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A_i%2C%20B_i%2C%20C_i%2C%20D_i%2C%20m_i%2C%20pyFDN)%3A%0A%20%20%20%20pyFDN.plot_fdn_parameter(%0A%20%20%20%20%20%20%20%20m_i%2C%0A%20%20%20%20%20%20%20%20A_i%2C%0A%20%20%20%20%20%20%20%20B_i%2C%0A%20%20%20%20%20%20%20%20C_i%2C%0A%20%20%20%20%20%20%20%20D_i%2C%0A%20%20%20%20%20%20%20%20title%3D%22Random%20Initialization%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(A%2C%20B%2C%20C%2C%20D%2C%20m%2C%20pyFDN)%3A%0A%20%20%20%20pyFDN.plot_fdn_parameter(%0A%20%20%20%20%20%20%20%20m%2C%0A%20%20%20%20%20%20%20%20A%2C%0A%20%20%20%20%20%20%20%20B%2C%0A%20%20%20%20%20%20%20%20C%2C%0A%20%20%20%20%20%20%20%20D%2C%0A%20%20%20%20%20%20%20%20title%3D%22Optimized%22%2C%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%20Optimized%20versus%20initial%0A%0A%20%20%20%20The%20two%20impulse%20responses%2C%20and%20both%20to%20listen%20to.%20They%20look%20much%20alike%20%E2%80%94%20the%20optimization%20targets%20the%20*magnitude%20response*%2C%20not%20the%20waveform%20%E2%80%94%20so%20the%20difference%20is%20one%20to%20hear%20rather%20than%20to%20see%3A%20the%20initialization%20rings%2C%20the%20optimized%20build%20does%20not.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(fs%2C%20ir_init%2C%20ir_optim%2C%20mo%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20plot%20%3D%20pyFDN.plot_impulse_response(%0A%20%20%20%20%20%20%20%20ir_optim%2C%0A%20%20%20%20%20%20%20%20ir_init%2C%0A%20%20%20%20%20%20%20%20fs%3Dfs%2C%0A%20%20%20%20%20%20%20%20labels%3D%5B%22Optimized%22%2C%20%22Random%20Initialization%22%5D%2C%0A%20%20%20%20)%0A%0A%20%20%20%20audio_blocks%20%3D%20mo.vstack(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.Html(%22Random%20Initialization%22).style(%7B%22font-size%22%3A%20%222.0em%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.audio(np.asarray(ir_init)%2C%20rate%3Dfs)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.Html(%22Optimized%22).style(%7B%22font-size%22%3A%20%222.0em%22%7D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.audio(np.asarray(ir_optim)%2C%20rate%3Dfs)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20gap%3D1%2C%0A%20%20%20%20)%0A%20%20%20%20mo.vstack(%5Bplot%2C%20audio_blocks%5D%2C%20gap%3D3)%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
94553bb1b0a89f9fe96029d52d7c857e