繁体   English   中英

为什么 numpy.fft.rfft/irfft 转换不带回输入?

[英]Why numpy.fft.rfft/irfft transforms do not bring the input back?

我有一个列表,当我通过 np.fft.rfft 对其进行转换并通过 np.fft.irfft 将其恢复时,它不适用于 ex(2),但适用于 ex(1)。 我应该怎么做才能使它与 ex(2) 一起工作?

例如(1):

import NumPy as np
z=[[1,2,34,45],[1,2,5,6],[7,8,9,10]]
x1=np.fft.rfft(z)
x2=np.fft.irfft(x1)
print(x2)
print(z)

出去:

[[ 1.  2. 34. 45.]
 [ 1.  2.  5.  6.]
 [ 7.  8.  9. 10.]]

[[1, 2, 34, 45], [1, 2, 5, 6], [7, 8, 9, 10]]

例如(2):

import NumPy as np
z1=[[5,8,6],[45,6,3],[847,5847,6]]
x3=np.fft.rfft(z1)
x4=np.fft.irfft(x3)
print(x4)
print(z1)

出去:

[[   8.5    10.5 ]
 [  47.25    6.75]
 [2310.25 4389.75]]

[[5, 8, 6], [45, 6, 3], [847, 5847, 6]]

请帮忙。

这不是错误,而是np.rfft对于奇数长度输入的预期行为:

截断或补零的输入,沿轴指示的轴转换,如果未指定轴,则为最后一个。 如果 n 是偶数,则变换轴的长度为 (n/2)+1。 如果 n 为奇数,则长度为 (n+1)/2。

这是Nyquist-Shannon 采样定理的结果。

为了解决这个问题,如果有奇数列(zero-padding ),您可以通过在np.rfft调用中指定适当的n kwarg 来简单地在z1的每一行的末尾添加一个零,它给出:

import numpy as np
z1 = np.array([[5,8,6],[45,6,3],[847,5847,6]])

n = z1.shape[1]
if n%2:
    # zero padding if n odd 
    n += 1
x3 = np.fft.rfft(z1,n,axis=-1)
x4 = np.fft.irfft(x3)

它给出了初始输入:

print(x4)
>>>[[5.000e+00 8.000e+00 6.000e+00 0.000e+00]
    [4.500e+01 6.000e+00 3.000e+00 0.000e+00]
    [8.470e+02 5.847e+03 6.000e+00 0.000e+00]]
print(z1)
>>>[[   5    8    6]
    [  45    6    3]
    [ 847 5847    6]]

从频域返回后,随意丢弃x4的最后一列零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM