我有一些拉曼光谱数据,其中包含我想要删除的特征。我会在下图中指出它们:
在这里您可以看到我感兴趣的两组峰值,并注释了正确的一组。我想保留主要的“振动”峰值(蓝色),以及我想用某种过滤器删除的伴随“旋转”峰值(红色)。在我也想保留的旋转峰中,也有可能出现其他振动峰(绿色)。
我的想法是,因为旋转峰值似乎具有类似于 sinc 函数的规则频率,所以我可以通过进行 FFT、删除相关频率并使用 IFFT 检索滤波后的频谱来删除它们。
该图显示了上图中注释的区域的裁剪。希望人物图例很清楚,但我会指出一些关键的事情:
正如您所看到的,我的过滤尝试并不完美,但是 LPF 和 IFFT 的结果似乎确实在重建旋转峰值而不是振动峰值以及感兴趣的峰值(在第一个图中用绿色圈出)方面做得相当不错) 变得更加突出。
我所看到的主要问题是:
我将发布一个代码片段,说明我如何应用过滤器:
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
如果有必要的话,我很乐意澄清任何事情。我非常感谢任何有关如何改进此方法的反馈、批评或建议!
它作为模型拟合问题引起了我的兴趣,因此我处理了 600 到 900 区域附近的频谱。无论形状是什么,它都不能合理地描述为原点为双倍宽度的 sinc 函数。旋转模式在原点处为零。
我认为对围绕中心频率通道 X0 的这种不需要的旋转峰值频谱进行建模的正确经验函数形式大致如下(我的量子力学相当生疏)。
f(x) = A+B*abs(x-X0)*exp(-(x-X0)^2/C)*sin((x-X0)*D)
对于主峰并且仅到最近的通道,我在通道
2.018705692941782763e+041
中获得最大值 asx0 = 707
。
拟合的模型参数是近似的,但足够精确,可以显示主峰两侧峰轮廓的不对称性。
顺便说一句,没有尝试删除基线。
参数 | 低端 | 高边 |
---|---|---|
A | 800 | 790 |
B | 11 | 15 |
C | 950 | 1000 |
D | 0.49 | 0.51 |
这些值只是一个起始指南,您必须使用最小二乘法将它们正确地拟合到局部频谱以及基线去除。我已经安装到远离拉曼区域的机翼上。对高侧配合并不完全满意,但可能也相差不远。
高侧峰值拟合需要额外的工作。 主峰附近是否有拉曼散射的干扰?