php 做fft,什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLA...
numpy中的實際FFT使用這樣的事實:實值函數的傅立葉變換就是說“偏斜對稱”,即頻率k處的值是頻率Nk處k = 1的值的復共軛. N-1(正確的術語是Hermitian).因此,rfft僅返回與非正頻率相對應的結果部分.
對于大小為N的輸入,rfft函數返回對應于N / 2或低于N / 2的頻率的FFT輸出部分.因此,如果N是偶數(所有頻率從0到N / 2),則rfft的輸出大小為N / 2 1,如果N為奇數,則輸出(N 1)/ 2(所有頻率從0到(N-1)/ 2).觀察功能層(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.
以下代碼可行.
function irfft = irfft(x,even=true)
n = 0; % the output length
s = 0; % the variable that will hold the index of the highest
% frequency below N/2, s = floor((n+1)/2)
if (even)
n = 2 * (length(x) - 1 );
s = length(x) - 1;
else
n = 2 * (length(x) - 1 )+1;
s = length(x);
endif
xn = zeros(1,n);
xn(1:length(x)) = x;
xn(length(x)+1:n) = conj(x(s:-1:2));
irfft = ifft(xn);
end
現在你應該有
>> 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(rfft(a(1:7)),even=false)
ans =
1.0000 1.0000 1.0000 1.0000 -1.0000 -1.0000 -1.0000
總結
以上是生活随笔為你收集整理的php 做fft,什么是numpy.fft.rfft和numpy.fft.irfft及其在MATLA...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php读取移动硬盘数据,移动硬盘打不开,
- 下一篇: 微星u盘快捷启动项-(微星u盘快捷启动项