gpt4 book ai didi

python - 与 Python 相比,在 Matlab 中使用 FFT 的结果不同

转载 作者:太空宇宙 更新时间:2023-11-03 15:46:16 33 4
gpt4 key购买 nike

我有包含加速度计数据的时间序列,我想将其集成到速度和位置时间序列中。这是使用 FFT 完成的,但是 Matlab 和 Python 中的两种方法给出了不同的结果。

Matlab代码:

nsamples = length(acc(:,1));
domega = 2*pi/(dt*nsamples);
acchat = fft(acc);

% Make frequency array:
Omega = zeros(nsamples,1);

% Create Omega:
if even(nsamples)
nh = nsamples/2;
Omega(1:nh+1) = domega*(0:nh);
Omega(nh+2:nsamples) = domega*(-nh+1:-1);
else
nh = (nsamples-1)/2;
Omega(1:nh+1) = domega*(0:nh);
Omega(nh+2:nsamples) = domega*(-nh:-1);
end

% High-pass filter:
n_low=floor(2*pi*f_low/domega);
acchat(1:n_low)=0;
acchat(nsamples-n_low+1:nsamples)=0;

% Multiply by omega^2:
acchat(2:nsamples) = -acchat(2:nsamples) ./ Omega(2:nsamples).^2;

% Inverse Fourier transform:
pos = real(ifft(acchat));

% --- End of function ---

Python 代码:

import numpy as np


def acc2velpos(acc, dt):

n = len(acc)

freq = np.fft.fftfreq(n, d=dt)
omegas = 2 * np.pi * freq
omegas = omegas[1:]

# Fast Fourier Transform of Acceleration
accfft = np.array(np.fft.fft(acc, axis=0))

# Integrating the Fast Fourier Transform
velfft = -accfft[1:] / (omegas * 1j)
posfft = accfft[1:] / ((omegas * 1j) ** 2)

velfft = np.array([0] + list(velfft))
posfft = np.array([0] + list(posfft))

# Inverse Fast Fourier Transform back to time domain
vel = np.real(np.fft.ifft(velfft, axis=0))
pos = np.real(np.fft.ifft(posfft, axis=0))

return vel, pos

这两个代码通常应该给出完全相同的结果,但是当我进行比较时,这就是我得到的结果

加速到速度

enter image description here

加速定位

enter image description here

知道为什么 Python 结果与位置中的 Matlab 结果不同吗?获得与我使用这些实验中的加速度测量值来识别驳船运动相同的结果对我来说至关重要。

我还有第二个 Python 版本,我尝试在其中包含 Matlab 代码中的过滤器。这也会给出不同的结果,很像 Python 中没有过滤器的结果。

def acc2vel2(acc, dt, flow):

nsamples = len(acc)
domega = (2*np.pi) / (dt*nsamples)
acchat = np.fft.fft(acc)

# Make Freq. Array
Omega = np.zeros(nsamples)

# Create Omega:
if nsamples % 2 == 0:
nh = int(nsamples/2)
Omega[:nh] = domega * np.array(range(0, nh))
Omega[nh:] = domega * np.array(range(-nh-1, -1))

else:
nh = int((nsamples - 1)/2)
Omega[:nh] = domega * np.array(range(0, nh))
Omega[nh:] = domega * np.array(range(-nh-2, -1))

# High-pass filter
n_low = int(np.floor((2*np.pi*flow)/domega))
acchat[:n_low - 1] = 0
acchat[nsamples - n_low:] = 0

# Divide by omega
acchat[1:] = -acchat[1:] / Omega[1:]

# Inverse FFT
vel = np.imag(np.fft.ifft(acchat))

return vel

这仍然与 Matlab 代码有点不同。有什么建议吗?

最佳答案

看起来你在 matlab 代码中有一个高通滤波器,而不是在 python 代码中。考虑到您的 python 和 matlab 位置结果之间的差异,这是有道理的。

你的 python 位置波出现低频上下震荡,说明频域中的一些低频成分没有被过滤掉。您的 matlab 代码中的高通滤波器去除了低频分量。

关于python - 与 Python 相比,在 Matlab 中使用 FFT 的结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49752134/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com