我正在寻找周期性信号中最丰富的频率。 我试图了解如果我对周期信号执行傅里叶变换并滤除具有负fft值的频率,我会得到什么。
换句话说,曲线2和3的轴(见下文)表达了什么?我正在绘制fft变换信号的频率(周期/秒) - 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()
答案 0 :(得分:4)
实值输入信号的FFT将产生共轭对称结果。 (这就是数学运算最佳的方式。)因此,对于仅有实数数据的FFT结果幅度,负频率只是正频率的镜像副本,因此在分析结果时可以忽略。
但是,如果你想做倒数并计算IFFT,你需要给IFFT一个频率数据的共轭对称负半部(或上半部分,高于Fs / 2),否则你的IFFT结果将会结束产生一个复杂的结果(例如,使用非零虚(sqrt(-1))分量,很少在处理基带实数据时想要的。)
如果您想过滤FFT数据并最终获得IFFT的实际结果,则需要对称地过滤正负频率,以保持所需的对称性。
FFT也会产生一个复杂的结果,其中每个结果区的分量(实数和虚数)的值和符号表示分量基矢量的相位和幅度(复正弦,或实余弦加实数正弦)组件)。如果相同的结果为正,则任何负值都表示相位旋转。
答案 1 :(得分:0)
正如@ 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)));