【问题标题】:How to prevent oversmoothing while applying fft to raw signal [closed]如何在将fft应用于原始信号时防止过度平滑[关闭]
【发布时间】:2021-07-24 03:11:11
【问题描述】:

我正在尝试使用 fft 来消除信号中的噪声。在这样做的同时,我得到了像 thisfreq_domain 这样的频域:

因此,当对信号的峰值频率应用黄油通滤波器时,会像这个原始图像一样过度平滑:

应用butter pass filter后的图像:

所以我被困在这个问题上,想找出减少信号过度平滑的解决方案

for i in range(data_first_interval.shape[0]):         
       ppgwave=data_first_interval.loc[i]        
       ppg_fit=fftpack.fft(np.array(ppgwave))        
       ppgarr=np.array(ppgwave)        
       amp=2 / time_vec.size*np.abs(ppg_fit)        
       sample_freq=fftpack.fftfreq(2100,0.001)        
       signal_amplitude = pd.Series(amp).nlargest(2).round(0).astype(int).tolist()    
       magnitudes = abs(ppg_fit[np.where(sample_freq >= 0)])    
       #Get index of top 2 frequencies\    
       peak_frequency = np.sort((np.argpartition(magnitudes, -2)[-2:])/2.1)    
       cutoff = peak_frequency[1]    
       y = butter_lowpass_filter(ppgarr, cutoff, fs, order)     
       data_first_interval.loc[i]=y

我的黄油低通滤波器定义如下

fs = 1000.0           
order = 2          
def butter_lowpass_filter(data, cutoff, fs, order):    
   print("Cutoff freq " + str(cutoff))    
   nyq = 0.5 * fs # Nyquist Frequency    
   normal_cutoff = cutoff / nyq    
   # Get the filter coefficients     
   b, a = butter(order, normal_cutoff, btype='low', analog=False)    
   y = filtfilt(b, a,data)    
   return y 

谁能帮我看看哪里出错了

【问题讨论】:

  • 我投票结束这个问题,因为它与help center 中定义的编程无关,而是关于信号处理理论/方法。

标签: python signal-processing fft noise-reduction


【解决方案1】:

通常产生“较少平滑”的方式是提高截止频率。

使用平滑过滤器,您可以使用两个参数:

  • 截止:较高的截止产生较少的平滑;较低的截止产生更多的平滑。

  • 阶数(与“滚降”有关):阶数越高,低频失真越小,但可能会导致振铃。较低阶的振铃较少,但可能会使截止频率以下的频率失真。这也可能表现为过度平滑。

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 2020-05-29
    • 2018-10-26
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2017-01-26
    • 1970-01-01
    相关资源
    最近更新 更多