torch tensor是不支持复数运算的,但有的时候场景中使用的是复数信号,复数计算就是把复数(n*1)的复数变成两列(n*2),下面是把numpy代码改写成torch tensor的示例:
import numpy as np
import torch
1.numpy与torch类型转换
np_data=np.arange(6).reshape(2,3)
# numpy类型转torch
torch_data=torch.from_numpy(np_data)
#torch转回numpy
tensor2array=torch_data.numpy()
2.矩阵合并
#numpy使用
np.concatenate((w1, w2))
#torch使用
torch.cat((w1, w2))
3.傅里叶变换fft/反变换ifft,tensor类型的SigIn大小为(n,2),输出的sigFFT大小也是(n,2),表示数的实部和虚部
#numpy使用
SigFFT = np.fft.fft(SigIn)
SigOut=np.fft.ifft(SigFFT )
#torch使用
SigIn=torch.rand(1000,2)
SigFFT = torch.fft(SigIn,1)
SigOut=torch.ifft(SigFFT,1)
4.我写的运算函数,输入都是(n,2)shape的tensor
def complexExp(x):
#x是两列的tensor,利用欧拉公式计算
x1=torch.exp(x[:,0])*torch.cos(x[:,1])
y1=torch.unsqueeze(x1, 1)
x2=torch.exp(x[:,0])*torch.sin(x[:,1])
y2=torch.unsqueeze(x2, 1)
y=torch.cat((y1,y2),1)
return y
#复数乘法
def complexMulti(a,b):
c1=a[:,0]*b[:,0]-a[:,1]*b[:,1]
c1=torch.unsqueeze(c1, 1)
c2=a[:,0]*b[:,1]+a[:,1]*b[:,0]
c2=torch.unsqueeze(c2, 1)
c=torch.cat((c1,c2),1)
return c
#复数abs
def complexAbs(x):
y=torch.norm(x,dim=1)
y=torch.unsqueeze(y,1)
return y
5.exp(1j*x) x是大小为(n,)的tensor
def dim1to2(x,mode='real'):
'''
把(n,1) (n,2) (n)的数都变成(n,2)的shape
(n,1)和(n,)的可以选择放在实部还是虚部
Parameters
----------
x : TYPE
DESCRIPTION.
mode : 'real' and 'imag'The default is 'real'.
如果是'imag'的一维信号的话,值赋给虚部
Returns
-------
temp : (n,2)
'''
temp=torch.zeros(x.shape[0],2)
if x.dim()==1:
if mode=='real':
temp[:,0]=x
elif mode=='imag':
temp[:,1]=x
elif x.dim()==2:
if x.shape[1]==1:
if mode=='real':
temp[:,0]=x.reshape(-1)
elif mode=='imag':
temp[:,1]=x.reshape(-1)
elif x.shape[1]==2:
temp=x
return temp
#x (n,) exp(1j*x)
y=complexExp(dim1to2(x,'imag'))