Как рассчитать БПФ временного ряда в трехмерном пространстве (X, Y, T) - PullRequest
0 голосов
/ 25 марта 2020

Временной ряд (x, y, t) в трехмерном пространстве (X, Y, T) удовлетворяет:

x(t) = f1(t), y(t) = f2(t),

where t = 1, 2, 3,....

Другими словами, координаты (x, y) меняются в зависимости от отметки времени t. Легко вычислить БПФ для x (t) или y (t), но как рассчитать БПФ для (x, y)? Я предполагаю, что это НЕ должно быть вычислено как 2D-FFT, потому что это для изображения, тогда как (x, y) это просто серия. Любое предложение? Спасибо.

1 Ответ

1 голос
/ 01 апреля 2020

использовать

fftn

, например: Y = fftn(X) возвращает многомерное преобразование Фурье массива ND, используя алгоритм быстрого преобразования Фурье. Преобразование ND эквивалентно вычислению одномерного преобразования по каждому измерению X. Выходной Y имеет тот же размер, что и X. Для трехмерного преобразования: создайте трехмерный сигнал X. Размер X равен 20 -20 на 20

x = (1:20)';
y = 1:20;
z = reshape(1:20,[1 1 20]);
X = cos(2*pi*0.01*x) + sin(2*pi*0.02*y) + cos(2*pi*0.03*z);

Вычисляет трехмерное преобразование Фурье для сигнала, который также является массивом 20 на 20 на 20

Y = fftn(X)

Pad X с нулями для вычисления преобразования 32 на 32 на 32.

m = nextpow2(20);
Y = fftn(X,[2^m 2^m 2^m]);
size(Y)

также вы можете использовать этот код: first Вы можете использовать SINGLE intead of DOUBLE

psi = single(psi);
fftpsi = fft(psi,[],3);

Далее может работать слайд за слайдом

psi=rand(10,10,10);
% costly way
fftpsi=fftn(psi);
% This might save you some RAM, to be tested
[m,n,p] = size(psi);
for k=1:p
    psi(:,:,k) = fftn(psi(:,:,k)); 
end
psi = reshape(psi,[m*n p]);
for i=1:m*n % you might work on bigger row-block to increase speed
    psi(i,:) = fft(psi(i,:));
end
psi = reshape(psi,[m n p]);
% Check
norm(psi(:)-fftpsi(:))

Надеюсь, это будет полезно для вас

...