[英]What is numpy.fft.rfft and numpy.fft.irfft and its equivalent code in MATLAB
[英]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.