Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的频带通?_Python_Python 2.7_Filter_Fft - Fatal编程技术网

python中的频带通?

python中的频带通?,python,python-2.7,filter,fft,Python,Python 2.7,Filter,Fft,我想过滤掉不需要的频率,只保留60Hz的信号 以下是我迄今为止所做的工作: import numpy as np from scipy.fftpack import rfft, irfft, fftfreq # time = np.linspace(0,1,1000) in_sig = np.cos(54*np.pi*time) + np.cos(60*np.pi*time) + np.sin(66*np.pi*time); high_freq = 62; low_freq = 58;

我想过滤掉不需要的频率,只保留60Hz的信号

以下是我迄今为止所做的工作:

import numpy as np
from scipy.fftpack import rfft, irfft, fftfreq
#
time   = np.linspace(0,1,1000)

in_sig = np.cos(54*np.pi*time) + np.cos(60*np.pi*time)  + np.sin(66*np.pi*time);
high_freq = 62;
low_freq = 58;

freqs = fftfreq(len(in_sig), d=time[1]-time[0])
filt_sig = rfft(in_sig)

cut_filt_sig = filt_sig.copy()
cut_filt_sig[(freqs<low_freq)] = 0
cut_filt_sig[(freqs>high_freq)] = 0

cut_in_sig = irfft(cut_filt_sig)

from pylab import *
figure(figsize=(10, 6))
subplot(221);plot(time,in_sig); title('Input signal');
subplot(222);plot(freqs,filt_sig);xlim(0,100);title('FFT of the input signal');

subplot(223);plot(time,cut_in_sig); title('Filtered signal');
xlabel('Time (s)')
subplot(224);plot(freqs,cut_filt_sig);xlim(0,100); title('FFT of the filtered signal');
xlabel('Freq. (Hz)')

show()
将numpy导入为np
从scipy.fftpack导入rfft、irfft、fftfreq
#
时间=np.linspace(0,11000)
in_sig=np.cos(54*np.pi*时间)+np.cos(60*np.pi*时间)+np.sin(66*np.pi*时间);
高频=62;
低频=58;
freqs=fftfreq(len(in_sig),d=时间[1]-时间[0])
过滤信号=rfft(输入信号)
cut_filt_sig=filt_sig.copy()
剪切过滤信号[(频率)]=0
切入信号=irfft(切入滤波信号)
从派拉布进口*
图(figsize=(10,6))
小批(221);绘图(时间,单位为sig);标题(“输入信号”);
子地块(222);绘图(频率、滤波信号);xlim(0100);标题(“输入信号的FFT”);
小批(223);绘图(时间、切入信号);标题(“滤波信号”);
xlabel(“时间”)
小批(224);绘图(频率、剪切过滤信号);xlim(0100);标题(“滤波信号的FFT”);
xlabel(‘频率(Hz)’)
show()


正如我所看到的,滤波后的信号在边缘的振幅较低,我认为这可能是由于应用了矩形窗口。您建议使用什么窗口来改进输出?

问题可能来自numpy。默认模式包括端点
停止
。所以
time
0,1/999,2/999,…,1
。相反,
fft
,将长度
N
的信号处理为在
0,T/N,T(N-1)/N
,从而避免了端点的冗余。 因此,计算出的DFT使用长度为T=1000/999的帧。因此,DFT的频率为k*999/1000,而不是k。由于帧的长度不是信号周期的倍数(1/6s),因此会出现名为的问题

为了避免频谱泄漏,可以通过移除端点将帧的长度缩短为周期的倍数:

time   = np.linspace(0,1,1000,endpoint=False)
它将
时间
返回为0,1/1000,.999/1000,由DFT处理为长度为1的帧,即输入信号周期(1/6s)的倍数

如果帧的长度不是信号周期的倍数,则输入信号可以部分地减轻与帧边缘处的不连续性相关的影响,但是杂散频率仍然存在。 最后,通过将峰值频率估计为其相对于功率密度的平均频率,可以正确计算实际频率。看看我对你的回答

问题可能来自numpy。默认模式包括端点
停止
。所以
time
0,1/999,2/999,…,1
。相反,
fft
,将长度
N
的信号处理为在
0,T/N,T(N-1)/N
,从而避免了端点的冗余。 因此,计算出的DFT使用长度为T=1000/999的帧。因此,DFT的频率为k*999/1000,而不是k。由于帧的长度不是信号周期的倍数(1/6s),因此会出现名为的问题

为了避免频谱泄漏,可以通过移除端点将帧的长度缩短为周期的倍数:

time   = np.linspace(0,1,1000,endpoint=False)
它将
时间
返回为0,1/1000,.999/1000,由DFT处理为长度为1的帧,即输入信号周期(1/6s)的倍数

如果帧的长度不是信号周期的倍数,则输入信号可以部分地减轻与帧边缘处的不连续性相关的影响,但是杂散频率仍然存在。 最后,通过将峰值频率估计为其相对于功率密度的平均频率,可以正确计算实际频率。看看我对你的回答

任何类型的过滤都会产生边缘效果。使用傅里叶域滤波,情况更糟。您需要忽略信号边缘附近的输出。如有必要,抓取一个较长的信号开始。@CrisLuengo,太好了,谢谢你的建议,会推荐其他窗口使用吗?任何类型的过滤都会产生边缘效果。使用傅里叶域滤波,情况更糟。您需要忽略信号边缘附近的输出。如有必要,抓取一个较长的信号开始。@CrisLuengo,太好了,谢谢你的建议,你会推荐其他窗口使用吗?