Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLAB中的等效代码_Python_Matlab_Numpy_Fft - Fatal编程技术网

Python 什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLAB中的等效代码

Python 什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLAB中的等效代码,python,matlab,numpy,fft,Python,Matlab,Numpy,Fft,我正在将一个python代码转换为MATLAB,其中一个代码使用numpy rfft。在numpy的文档中,它表示实际输入 计算实际输入的一维离散傅里叶变换 所以我在MATLAB中所做的是使用abs,但结果不同 Python代码 ffta = np.fft.rfft(a) MATLAB代码 ffta = abs(fft(a)); 我误解了什么 numpy中的实FFT使用实值函数的傅里叶变换可以说是“斜对称”的事实,即频率k处的值是频率N-k处的值对于k=1..N-1的复共轭项(正确的术语是

我正在将一个python代码转换为MATLAB,其中一个代码使用numpy rfft。在numpy的文档中,它表示实际输入

计算实际输入的一维离散傅里叶变换

所以我在MATLAB中所做的是使用abs,但结果不同

Python代码

ffta = np.fft.rfft(a) 
MATLAB代码

ffta = abs(fft(a));

我误解了什么

numpy中的实FFT使用实值函数的傅里叶变换可以说是“斜对称”的事实,即频率
k
处的值是频率
N-k
处的值对于
k=1..N-1
的复共轭项(正确的术语是厄米特)。因此,
rfft
只返回结果中与非正频率对应的部分

对于大小为
N
的输入,
rfft
函数返回与小于等于
N/2
的频率对应的FFT输出部分。因此,如果
N
为偶数(所有频率从
0
N/2
),则
rfft
的输出大小为
N/2+1
,如果
N
为奇数(所有频率从0到
(N-1)/2
)。注意功能
floor(n/2+1)
返回正确的偶数和奇数输入大小的输出大小

因此,要在matlab中重现
rfft

function rfft = rfft(a)
     ffta = fft(a);
     rfft = ffta(1:(floor(length(ffta)/2)+1));
end
比如说

a = [1,1,1,1,-1,-1,-1,-1];
rffta = rfft(a)
会产生

rffta =

 Columns 1 through 3:

   0.00000 + 0.00000i   2.00000 - 4.82843i   0.00000 + 0.00000i   

 Columns 4 through 5:

   2.00000 - 0.82843i   0.00000 + 0.00000i
现在将其与python进行比较

>>> np.fft.rfft(a)
array([ 0.+0.j        ,  2.-4.82842712j,  0.-0.j        ,  
        2.-0.82842712j,  0.+0.j        ])
再生irfft 要再现
irfft
的基本功能,需要从
rfft
输出中恢复丢失的频率。如果所需的输出长度为偶数,则可以根据输入长度计算输出长度,如
2(m-1)
。否则它应该是
2(m-1)+1

下面的代码可以工作

函数irfft=irfft(x,偶数=true)
n=0;%输出长度
s=0;%将保存最高值的索引的变量
%低于N/2的频率,s=楼层((N+1)/2)
如果(偶数)
n=2*(长度(x)-1);
s=长度(x)-1;
其他的
n=2*(长度(x)-1)+1;
s=长度(x);
恩迪夫
xn=零(1,n);
xn(1:长度(x))=x;
xn(长度(x)+1:n)=conj(x(s:-1:2));
irfft=ifft(xn);
结束
现在你应该

>> irfft(rfft(a))
ans =

   1.00000   1.00000   1.00000   1.00000  -1.00000  -1.00000  -1.00000  -1.00000
而且

abs( irfft(rfft(a)) - a ) < 1e-15

谢谢,现在可以用了。我还想重现
irfft
,我使用了2*(m-1),但它显示索引超过了矩阵维数。我应该把它放在一个新的话题上吗<代码>函数irfft=irfft(a)
iffta=ifft(a)
irfft=iffta(1:(2*(长度(iffta)-1))
end
如果不是为了数值精度,那么
-a
<1e-15
的目的是什么?@iHateUni
irfft(rfft(a))
应该等于
a
。因此,
abs(x-y)<1e-15
意味着
x
几乎等于
y
直到一些双精度数字的累积舍入误差。Dmitri,这个代码对奇数长度输入不起作用,对吗?你能为rfft调整一下它吗,它必须是
rfft=ffta(1:((长度(ffta)+1)/2));
:)
>> irfft(rfft(a(1:7)),even=false)
ans =

   1.0000   1.0000   1.0000   1.0000  -1.0000  -1.0000  -1.0000