Python 什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLAB中的等效代码
我正在将一个python代码转换为MATLAB,其中一个代码使用numpy rfft。在numpy的文档中,它表示实际输入 计算实际输入的一维离散傅里叶变换 所以我在MATLAB中所做的是使用abs,但结果不同 Python代码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的复共轭项(正确的术语是
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
的目的是什么?@iHateUniirfft(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