下面的脚本通过切割所有大于6的频率来过滤频率。然而,fftfreq并没有使用看似正确的函数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]显然,当fftfreq和rfft一起使用时,会导致错误的结果,因为频率和FFT桶不匹配。
发布于 2018-05-07 09:13:16
你把原始信号中的频率写错了。
根据这个方程(来自维基百科),正弦波被参数化:

在2的定义中缺少因子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])https://stackoverflow.com/questions/50202239
复制相似问题