使用 FFT 去除类似 Sinc 的特征

问题描述 投票:0回答:1

概要

我有一些拉曼光谱数据,其中包含我想要删除的特征。我会在下图中指出它们:

enter image description here

在这里您可以看到我感兴趣的两组峰值,并注释了正确的一组。我想保留主要的“振动”峰值(蓝色),以及我想用某种过滤器删除的伴随“旋转”峰值(红色)。在我也想保留的旋转峰中,也有可能出现其他振动峰(绿色)。

我尝试过的事情

我的想法是,因为旋转峰值似乎具有类似于 sinc 函数的规则频率,所以我可以通过进行 FFT、删除相关频率并使用 IFFT 检索滤波后的频谱来删除它们。

这是我尝试的结果: enter image description here

该图显示了上图中注释的区域的裁剪。希望人物图例很清楚,但我会指出一些关键的事情:

  • 我首先减去裁剪区域的最小值,以使过滤过程更简单
  • 我使用低通滤波器 (LPF) 从原始频谱(顶部;黑色)的 FFT(底部;红色)中去除类高斯形状,以生成滤波后的 FFT(底部;绿色)
  • 我对滤波后的 FFT 执行 IFFT,以生成包含旋转峰的频谱(顶部;绿色),然后从原始频谱中减去它以获得滤波结果(顶部;洋红色)。

您可以在下面看到原始光谱和过滤光谱的重叠比较: enter image description here

想法/观察

正如您所看到的,我的过滤尝试并不完美,但是 LPF 和 IFFT 的结果似乎确实在重建旋转峰值而不是振动峰值以及感兴趣的峰值(在第一个图中用绿色圈出)方面做得相当不错) 变得更加突出。

我所看到的主要问题是:

  • LPF 并未完全适合类高斯形状(尽管我对微调该值犹豫不决,因为那样该过程将失去一些通用性),这导致旋转峰值无法完全去除。
  • 滤波后的频谱似乎在滤波后的区域中添加了轻微的正弦波,我已对其进行了粗略注释
  • 左侧过滤区域的强度总体上比以前低,这可以通过之后的额外步骤轻松修复,但我认为通过对过滤过程进行一些改进,这可能是不必要的

代码和数据

我将发布一个代码片段,说明我如何应用过滤器:

import numpy as np
from scipy.fft import fft, fftshift, ifft, ifftshift

# Make a copy of the spectrum
spectrum_filtered = np.copy(spectrum_avg)
# Manually define some regions to be cropped and filtered
crop_regions = [[379, 479], [620, 791]]
for crop_region in crop_regions:
    # Crop the spectrum
    crop_left, crop_right = crop_region
    crop = np.copy(spectrum_avg[crop_left:crop_right])
    
    # Subtract the minimum value
    min_val = np.min(crop)
    crop -= min_val
    
    # FFT
    crop_fft = np.abs(fftshift(fft(crop)))
    
    # Fit the baseline using a low-pass filter
    fit = butter_filter(crop_fft, cutoff=3, fs=crop_fft.size, order=5, btype='lowpass')
    
    # Remove the baseline, then perform an IFFT (this holds the rotational peaks)
    crop_fft_fit = crop_fft - fit
    crop_ifft = np.abs(ifftshift(ifft(crop_fft_fit)))
    
    # Subtract the rotational peaks
    crop_filtered = crop - crop_ifft

    # Replace the cropped region with the filtered spectrum (re-adding the minimum value)
    spectrum_filtered[crop_left:crop_right] = crop_filtered + min_val

这里是示例频谱的 Pastebin 链接:https://pastebin.com/HHuJJXxL

如果有必要的话,我很乐意澄清任何事情。我非常感谢任何有关如何改进此方法的反馈、批评或建议!

python filter fft spectrum
1个回答
0
投票

它作为模型拟合问题引起了我的兴趣,因此我处理了 600 到 900 区域附近的频谱。无论形状是什么,它都不能合理地描述为原点为双倍宽度的 sinc 函数。旋转模式在原点处为零。

我认为对围绕中心频率通道 X0 的这种不需要的旋转峰值频谱进行建模的正确经验函数形式大致如下(我的量子力学相当生疏)。

 f(x) = A+B*abs(x-X0)*exp(-(x-X0)^2/C)*sin((x-X0)*D)

对于主峰并且仅到最近的通道,我在通道

2.018705692941782763e+041
中获得最大值 as
x0 = 707
。 拟合的模型参数是近似的,但足够精确,可以显示主峰两侧峰轮廓的不对称性。

顺便说一句,没有尝试删除基线。

参数 低端 高边
A 800 790
B 11 15
C 950 1000
D 0.49 0.51

这些值只是一个起始指南,您必须使用最小二乘法将它们正确地拟合到局部频谱以及基线去除。我已经安装到远离拉曼区域的机翼上。对高侧配合并不完全满意,但可能也相差不远。 low side model fit high side model fit

高侧峰值拟合需要额外的工作。 主峰附近是否有拉曼散射的干扰?

© www.soinside.com 2019 - 2024. All rights reserved.