Python 3.x Python rfft算法

Python 3.x Python rfft算法,python-3.x,Python 3.x,Numpy有一个rfft函数来计算FFT或实输入。我想为此编写自己的代码。这是我的DFT和FFT[]的实际代码 def DFT_慢速(x): “”“计算一维阵列x的离散傅里叶变换”“” x=np.asarray(x,dtype=float) N=x.shape[0] n=np.arange(n) k=n.重塑(n,1)) M=np.exp(-2j*np.pi*k*n/n) 返回np.点(M,x) def FFT(x): “”“1D Cooley-Tukey FFT的递归实现”“” x=np.

Numpy有一个
rfft
函数来计算FFT或实输入。我想为此编写自己的代码。这是我的DFT和FFT[]的实际代码


def DFT_慢速(x):
“”“计算一维阵列x的离散傅里叶变换”“”
x=np.asarray(x,dtype=float)
N=x.shape[0]
n=np.arange(n)
k=n.重塑(n,1))
M=np.exp(-2j*np.pi*k*n/n)
返回np.点(M,x)
def FFT(x):
“”“1D Cooley-Tukey FFT的递归实现”“”
x=np.asarray(x,dtype=float)
N=x.shape[0]
如果N%2>0:
raise VALUERROR(“x的大小必须是2的幂”)

elif N由于实值信号的
fft
在频率上是共轭对称的,因此
rfft
只是输入的完整
fft
的正频率分量

def rDFT_slow(x):
    """Compute the discrete Fourier Transform of the 1D array of real data x"""
    x = np.real(np.asarray(x, dtype=float))
    N = x.shape[0]
    n = np.arange(N)
    k = np.arange(N//2+1).reshape((N//2+1,1))
    M = np.exp(-2j * np.pi * k * n / N)
    return np.dot(M, x)

当你只计算一半的系数时,有一些更棘手的因素会影响到递归版本的实现,但是缓慢的
rDFT
应该让你开始。

rfft
只是输入的完整
fft
的正频率分量,因为实值信号的
fft
在频率上是共轭对称的

def rDFT_slow(x):
    """Compute the discrete Fourier Transform of the 1D array of real data x"""
    x = np.real(np.asarray(x, dtype=float))
    N = x.shape[0]
    n = np.arange(N)
    k = np.arange(N//2+1).reshape((N//2+1,1))
    M = np.exp(-2j * np.pi * k * n / N)
    return np.dot(M, x)

当您只计算一半的系数时,在实现递归版本时会遇到一些更棘手的因素,但是缓慢的
rDFT
应该可以让您开始了。

如何计算这种变换的逆?我尝试使用伪逆,但结果不是很好…@Dave如果你不想使用
np.fft.irfft
,你可以使用
N//2+1
正弦波重构信号,其振幅和相位与变换分量成比例。您可以查看我的答案了解更多详细信息-第二个实现仅使用
rfft
系数。谢谢,非常有用。多亏了你的代码,我制作了一个很好的
ifft
函数。但是我很难计算
irfft
。我试过了,但它返回的正弦值是原来的两倍。你能帮我吗?@Dave当你计算单个正弦信号时,你应该除以
len(x)
(重建信号的长度),而不是
N
(rfft的长度)。@Dave同样,你应该小心:如果原始
len(x)
是奇数,
2*(N-1)!=len(x)
。相反,
2*(N-1)==len(x)-1
。您可以通过检查if
X[-1].real==X[-1]
来修复此问题。如果是,则原始的
len(x)
2*(N-1)
,因为
len(x)
是偶数。如果不是,则原始的
len(x)
2*N-1
,因为
len(x)
是奇数。我如何计算这种变换的逆?我尝试使用伪逆,但结果不是很好…@Dave如果你不想使用
np.fft.irfft
,你可以使用
N//2+1
正弦波重构信号,其振幅和相位与变换分量成比例。您可以查看我的答案了解更多详细信息-第二个实现仅使用
rfft
系数。谢谢,非常有用。多亏了你的代码,我制作了一个很好的
ifft
函数。但是我很难计算
irfft
。我试过了,但它返回的正弦值是原来的两倍。你能帮我吗?@Dave当你计算单个正弦信号时,你应该除以
len(x)
(重建信号的长度),而不是
N
(rfft的长度)。@Dave同样,你应该小心:如果原始
len(x)
是奇数,
2*(N-1)!=len(x)
。相反,
2*(N-1)==len(x)-1
。您可以通过检查if
X[-1].real==X[-1]
来修复此问题。如果是,则原始的
len(x)
2*(N-1)
,因为
len(x)
是偶数。如果没有,则原始的
len(x)
2*N-1
,因为
len(x)
是奇数。