具有负 fft 值的傅里叶变换和滤波频率
Posted
技术标签:
【中文标题】具有负 fft 值的傅里叶变换和滤波频率【英文标题】:Fourier transform and filtering frequencies with negative fft values 【发布时间】:2015-01-21 11:24:02 【问题描述】:我正在寻找周期性信号中最丰富的频率。 我试图了解如果我对周期性信号执行傅立叶变换并过滤具有负 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()
【问题讨论】:
顺便说一句,频域中的矩形滤波器(将 bin 归零)是一种非常嘈杂的非平坦滤波器,可能会产生大量纹波和振铃。 【参考方案1】:实值输入信号的 FFT 将产生共轭对称结果。 (这只是数学上最有效的方式。)因此,对于仅真实数据的 FFT 结果幅度,负频率只是正频率的镜像副本,因此在分析结果时可以忽略。
但是,如果您想进行逆运算并计算 IFFT,则需要向 IFFT 提供频率数据的共轭对称负半部分(或上半部分,高于 Fs/2),否则您的 IFFT 结果将结束产生一个复杂的结果(例如,具有非零虚数 (sqrt(-1)) 分量,在处理基带实际数据时很少需要这种结果)。
如果您想要过滤 FFT 数据并最终从 IFFT 中获得真实结果,则需要对称地过滤正负频率以保持所需的对称性。
FFT 还会产生一个复数结果,其中每个结果箱的分量(实部和虚部)的值和符号表示分量基向量(复正弦或实余弦加实正弦)的相位和幅度组件)。如果相同的结果为正,任何负值都表示相位旋转。
【讨论】:
感谢您的输入,但是,我的问题不是关于负频率值(这是正频率值的镜像) - 在我的 x 轴示例中,而是关于负频率值来自 FFT 的 y 轴 - 它们是什么意思? 关于已签名复数 FFT 结果的答案已更新。 也感谢关于对称过滤噪声的提示【参考方案2】:正如@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)));
【讨论】:
以上是关于具有负 fft 值的傅里叶变换和滤波频率的主要内容,如果未能解决你的问题,请参考以下文章