xref: /aosp_15_r20/external/libopus/dnn/torch/fargan/rc.py (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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