1*a58d3d2aSXin Liimport torch 2*a58d3d2aSXin Li 3*a58d3d2aSXin Li 4*a58d3d2aSXin Li 5*a58d3d2aSXin Lidef rc2lpc(rc): 6*a58d3d2aSXin Li order = rc.shape[-1] 7*a58d3d2aSXin Li lpc=rc[...,0:1] 8*a58d3d2aSXin Li for i in range(1, order): 9*a58d3d2aSXin Li lpc = torch.cat([lpc + rc[...,i:i+1]*torch.flip(lpc,dims=(-1,)), rc[...,i:i+1]], -1) 10*a58d3d2aSXin Li #print("to:", lpc) 11*a58d3d2aSXin Li return lpc 12*a58d3d2aSXin Li 13*a58d3d2aSXin Lidef lpc2rc(lpc): 14*a58d3d2aSXin Li order = lpc.shape[-1] 15*a58d3d2aSXin Li rc = lpc[...,-1:] 16*a58d3d2aSXin Li for i in range(order-1, 0, -1): 17*a58d3d2aSXin Li ki = lpc[...,-1:] 18*a58d3d2aSXin Li lpc = lpc[...,:-1] 19*a58d3d2aSXin Li lpc = (lpc - ki*torch.flip(lpc,dims=(-1,)))/(1 - ki*ki) 20*a58d3d2aSXin Li rc = torch.cat([lpc[...,-1:] , rc], -1) 21*a58d3d2aSXin Li return rc 22*a58d3d2aSXin Li 23*a58d3d2aSXin Liif __name__ == "__main__": 24*a58d3d2aSXin Li rc = torch.tensor([[.5, -.5, .6, -.6]]) 25*a58d3d2aSXin Li print(rc) 26*a58d3d2aSXin Li lpc = rc2lpc(rc) 27*a58d3d2aSXin Li print(lpc) 28*a58d3d2aSXin Li rc2 = lpc2rc(lpc) 29*a58d3d2aSXin Li print(rc2) 30