Удаление признаков, подобных Sinc, с помощью БПФPython

Программы на Python
Ответить
Anonymous
 Удаление признаков, подобных Sinc, с помощью БПФ

Сообщение Anonymous »

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

Здесь вы можете увидеть два набора пиков, которые меня интересуют, с аннотациями правильного набора. Основные «вибрационные» пики (синие) я хочу сохранить, а сопутствующие «вращательные» пики (красные) хочу удалить с помощью какого-нибудь фильтра. Также существует вероятность появления других вибрационных пиков (зеленых) среди вращательных пиков, которые я также хочу сохранить.
Что я пробовал
Моя идея состоит в том, что, поскольку пики вращения имеют регулярную частоту, подобную функции 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
Вот ссылка Pastebin на пример спектра: https://pastebin.com/HHuJJXxL
Я буду рад прояснить что-нибудь, если это необходимо. оказаться необходимым. Буду очень признателен за любые отзывы, критику и предложения по улучшению этого метода!

Подробнее здесь: https://stackoverflow.com/questions/792 ... ith-an-fft
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»