function out = irfft(x, even)
if nargin == 1
even = true;
end
% `n`: the output length
% `s`: the variable that will hold the index of the highest
% frequency below N/2, s = floor((n+1)/2)
N = numel(x); % function assumes 1D input
if even
n = 2 * (N - 1);
s = N - 1;
else
n = 2 * (N - 1) + 1;
s = N;
end
outf = zeros(1, n);
outf(1:N) = x;
outf(N+1:n) = conj(x(s:-1:2));
out = ifft(outf);
end
1条答案
按热度按时间hk8txs481#
numpy中的真实的FFT使用了这样一个事实,即真实的值函数的傅立叶变换是“斜对称”的,也就是说,频率
k
处的值是频率N-k
处的值对于k=1..N-1
的复共轭(正确的项是 Hermitian)。因此rfft
只返回对应于非正频率的结果部分。对于大小为
N
的输入,rfft
函数返回FFT输出中对应于N/2
或以下频率的部分。因此,如果N
是偶数(所有频率从0
到N/2
),则rfft
的输出大小为N/2+1
,或者如果N
是奇数(所有频率从0到(N-1)/2
),则(N+1)/2
。注意,函数floor(n/2+1)
对于偶数和奇数输入大小都返回正确的输出大小。在matlab中实现
rfft
例如
将产生
现在将其与python进行比较
复制irfft
要重现
irfft
的基本功能,您需要从rfft
输出中恢复丢失的频率。如果所需的输出长度是偶数,则输出长度可以从输入长度计算为2 (m - 1)
。否则应该是2 (m - 1) + 1
。下面的代码将工作。
现在你应该
并且还
对于奇数输出长度,