Python频率过滤,看似错误的频率

时间:2018-05-06 16:54:19

标签: python scipy fft frequency

下面的脚本通过剪切大于6的所有频率来过滤频率。 但是,不使用看似正确的函数rfftfreq,而是使用fftfreq

我的理解rfftfreq应与rfft一起使用。为什么此代码有效但尽管fftfreq使用rfft

import numpy as np
from scipy.fftpack import rfft, irfft, fftfreq

time   = np.linspace(0,10,2000)
signal = np.cos(5*np.pi*time) + np.cos(7*np.pi*time)

W = fftfreq(signal.size, d=time[1]-time[0])
f_signal = rfft(signal)

# If our original signal time was in seconds, this is now in Hz    
cut_f_signal = f_signal.copy()
cut_f_signal[(W<6)] = 0

cut_signal = irfft(cut_f_signal)

背景:rfft给出一个数组,在单独的条目中用真实和想象来排序傅里叶模式。例如[R(0), R(1), I(1), ... R(N/2),I(N/2)] R(n)I(n)分别是傅立叶模式的真实和想象部分。 (假设偶数条目数组)

因此,rfftfreq产生一个与此数组对应的频率数组,例如(假设偶数条目数组和采样间距为1):

[0, 1/n, 1/n, 2/n, 2/n ... n/(2n), n/(2n)]

但是,此代码适用于fftfreq,其中函数的输出为

[0, 1/n, ... n/(2n), -n/(2n), ..., -1/n]

显然,fftfreqrfft一起使用会导致错误的结果,因为频率和FFT分档不匹配。

1 个答案:

答案 0 :(得分:0)

您错误地指定了原始信号中的频率。

根据此等式(来自Wikipedia)参数化正弦波: enter image description here

signal = np.cos(5*np.pi*time) + np.cos(7*np.pi*time)的定义中缺少因子 2 。因此,实际频率

5*pi*t = 2*pi*t * f
f = (5*pi*t) / (2*pi*t) = 5 / 2

7*pi*t = 2*pi*t * f
f = (7*pi*t) / (2*pi*t) = 7 / 2

用语言来说,这两个频率是你认为它们的一半。具有讽刺意味的是,这就是为什么它似乎与fftfreq而不是rfftfreq一起使用。前者覆盖了频率范围的两倍(正负频率),因此补偿了缺失因子2。

这是正确的代码:

signal = np.cos(5 * 2*np.pi * time) + np.cos(7 * 2*np.pi * time)
W = rfftfreq(signal.size, d=time[1]-time[0])