具有负 fft 值的傅里叶变换和滤波频率

Fourier transform and filtering frequencies with negative fft values

我正在寻找周期信号中最丰富的频率。 我想了解如果我对周期信号执行傅里叶变换并过滤具有负 fft 值的频率,我会得到什么。

换句话说,图 2 和图 3(见下文)的轴表达了什么?我在 fft-transformed 信号上绘制频率 (cycles/second) - y 轴上的负值是什么意思,我只对那些感兴趣是否有意义?

import numpy as np
import scipy

# generate data
time = scipy.linspace(0,120,4000)
acc = lambda t: 10*scipy.sin(2*pi*2.0*t) + 5*scipy.sin(2*pi*8.0*t) + 2*scipy.random.random(len(t))
signal = acc(time)

# get frequencies from decomposed fft
W =  np.fft.fftfreq(signal.size, d=time[1]-time[0])
f_signal = np.fft.fft(signal)

# filter signal
# I'm getting only the "negative" part!
cut_f_signal = f_signal.copy()
# filter noisy frequencies
cut_f_signal[(W < 8.0)] = 0
cut_f_signal[(W > 8.2)] = 0

# inverse fourier to get filtered frequency
cut_signal = np.fft.ifft(cut_f_signal)

# plot
plt.subplot(221)
plt.plot(time,signal)
plt.subplot(222)
plt.plot(W, f_signal)
plt.subplot(223)
plt.plot(W, cut_f_signal)
plt.subplot(224)
plt.plot(time, cut_signal)
plt.show()

实值输入信号的 FFT 将产生共轭对称结果。 (这就是数学最有效的方式。)因此,对于仅真实数据的 FFT 结果幅度,负频率只是正频率的镜像副本,因此在分析结果时可以忽略。

但是,如果您想进行逆运算并计算 IFFT,则需要为 IFFT 提供频率数据的共轭对称负半部分(或上半部分,高于 Fs/2),否则您的 IFFT result 最终会产生一个复杂的结果(例如,具有非零虚数 (sqrt(-1)) 分量,这在处理基带实数据时很少有人想要)。

如果您想过滤 FFT 数据并最终得到 IFFT 的真实结果,您将需要对正频率和负频率进行相同的对称过滤以保持所需的对称性。

FFT 还产生一个复数结果,其中每个结果 bin 的分量(实部和虚部)的值和符号表示相位以及分量基向量(复正弦曲线或实余弦加)的幅度实正弦分量)。如果相同的结果为正,则任何负值仅代表相位旋转。

正如@hotpaw2 在他上面的评论中所写的那样,对时域中的实际信号执行 FFT 的结果会在频域中生成复数值。

您的 plot 命令的输入值 f_signal 是一个复数向量。

plt.subplot(222)
plt.plot(W, f_signal)

这会导致无意义的输出。 您应该绘制 f_signal 的绝对值。 如果您对相位感兴趣,您也应该绘制角度。 在 Matlab 中,这看起来像这样:

% Plot the absolute values of f_signal
plot(W, abs(f_signal));
% Plot the phase of f_signal
plot(W, (unwrap(angle(f_signal)));