Отфильтруйте сигнал ЭКГ с помощью вейвлета

Я работаю с сигналом ЭКГ и хочу удалить дрейфовый шум. В Matlab отлично работает этот код:

[c, l]=wavedec(ecgsignal,8,'coif5'); 
a9=wrcoef('a',c,l,'coif5',8);

где ecgsignal — исходный сигнал с шумом, а a9 — отфильтрованный сигнал. Я пытаюсь сделать то же самое в python с помощью этого кода:

coeffs=pywt.wavedec(ecgsignal,'coif5', level=8)
renc=pywt.waverec(coeffs, 'coif5')

но восстановленный сигнал renc содержит шум. Может ли кто-нибудь помочь мне понять, что не так? Я использую неправильные команды библиотеки PyWavelet?


person Giuseppe Ricci    schedule 24.08.2015    source источник
comment
Похоже, вы вводите все разложенные коэффициенты в реконструирующую функцию.   -  person Andy Kubiak    schedule 24.08.2015
comment
Я собирался прокомментировать то же самое. Я не привык работать с вейвлетами, только с БПФ, но кажется, что вы должны восстанавливать сигнал только с несколькими выбранными коэффициентами, а не со всеми.   -  person Rafael Monteiro    schedule 24.08.2015
comment
В качестве примера документации PyWavelet: coeffs = pywt.wavedec([1,2,3,4,5,6,7,8], 'db2', level=2) print pywt.waverec(coeffs, 'db2 ') он оценивает все коэффициенты.   -  person Giuseppe Ricci    schedule 24.08.2015
comment
@GiuseppeRicci документация показывает, что две функции, wavedec и waverec, полностью обратны друг другу.   -  person Andy Kubiak    schedule 24.08.2015
comment
@AndyKubiak в Matlab то же самое? Почему эти инструкции не работают в python?   -  person Giuseppe Ricci    schedule 26.08.2015


Ответы (2)


Вы просто деконструируете сигнал, а затем восстанавливаете сигнал. Вы не выполнили ключевой этап пороговой обработки, который фактически выполняет фильтрацию сигнала, которую вы ищете.

Базовый план необходимых шагов набросал в python:

// DWT
coeffs = pywt.wavedec(ecgsignal,'coif5', level=8); 
// Compute threshold something like this.  You need an estimate
// of the noise sigma.
threshold=noiseSigma*sqrt(2*log2(ecgsignal.size)); 
// Apply the threshold.  Pseudocode here.
newcoeffs = pywt.thresholding.soft( coeffs , threshold);
// IDWT
renc = pywt.wavedec(newcoeffs , 'coif5');              
person Paul    schedule 16.11.2015

В настоящее время pywt еще не реализовал функцию, эквивалентную wrcoef. Но вы по-прежнему можете разлагать одномерный многоуровневый сигнал, а затем восстанавливать его компоненты по отдельности.

https://stackoverflow.com/a/47591523/2845274

person Thai HQ    schedule 01.12.2017