У меня есть некоторые данные рамановской спектроскопии, содержащие особенности, которые я хочу удалить. Я укажу их на рисунке ниже:

Здесь вы можете увидеть два набора пиков, которые меня интересуют, с аннотациями правильного набора. Основные «вибрационные» пики (синие) я хочу сохранить, а сопутствующие «вращательные» пики (красные) хочу удалить с помощью какого-нибудь фильтра. Также существует вероятность появления других вибрационных пиков (зеленых) среди вращательных пиков, которые я также хочу сохранить.
Что я пробовал
Моя идея состоит в том, что, поскольку пики вращения имеют регулярную частоту, подобную функции sinc, я могу удалить их, взяв БПФ, удалив связанные частоты и получив отфильтрованный спектр с помощью ОБПФ.
Здесь это результат моей попытки:

На этом рисунке показан урожай региона, указанного на предыдущем рисунке. Надеюсь, подписи к рисункам понятны, но я укажу на некоторые ключевые моменты:
- Сначала я вычел минимальное значение для обрезанной области, чтобы ускорить процесс фильтрации. проще
- Я использовал фильтр нижних частот (ФНЧ), чтобы удалить гауссову форму из БПФ (внизу; красный) исходного спектра (вверху; черный), чтобы получить фильтрованное БПФ (внизу; зеленый)
- Я выполняю ОБПФ на отфильтрованном БПФ, чтобы получить спектр, содержащий мои вращательные пики (вверху; зеленый), а затем вычитаю его из исходного спектра, чтобы получить отфильтрованный результат (вверху) ; пурпурный).

Мысли/Наблюдения
Как вы можете видеть мою фильтрацию попытка не идеальна, однако результат ФНЧ и ОБПФ, по-видимому, действительно неплохо воссоздает вращательные пики, а не вибрационные пики, а интересующий пик (обведен зеленым на первом рисунке) становится более заметный.
Основные проблемы, которые я вижу:
- ФНЧ не идеально соответствует гауссову -подобная форма (хотя я не решаюсь точно настроить это значение, так как тогда процесс потеряет некоторую обобщаемость), это привело к тому, что пики вращения не были полностью удалены.
- Отфильтрованный спектр похоже, добавил легкую синусоидальную волну в фильтруемых областях, что Я примерно прокомментировал
- Интенсивность левой отфильтрованной области в целом ниже, чем раньше, что можно легко исправить с помощью дополнительного шага впоследствии, но я думаю, что это может оказаться ненужным с некоторыми улучшениями процесс фильтрации
Я опубликую фрагмент кода о том, как я применил фильтр :
Код: Выделить всё
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
Я буду рад прояснить что-нибудь, если это необходимо. оказаться необходимым. Буду очень признателен за любые отзывы, критику и предложения по улучшению этого метода!
Подробнее здесь: https://stackoverflow.com/questions/792 ... ith-an-fft
Мобильная версия