%23%20gallery_category%3A%20Allpass%20FDN%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%20Gardner's%20Nested%20Allpass%20FDN%0A%0A%20%20%20%20Example%20for%20the%20nested%20allpass%20structure%3A%20an%20FDN%20built%20by%20iteratively%20nesting%20a%20feedforward%2Fback%20allpass%20around%20the%20previous%20system.%20SISO%20(single%20input%2C%20single%20output).%0A%0A%20%20%20%20**Reference%3A**%20Gardner%2C%20W.%20G.%20(1992).%20*A%20real-time%20multichannel%20room%20simulator.*%20J.%20Acoust.%20Soc.%20Am.%2092%2C%201%E2%80%9323.%0A%0A%20%20%20%20See%20also%3A%20*Allpass%20Feedback%20Delay%20Networks*%2C%20Sebastian%20J.%20Schlecht%20(IEEE%20Trans.%20Signal%20Processing).%0A%0A%20%20%20%20%E2%80%94%20Original%20MATLAB%3A%20Sebastian%20J.%20Schlecht%2C%207%20June%202020%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%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(42)%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%20Build%20nested%20allpass%20FDN%0A%0A%20%20%20%20Use%20a%20vector%20of%20gains%20**g**%20(one%20per%20nesting%20stage).%20Delays%20are%20powers%20of%20two%3A%20**m%20%3D%202%5E(0%3AN-1)**.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np%2C%20pyFDN)%3A%0A%20%20%20%20N%20%3D%206%0A%20%20%20%20g%20%3D%20np.array(%5B0.3%2C%200.4%2C%200.5%2C%200.6%2C%200.7%2C%200.8%5D)%0A%20%20%20%20delays%20%3D%20np.random.randint(200%2C%201000%2C%20size%3DN)%0A%0A%20%20%20%20A%2C%20B%2C%20C%2C%20D%20%3D%20pyFDN.nested_allpass(g)%0A%20%20%20%20print(%22A%20shape%3A%22%2C%20A.shape)%0A%20%20%20%20print(%22B%20shape%3A%22%2C%20B.shape)%0A%20%20%20%20print(%22C%20shape%3A%22%2C%20C.shape)%0A%20%20%20%20print(%22D%20shape%3A%22%2C%20D.shape)%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%20Plot%20the%20system%20matrix%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%20pyFDN)%3A%0A%20%20%20%20_fig%20%3D%20pyFDN.plot_system_matrix(A%2C%20B%2C%20C%2C%20D)%0A%20%20%20%20_fig.show()%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%20Test%3A%20uniallpass%0A%0A%20%20%20%20Check%20that%20the%20FDN%20is%20uniallpass%20(lossless%20with%20diagonal%20Lyapunov%20matrix).%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%20pyFDN)%3A%0A%20%20%20%20is_a%2C%20P%20%3D%20pyFDN.is_uniallpass(A%2C%20B%2C%20C%2C%20D)%0A%20%20%20%20assert%20is_a%2C%20%22Expected%20uniallpass%22%0A%20%20%20%20print(%22Uniallpass%3A%20OK%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%20Impulse%20response%0A%0A%20%20%20%20Render%20the%20IR%20and%20plot%20(SISO%3A%20single%20channel).%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%20pyFDN)%3A%0A%20%20%20%20Fs%20%3D%2048000%0A%20%20%20%20ir_len%20%3D%204%20*%20Fs%20%20%23%204%20seconds%0A%20%20%20%20impulse_response%20%3D%20pyFDN.dss_to_impz(ir_len%2C%20delays%2C%20A%2C%20B%2C%20C%2C%20D).squeeze()%0A%20%20%20%20%23%20Shape%3A%20(ir_len%2C%20n_out%2C%20n_in)%20-%3E%20(ir_len%2C%20)%20for%20SISO%0A%20%20%20%20return%20Fs%2C%20impulse_response%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%20Impulse%20response%20plot%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Fs%2C%20impulse_response%2C%20pyFDN)%3A%0A%20%20%20%20pyFDN.plot_impulse_response(%0A%20%20%20%20%20%20%20%20impulse_response%2C%0A%20%20%20%20%20%20%20%20fs%3DFs%2C%0A%20%20%20%20%20%20%20%20title%3D%22Nested%20allpass%20FDN%20%E2%80%94%20impulse%20response%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%20Spectrogram%20(one%20channel)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Fs%2C%20impulse_response%2C%20mo%2C%20np%2C%20pyFDN)%3A%0A%20%20%20%20channel_ir%20%3D%20np.asarray(impulse_response).squeeze()%0A%20%20%20%20_fig%20%3D%20pyFDN.plot_spectrogram(%0A%20%20%20%20%20%20%20%20channel_ir%2C%20Fs%2C%20title%3D%22Nested%20allpass%20FDN%20%E2%80%94%20spectrogram%22%0A%20%20%20%20)%0A%0A%20%20%20%20mo.vstack(%5B_fig%2C%20mo.audio(channel_ir%2C%20Fs)%5D)%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
a8ec11f9500d82855f4479b86f93b9f8