首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >似乎频率错误的Python频率滤波

似乎频率错误的Python频率滤波
EN

Stack Overflow用户
提问于 2018-05-06 16:54:18
回答 1查看 296关注 0票数 2

下面的脚本通过切割所有大于6的频率来过滤频率。然而,fftfreq并没有使用看似正确的函数fftfreq

据我所知,rfftfreq应该与rfft一起使用。为什么这段代码在使用fftfreqrfft时仍能工作?

代码语言:javascript
复制
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):

代码语言:javascript
复制
[0, 1/n, 1/n, 2/n, 2/n ... n/(2n), n/(2n)]

但是,此代码与fftfreq一起工作,其中函数的输出是

代码语言:javascript
复制
[0, 1/n, ... n/(2n), -n/(2n), ..., -1/n]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-07 09:13:16

你把原始信号中的频率写错了。

根据这个方程(来自维基百科),正弦波被参数化:

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

代码语言:javascript
复制
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。

这是正确的代码:

代码语言:javascript
复制
signal = np.cos(5 * 2*np.pi * time) + np.cos(7 * 2*np.pi * time)
W = rfftfreq(signal.size, d=time[1]-time[0])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50202239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档